• ベストアンサー

エクセルVBA 一番端のセルの求め方について

エクセル2003VBAを使ったプログラミングをしています。 シートにデータが入っていますが途中入っていないセルが多々ある状況です。 このような場合、 1.データの入っている一番したの行の行番号を取り出す方法 2.ある行で一番右側でデータの入っているセルの位置を取り出す方法 はありますでしょうか? データが続いている(空の行等がない)場合は Range("A1").CurrentRegion.rows.Count で出せることはわかっているのですが、違う表のようにデータがあちこちにあるという状況です。 何かいい方法がありましたら教えてください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • izmlz
  • ベストアンサー率55% (67/120)
回答No.4

 ↓は、数式あるいは値が入力されているものを最終セルとして取得します。書式が何か設定されていても、それを最終セルとは認識しません。 >1.データの入っている一番したの行の行番号を取り出す方法 Sub test()  Dim Rng1 As Range  Dim Rng2 As Range    Set Rng1 = Cells    With Rng1   Set Rng2 = .Find(What:="*", after:=.Cells(1), LookIn:=xlFormulas, _   Searchorder:=xlByRows, SearchDirection:=xlPrevious)  End With  If Not Rng2 Is Nothing Then   MsgBox "データの入っている一番したの行の行番号は" & Rng2.Row & "です。"  Else   MsgBox "データが何も入力されていません。"  End If End Sub >2.ある行で一番右側でデータの入っているセルの位置を取り出す方法 Sub test2()  Dim Rng1 As Range  Dim Rng2 As Range    Set Rng1 = Rows(5)  With Rng1   Set Rng2 = .Find(What:="*", after:=.Cells(1), LookIn:=xlFormulas, _   Searchorder:=xlByRows, SearchDirection:=xlPrevious)  End With  If Not Rng2 Is Nothing Then   MsgBox Rng1.Row & "行で一番右側でデータの入っているセルの位置は" & Rng2.Column & "列目です。"  Else   MsgBox "データが何も入力されていません。"  End If  End Sub

参考URL:
http://www2.odn.ne.jp/excel/waza/macro.html

その他の回答 (4)

  • izmlz
  • ベストアンサー率55% (67/120)
回答No.5

ANo.4で回答したものです。 ANo.4は補足でおっしゃった↓の二つの条件をクリアしているマクロです。試してみてください。 >書き忘れてしまいましたがセルにはすべて(データの入っていないセルも)罫線が入っています。 >その中で、値が入っているセルもしくは背景色が指定されているセルの末端位置を特定したいのです。 >データがばらばらに入っているためA列の一番下が全体の一番下の行かわからない状態です。 >何列目が一番下の行まで入力されているかわからない状態です。

mentaiko2
質問者

お礼

何度もありがとうございます。 塗りつぶしがあるとそこを一番右下と認識しませんが後はかなりいい感じです。 コレを元に何とかしたいと思います。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

こんなのどうですか。 Sub get_right_bottom_cell() Dim lastcell As Range, rightcell As Range, bottomcell As Range Dim rr As Integer, rc As Integer, rb As Integer, cb As Integer Set lastcell = Selection.SpecialCells(xlCellTypeLastCell) Set rightcell = Range(lastcell.Address).End(xlUp) Set bottomcell = Range(lastcell.Address).End(xlToLeft) ' rr = rightcell.Row ' cr = rightcell.Column ' rb = bottomcell.Row ' cb = bottomcell.Column ' ' Debug.Print rr, cr, rb, cb ' ' MsgBox rightcell.Address & " " & bottomcell.Address Union(rightcell, bottomcell).Select End Sub コメント行は必要なものを選んでください。

mentaiko2
質問者

お礼

ご回答ありがとうございます。 データはこれで取り出せそうです。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.2

以下のコマンドでは Range("B65536").End(xlUp).Activate B列に最後(65536行目)から上移動して空白でない行 Range("IV2").End(xlToLeft).Activate 2列名の最後の列(IV)から左へ移動して空白でない列

mentaiko2
質問者

お礼

ありがとうございました。 ご回答を元に何かよい方法を考えて見ます。

mentaiko2
質問者

補足

ご回答ありがとうございます。 データがばらばらに入っているためA列の一番下が全体の一番下の行かわからない状態です。 何列目が一番下の行まで入力されているかわからない状態です。 また、No1の方の補足にも書きましたが塗りつぶしがあります。 塗りつぶしをやめてもらうべきなのかなあ。 大雑把に今作っているものについて説明すると、着席表のようなものを作っています。 会場がシートそのもので人がいる位置に名前、柱や機材など人がいられないところを塗りつぶし、そのシートを元に色々処理をするというものです。(椅子、機材の場所が決まっていないためデータが飛び飛びになる) 塗りつぶし範囲(無効な場所)が多いため、「無効」「柱」等文字列で入力するのが見づらいし、うざいということで塗りつぶしとなっています。 最大で8000人分入力することもあり罫線をとるのも分りづらいということで却下されています。 何かいい案がありましたらお願いいたします。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1
mentaiko2
質問者

お礼

ありがとうございました。 ご回答を元に何かよい方法を考えて見ます。

mentaiko2
質問者

補足

ご回答ありがとうございます。 UsedRangeプロパティが今回の対象のものと思いますがうまくいきません。 書き忘れてしまいましたがセルにはすべて(データの入っていないセルも)罫線が入っています。 その中で、値が入っているセルもしくは背景色が指定されているセルの末端位置を特定したいのです。 こうなってしまうとやはりすべてのセルの確認をしないといけないのでしょうか? それとも、入力時もVBAを使うことが可能なのでシートにVBAを埋め込んでおいて操作したセルを保存しておくというのが現実的なのでしょうか? よろしくお願いいたします。

関連するQ&A

  • 最終行/処理対象のデータまでを表すVBA

    こんばんは、データの最終行/処理する対象のセルまで処理する場合のVBAの記述について質問させてください!VBAの最終行/処理する対象のセルまで選択するために使用する記述方法が何種類かありますが、そのうち、書籍やネットで検索しても出てこない記述方法について今一つ理解ができていません(T_T) 本屋で売っている書籍やネットで検索すると出てくる記述方法 Range~.End(xlUp).Row Range~.CurrentRegion Range~.SpecialCells(xlLastCell) Range~.Cells(Rows.Count, 1).End(xlUp).Row 上記のようなVBAは書籍やネットで検索すると説明や違いについても出てくるので、説明を読めば理解ができるのですが、 Sheets("テスト").Range("A1:C" & Sheets("テスト").Cells _(1).CurrentRegion.Rows.Count) Range("A1").CurrentRegion.Cells(Range _("A1").CurrentRegion.Cells.Count).Row 上記のようなVBAについては検索しても説明など出てこないうえに、 なぜ上記のような記述になるのかあまり理解できていません(>_<) 書籍やネットで検索すると出てくる「Range~.CurrentRegion」などの記述方法から何となく、CurrentRegionやCells.Countを使わないといけないというのは理解できますが、なぜ「~CurrentRegion.Rows.Count)」はRowsがカッコの中に入っていて、「~CurrentRegion.Cells.Count).Row」はカッコの外に出ているのか??といった細かいことが分からずにいます。。。 半ば丸暗記のようにして使ってしまっているのですが、もし上記のようなVBAについてわかるかたがいらっしゃれば、ご教授いただけるととても嬉しいです! また、上記以外にもまだ検索しても出てこないようなVBAがあるのでしょうか?? 頭が混乱しそうです!(゜Д゜;)

  • EXCELのVBAでデータ範囲の取得方法について

    エクセルのVBAで毎回変動するデータの最終行、列の位置を把握する方法について質問します。 現在、CurrentRegion.Rows(Cols).Countを使ってデータの最終行と列位置を出すようにしているのですが、列位置の数値を列記号(A,B,C)に直す方法がわかりません。どなたか良い方法をご指導願えないでしょうか。もしくは、データ範囲をA1:Y500のように一度に把握する方法があればご指導下さい。

  • エクセルVBAでセル範囲選択→並べ替え

    大きなデータを選択する場合でA列には空白がない場合、 Range("A1").CurrentRegion.Select でいいと思うのですが、このデータを並べ替えようとするとき、1行から4行めには別の文字列がはいっており、5行目以下がデータであるとき、 Range("A1").CurrentRegion.Offset(4).Selectで下にさげると、最終選択範囲も下がってしまいます。 最終の範囲を変えず、開始位置を5行目にかえるにはどうすればよいのでしょうか?

  • エクセルで空白のセルを探して貼り付け

    エクセルVBAでSheet2の指定のセルをコピーして、 Sheet1にある表の中の指定の列の空白セルを探して貼り付けるVBAを作成したいのですが、うまく出来ません。 Sheet1の表は1行目、2行目は見出しの項目が並んでいます。 3行目から50行目までは値を入力するようになっていて、 51行目はそれらをの集計が表示されるようになっています。 下記のVBAを作成したら3行目~50行目までの空欄に貼り付けず、 52行目に貼り付けてしまいます。 ----------------------------------------------------------- Sheets("Sheet2").Range("B6").CurrentRegion.Copy Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Offset(1).PasteSpecial xlPasteValues Application.CutCopyMode = False ------------------------------------------------------------ 修正して頂けないでしょうか? 宜しくお願いします。

  • エクセルのセル高調整で指定したセルから下を調整

    エクセルのセル高調整で指定したセルから下を調整したいのですが。エクセルVBAで下記の方法でやるとすべてのセルがFITします。やりたいことは、3行目以降のセル全体をFITさせたいのです。 どこを追記したら良いか教えて下さい。 Sub セル高調整() 'Sheets("すべて")のセルの高さの調整 Dim lrow As Integer Dim km As Long Application.ScreenUpdating = False '画面の更新を停止 ActiveSheet.Select Range("b3").CurrentRegion.Select Selection.Rows.AutoFit lrow = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row + 1 For km = 1 To lrow Rows(km).RowHeight = Rows(km).RowHeight + 10 Range("a3").Select Next km End Sub

  • Excel VBA セルの選択方法

    こんばんは。 セルの選択方法をお聞きしたいのですが、 SheetAのB2のセルの値を SheetBのリストの最下行(例えば12)からn行目(例えばn=3だったら12行目から15行目)を選択し、SheetAのB2のセルの値を貼り付ける方法を教えてください。 方法は複数あると思うのですが、考えにいきずまってしまいました。 Range("B2").Copy For i = 1 To n Worksheets("Sheet2").Range("b65536").End(xlUp).Offset(1).Select ActiveCell.Parse Selection..Resize(.Rows.Count + [n]).Select それと   Dim cntRow As Integer Dim cntCol As Integer cntRow = Selection.Rows.Count + 1 cntCol = Selection.Columns.Count + 1 Selection.Resize(cntRow, cntCol).Select 上のようなResizeを使って、表(例えばC3~E10)を貼り付けた隣のセル、(例えばB3~B10)のセル番地を取得して、 SheetAのB2のセルの値を貼り付ける方法も教えていただけないでしょうか。 基本的なことをお聞きするようですが、宜しくお願い致します。

  • エクセルVBAについて

    エクセルVBAについて range("B5") = 1行の、選択したセルの値 というようなマクロを作成したいと思っています。 というのも、B5セルの値が、1行で選択したセルの値に変化できればと思っています。 ちなみに下のようなコードを書いてみたのですが、うまくいきません orz Private Sub Worksheet_SelectionChange(ByVal Target As Range) Range("B5") = Rows(1).ActiveCell.Value End Sub 初心者で申し訳ありませんが、よい方法がありましたら、 よろしくお願いいたします。

  • ExcelのVBAにおけるLastRowという言葉

     ExcelのVBAにおいて、「最終行」即ち「(その列において)データが存在しているセルの中で最も下にあるセルの行番号」を取得する必要が生じる事が良くあります。  その様な場合には、Cells(Rows.Count,列番号).End(xlUp).Row か Range(列番号 & Rows.Count).End(xlUp).Row を用いて取得するのが主流ですが、多くの場合、最終行の行番号のデータが必要になるたびに取得しなおすのではなく、最初に取得した最終行の行番号を変数に格納しておき、最終行の行番号のデータが必要な場合はその変数を使って最終行の行番号を指定するのが普通です。  その様な最終行の値を格納する変数を使用する場合、私個人の場合は「何に使用するための変数であるのかという事を解りやすい変数名を用いる」という観点から、「LastRow」という変数名を好んで用いております。  この「LastRow」という変数名はあくまでそのVBAマクロ内だけで使用されるその場限りのものに過ぎない筈です。  しかし、このサイトのExcelのVBAに関する質問を眺めていると、例えば Range(”○○")からLastRowまで ○○セルからLastRowまで といった具合に、「LastRow」という言葉があたかも「『最終行の行番号』や『最終行のセル』を表す"一般名詞"」であるかの様に使用されている質問を時々見かける事があります。  これが「last row」であれば「最後の行」という意味の英語の言葉になりますから間違いとは言えません。  それに対し「LastRow」という単語は少なくとも英語には存在しません。  それにもかかわらず、「LastRow」という言葉が前述の様な一般名詞として使われているという事は、ExcelのVBAにおいて「LastRow」という言葉は、Excelのワークシートを使った処理における「作業列」などと同様のテクニカルタームになっているという事なのでしょうか?

  • VBA AutoFilter 範囲指定

    いつもお世話になっております 過去に https://okwave.jp/qa/q9707059.html にてワークシートのデータをオートフィルターをかけて別なワークシートにデータを取り出す方法を教えて頂きました 送られてくる元データが変更になって、A3セルの上のA2セルの上にテキスト文字が入るようになったので、範囲指定を正しく出来るようにする方法を https://okwave.jp/qa/q9708868.html にて教えて頂きました 今回、https://okwave.jp/qa/q9707059.htmlで教えて頂いたワークシートのコードを実行させると元データが変更になったデータを利用すると、A1セルまで含まれた範囲がAutoFilter の領域と判断される為正しい結果となりません 添付画像のワークシートで Sub test9() Worksheets("Sheet1").Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=Cells(5, "G").Value End Sub を実行させれば、"秋田”でフィルターがきちんとかけれらた状態になります そこで教えて頂いたコードを下記に変更して実行させてみたのですが Dim i As Long With Worksheets("Sheet1") .Range("B4", .Range("B4").End(xlDown)).Copy .Range("G4").PasteSpecial (xlPasteAll) .Range("G4", .Range("G4").End(xlDown)).RemoveDuplicates Columns:=Array(1), Header:=xlNo For i = 4 To .Cells(Rows.Count, "G").End(xlUp).Row Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = .Cells(i, "G").Value .Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value .Cells(3, 1).CurrentRegion.Copy Destination:=Worksheets(.Cells(i, "G").Value).Cells(3, 1) .AutoFilterMode = False Next .Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value 部分で 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです になってしまいます 元データがA2セルにテキスト文字が入った状態でも正常にコード動作させるにはどのようにしたらいいのでしょうか よろしくお願い致します

  • エクセルVBAでセル位置の置き換え

    売上帳をエクセルVBAを使って作っています。 シート自体は、    B    C     D    E 1 日付 顧客NO. 顧客名 品名 2 3 のようになっており、 B列、C列、D列の最終行に入っている値を、その一行下から、E列最終行までのB~D列全部に貼りつけたいのです。 コードは下記のように書いてあります。 Dim 行番号 Dim セル日 Dim セル客 Dim 品名行 Dim 日付行 Dim セル日2 Dim セル日3 Sub 日付と顧客名を貼付() 行番号 = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行の行番号を取得し「行番号」に代入 セル日 = "B" & 行番号 セル客 = "D" & 行番号 Range("セル日:セル客").Copy '日付と顧客番号と顧客名をコピー 品名行 = Cells(Rows.Count, "E").End(xlUp).Row 'E列最終行の行番号を取得し「品名行」に代入 日付行 = Cells(Rows.Count, "B").End(xlUp).Row + 1 'B列最終行の1行下の行番号を取得し「日付行」に代入 セル日2 = "B" & 日付行 セル日3 = "B" & 品名行 Range("セル日2:セル日3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'B列最終行の1行下のB列からD列に値の貼り付け End Sub これを実行すると、 『Range("セル日:セル客").Copy』の部分でエラーがでます。 正しくはどのように書けばよいのでしょうか?

専門家に質問してみよう