- ベストアンサー
VBAでセルの情報を取得する方法
- VBAでセルのオブジェクトが取得できず、セルの情報を取得する方法についての質問です。
- 現在のコードではセルのオブジェクトを取得することができていません。正しくセルの情報を取得するためには、一部修正が必要です。
- 具体的には、Worksheetsオブジェクトを使用してセルのオブジェクトを取得し、その後Rangeオブジェクトを使用してセルの範囲を指定する必要があります。
- みんなの回答 (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の前に「.(コンマ)」が入っています。
お礼
なるほど、そういう繋がりになっているのですか。なかなかVBAはシートの繋がりとか判りづらくて苦労します。 >Worksheets(lngASNo + 1).Select >Set Rng = Range(Cells(A, B), Cells(A, C)) これは標準モジュールに書いてたので、エラーが出なかったのですね。なるほど。 詳細な解答いただきまして、有り難うございます。助かりました。