• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAでセル選択するコードが変)

エクセルVBAでセル選択するコードの理屈がわからない

このQ&Aのポイント
  • エクセルのワークシートでVBAでセル選択するコードの理屈がわからない。
  • 通常、Cells(2, 1)はセル番地で言えばA2セル、Cells(4, 1)はセル番地で言えばA4セルとなるが、With .Range("B5:B15")でくくると.Cells(2, 1)はセル番地で言えばB6セル、.Cells(4, 1)はセル番地で言えばB8セルになり、しかし実際にはC10:C12が選択される。
  • 何故この動作になるのか理解できず、コードを.Range(“A2:A4”).Selectに書きかえると、希望のB6:B8が選択される。

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.5

Sheet1がActiveで、かつ、selectすることがゴールなら Sub test03()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(Cells(2, 1), Cells(4, 1)).Select     End With   End With End Sub でも期待通り動作しますが 別なシートがActiveで、かつ、 指定したセル範囲に値を埋める制御も考慮した場合は Sub test21()   With Sheets("Sheet1")     With .Range("B5:B15")       Range(.Cells(2, 1), .Cells(4, 1)) = "AAA"     End With   End With End Sub といったコードとなりましょう。 つまり、 >Cells前のドットを消したところ ではなく、 Rangeの前のドットを消すのがより正しいコードと思います。

emaxemax
質問者

お礼

たしかに。 Activeではないと .Range(Cells(2, 1), Cells(4, 1)).Value = "AAA" ではエラーになりました。Range(.Cells(2, 1), .Cells(4, 1)) = "AAA" なら正しく作動しました。

その他の回答 (6)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.7

Sub test02()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(.Cells(2, 1), .Cells(4, 1)).Select     End With   End With End Sub >.Cells(2, 1)はセル番地で言えばB6セルだと思います。 >.Cells(4, 1) はセル番地で言えばB8セルだと思います。 With Sheets("Sheet1")     With .Range("B5:B15")         .Range("B6", "B8").Select Range("B5:B15")範囲に対してB列(この場合C列となります) Range("B5:B15")範囲に対して6行~8行目となりC10:C12が選択されることになります。

emaxemax
質問者

お礼

ありがとうございます。

  • kkkkkm
  • ベストアンサー率66% (1733/2603)
回答No.6

実際は変数で指定してるので難しいのかもしれませんが、結果OffsetとResizeでいけますよね。 With .Range("B5:B15") .Offset(1, 0).Resize(3, 1).Select End With

emaxemax
質問者

お礼

ありがとうございます。 この方法で、変数化しようと思います。 Sub test05() With Sheets("Sheet1") With .Range("B5:B15") .Offset(1, 0).Resize(3, 1).Value = "BBB" End With End With End Sub

  • kkkkkm
  • ベストアンサー率66% (1733/2603)
回答No.4

> Cells(2, 1)のCells前のドットが余計な参照をひっぱっているのですね? そうですね。 .Range(Cells(2, 1), Cells(4, 1)).Select は .Range(“A2:A4”).Select と同じですね。 ただ、Sheet1のシートモジュール以外だとエラーの出る場面が違いますね。

emaxemax
質問者

お礼

ありがとうございます。

  • tamu1129
  • ベストアンサー率58% (1300/2233)
回答No.3

すみません 訂正部分があります >この指定された範囲(起点がC9になっている)の(.Cells(2, 1), .Cells(4, 1))の位置を取得させているのですからC10~C13が ではなく この指定された範囲(起点がC9になっている)の(Cells(2, 1), Cells(4, 1))の位置を取得させているのですからC10~C12が でした

emaxemax
質問者

お礼

はい、ありがとうございます。

  • tamu1129
  • ベストアンサー率58% (1300/2233)
回答No.2

まず、.Range("B5:B15").Selectを実行すれば、セルB5:B15が範囲指定されますよね 起点がB5になる訳です ここを起点にしてRange("B5:B15")が範囲になるように With Sheets("Sheet1") With .Range("B5:B15") .Range("B5:B15").Select End With End With を実行してやれば良いです B5を起点にしてRange("B5:B15")は右に1つ下に5つ~10下がった範囲が選択されます(C9~C19が選択される) この指定された範囲(起点がC9になっている)の(.Cells(2, 1), .Cells(4, 1))の位置を取得させているのですからC10~C13が With Sheets("Sheet1")     With .Range("B5:B15")       .Range(.Cells(2, 1), .Cells(4, 1)).Select     End With   End With の結果として範囲指定されているで、理屈にあっているという訳です

emaxemax
質問者

お礼

理屈を理解出来ました。 ありがとうございます。

  • kkkkkm
  • ベストアンサー率66% (1733/2603)
回答No.1

.Range("B5:B15").Range(.Range("B5:B15").Cells(2, 1), .Range("B5:B15").Cells(4, 1)).Select B5からB5含めて(以下起点を含む)+5=B9 B9から+2=B10 Bから+B Bは2なのでC Cから+1でそのままC という感じではないでしょうか。

emaxemax
質問者

お礼

ありがとうございます。 そういう理屈ですか。.Cells(2, 1)のCells前のドットが余計な参照をひっぱっているのですね? ためしに Sub test03()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(Cells(2, 1), Cells(4, 1)).Select     End With   End With End Sub と、Cells前のドットを消したところ。希望のB6:B8が選択されました。

関連するQ&A

専門家に質問してみよう