VBAでセルの情報を取得する方法

このQ&Aのポイント
  • VBAでセルのオブジェクトが取得できず、セルの情報を取得する方法についての質問です。
  • 現在のコードではセルのオブジェクトを取得することができていません。正しくセルの情報を取得するためには、一部修正が必要です。
  • 具体的には、Worksheetsオブジェクトを使用してセルのオブジェクトを取得し、その後Rangeオブジェクトを使用してセルの範囲を指定する必要があります。
回答を見る
  • ベストアンサー

VBAで、セル(Range)のオブジェクトが取得できない

セルの情報を取得したいのですが、何故か以下のように書くと上手い具合に取得できません(A、B、Cは数値の変数)。 ------ Dim Rng As Range 'セル範囲を格納 Set Rng = Worksheets(1).Range(Cells(A, B), Cells(A, C)) ------ 以下のようにしてやると、何とか取得できます。 Worksheets(lngASNo + 1).Select Set Rng = Range(Cells(A, B), Cells(A, C)) どこが悪いのでしょうか? もし、判る方がいらっしゃいましたら、よろしくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 これをコンテナといいますが、 >Dim Rng As Range 'セル範囲を格納 >Set Rng = Worksheets(1).Range(Cells(A, B), Cells(A, C)) Worksheets(1)+Rangeはつながっていても、肝心な、Cells は、どこにもつながっていませんので、当然、ActiveSheet を指しています。そうすると、エラーを吐きます。 コンテナスタイルは、 With Worksheets(1)  Set Rng = .Range(.Cells(A, B), .Cells(A, C)) End With または、 Set Rng = Worksheets(1).Range(Worksheets(1).Cells(A, B), Worksheets(1).Cells(A, C)) という書き方になります。 >Worksheets(lngASNo + 1).Select >Set Rng = Range(Cells(A, B), Cells(A, C)) これは、一旦、シートをSelect しているので、Rangeも Cellsも、一見、親のワークシートと整合性が取れているように見えるので、エラーは吐きません。 ただし、このように、親のワークシートと、Rangeオブジェクトが、直接結ばれていない場合は、必ず、"標準モジュール"に書かないと、シートをSelectしても、 Cells 側の移動が効かないはずです。 'あまり、このようなスタイルはロスが多くて賛成できないマクロの書き方です。 '/標準モジュール/ Sub TestLoop() Dim lngASNo As Long '本来はInteger Dim Rng As Range Const A As Integer = 1 Const B As Integer = 2 Const C As Integer = 5 For lngASNo = 1 To Worksheets.Count - 1  Worksheets(lngASNo + 1).Select  Set Rng = Range(Cells(A, B), Cells(A, C))  MsgBox Rng.Address & vbCrLf & Rng.Parent.Name Next lngASNo End Sub ************************** '上記と内容は違いますが、基本的に、ループでは、Set Rng で、領域を変数に入れないほうがよいです。 '例: Sub TestSample() Dim i As Integer Const A As Integer = 1 Const B As Integer = 1 Const C As Integer = 5 For i = 1 To Worksheets.Count - 1  With Worksheets(i + 1)   .Range(.Cells(A, B), .Cells(A, C)).FormulaLocal = "=COLUMN()"  End With Next i End Sub '貼り付ければ分かりますが、Cellsの前に「.(コンマ)」が入っています。

ikazuti
質問者

お礼

なるほど、そういう繋がりになっているのですか。なかなかVBAはシートの繋がりとか判りづらくて苦労します。 >Worksheets(lngASNo + 1).Select >Set Rng = Range(Cells(A, B), Cells(A, C)) これは標準モジュールに書いてたので、エラーが出なかったのですね。なるほど。 詳細な解答いただきまして、有り難うございます。助かりました。

関連するQ&A

  • rangeオブジェクトについて

    こんばんわ。 rangeオブジェクトの行数と列数を出したいのですが、やりかた教えていただけませんでしょうか。 以下のように、方法1と方法2を試しましたが、「オブジェクトが必要です」というエラーになります(;;)ついでに、以下2つがなぜだめかも後学のために教えてください(;;) よろしくお願いします。 方法1-- dim rng as range set rng = range(cells(1,1),cells(2,2)) with rng msgbox .columns(.columns.count).column end with 方法2-- dim rng as range set rng = range(cells(1,2),cells(2,2)) msgbox ubound(range,1) -- エクセル2003

  • エクセルVBAで範囲内での位置取得(行&列)

    Sub test() Set Rng = Range("B2:E7") Rng.Cells(2, 2).Select End Sub これで、範囲Rng内では2行/2列目となるC3セルが選択されます。 では、C3セルが、範囲Rng内で何行/何列目であるかを取得するにはどのように記述すればよいのでしょうか? Rng.Cells(2, 2).Rowは、当たり前ですが、3になってしまいます。

  • Excel.Rangeで取得した値を配列に格納するには?

    プログラミング初心者です。 VB.NET でExcelからデータを取得したのですが、配列等に格納したいのですが、うまくできなくて困っています。どなたか教えてください。 例)以下のデータを取得する場合 セルA(列)1(行)からA5まで セルB1からB5まで セルC1からC5まで Dim xl_APP As Excel.Application Dim xl_Book AS Excel.Workbook Dim xl_Sheet As Excel.Seets = xl_Book.Worksheets Dim xl_W_Sheet As Excel.Worksheet = CType(xl_W_Sheet.Item(1),Excel.Worksheet) 中略 Dim range_data As Excel.Range Dim i Integer Dim j Integer Dim strCel As String For i = 1 To 5 For j = 1 To 3 range_data = CType(xl_W_Sheet.Cells(i,j),Excel.Range) strCel = CStr(range_data.Value)  ↑String型変数に格納していますが、多次元配列?に格納して取り出せるようにしたいのですが、どうしたらよいのでしょうか? Next Nest <range_dataに格納されるデータ> A1:氏名 B1:学年 C:1 年齢 以下同上 ・・・・のように取り出したいと考えています。 よろしくお願いします。

  • Excel: SetステートメントでRangeオブジェクトに名前付きセルを指定したい

    Excel VBAです。 RangeオブジェクトにSetステートメントで名前付きセルを指定したのですが、結果、RangeオブジェクトはEmpty値になってしまいます。名前付きではない別のセルでやってみるとうまくいきます。 Dim sSheet as Worksheet Dim wRange as Range Worksheets("Sheet1").Select 【失敗する例:名前付きセルを指定】 Set wRange=Range("c_ControlNo") 【うまくいく例:セルA1を指定】 Set wRange=Range("A1") 名前付きセルは指定できないなんてことはない、と思うのですが、どこがおかしいのでしょうか? アドバイスをお願いします。

  • For~Next ループ内でUnionメソッドを使うとエラーになります。

    下記の記述で2行おきのセル範囲から0以下のセルを除外したセル範囲を取得しようとすると Set Rng = Application.Union(r, Rng) の行でエラーが発生します。 'Set Rng = Range(Cells(12, 7), Cells(12, 7)) の行のコメントアウトをはずすと動きますが、 cells(12,7)の値が0以下だと本来の目的 である0以下のセル範囲を除外するという目的が果たせません。 Union(r,Rng)のRngがnothingになっているとエラーの原因になるのでしょうか? Private Sub test() Dim r As Range Dim Rng As Range 'Set Rng = Range(Cells(12, 7), Cells(12, 7)) For i = 12 To 27 Step 3 If Cells(i, 7) > 0 Then Set r = Range(Cells(i, 7), Cells(i, 7)) Set Rng = Application.Union(r, Rng) End If Next i Rng.Select End Sub 以上教えてください。 お願いします。

  • セルが何行なのかをVBAで取得したい

    セルが何行なのかをVBAで取得したいのですが どういうコードにすればいいですか? 例えば、A1セルに a b c と入ってる場合、3行ですが それをVBAで取得するにはどうすればいいですか? Sub test() Dim r As Range Set r = Cells(1, 1) If r.Value Like "*" & Chr(10) & "*" Then MsgBox "改行があります" End If End Sub というコードで改行が有ることは取得できたのですが 何行かまでは取得する方法がわかりません。

  • VBAで、複数の離れたセルを選択したい

    複数の離れたセルを選択したいのですが、うまくいきません。 A1とA4を選択する場合、通常は、 Range("A1,A4").select なのでしょうが、変数Qを使いたいのです。 セルA1はCells(Q,1)、セルA4はCells(Q,4)となり、 Range(Cells(Q, 1), Cells(Q, 4)).select なのかと思ったのですが、これだと、 Range("A1,A2,A3,A4").select になってしまいます。 離れたセルを変数を使い選択するには、どうしたらよいでしょうか?

  • エクセルVBAで他のbookのセルcellsで参照

    エクセルVBAで他のbookのセルの値(一定の範囲)を参照したいのですが、変数を使いたいため、cellsを使用したいのですがうまくいきません。方法はないでしょうか。 下記に例を示します。 rangeを使用すればすべてok((2)(5))(この場合はset文を使用しなくてもok(5))。同じbookならcells使用ok(4)。 他のbookをcells文使用する方法はないでしょうか(もちろんできれば、Thisbookの方もcellsを使用したい)。 よろしくお願いします。 sub test() Dim ThisBook As Workbook Dim Workbook2 As Workbook 'マクロを実行しているワークブック Set ThisBook = ThisWorkbook '他のワークブック Set Workbook2 = Workbooks("test11.xlsx") ' 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value  '(1)だめ 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range("a1:b2").Value '(2) OK 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test11.xlsx").Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value '(3) だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test1.xlsm").Worksheets(1).Range(Cells(3, 3), Cells(4, 4)).Value  '(4)だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:ii8000").Value = Workbooks("test11.xlsx").Worksheets(1).Range("a1:ii8000").Value  '(5) ok End Sub

  • vbaでセル取得について

    お世話になります。 初歩的な事なのですが、 変数を使ったセルの取得で、 range("a1:b2")を取得する場合に 数字の部分が変数だったらどういう記述になるでしょうか。 ”のつける位置が良く分からず、どうつけても赤字でエラー になります。またcellsの場合も行数や列数が変数の場合の 記述の仕方をお教え頂きたく宜しくお願い致します。

  • VBA 変数について

    VBA初心者でございます。 VBAでgrpという変数を設定し、それをキーにしてオートフィルタをしたいです。 以下のコードではエラーがでてしまうのは、なぜでしょうか? どうぞ宜しくお願いいたします。 Sub 絞り込み2() Dim grp Set grp = Worksheets("リスト").Cells(3, 2) Worksheets("マスタ0701").AutoFilterMode = False With Worksheets("マスタ0701").Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)) .AutoFilter Field:=13, Criteria1:=grp '.CurrentRegion.Select Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)).SpecialCells(xlVisible).Copy Worksheets("検索結果").Range("A1") '.AutoFilter End With End Sub

専門家に質問してみよう