- ベストアンサー
エクセルVBAでセル選択するコードの理屈がわからない
- エクセルのワークシートで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が選択される。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
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の前のドットを消すのがより正しいコードと思います。
その他の回答 (6)
- watabe007
- ベストアンサー率62% (476/760)
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が選択されることになります。
お礼
ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1725/2595)
実際は変数で指定してるので難しいのかもしれませんが、結果OffsetとResizeでいけますよね。 With .Range("B5:B15") .Offset(1, 0).Resize(3, 1).Select End With
お礼
ありがとうございます。 この方法で、変数化しようと思います。 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% (1725/2595)
> Cells(2, 1)のCells前のドットが余計な参照をひっぱっているのですね? そうですね。 .Range(Cells(2, 1), Cells(4, 1)).Select は .Range(“A2:A4”).Select と同じですね。 ただ、Sheet1のシートモジュール以外だとエラーの出る場面が違いますね。
お礼
ありがとうございます。
- tamu1129
- ベストアンサー率58% (1295/2224)
すみません 訂正部分があります >この指定された範囲(起点がC9になっている)の(.Cells(2, 1), .Cells(4, 1))の位置を取得させているのですからC10~C13が ではなく この指定された範囲(起点がC9になっている)の(Cells(2, 1), Cells(4, 1))の位置を取得させているのですからC10~C12が でした
お礼
はい、ありがとうございます。
- tamu1129
- ベストアンサー率58% (1295/2224)
まず、.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 の結果として範囲指定されているで、理屈にあっているという訳です
お礼
理屈を理解出来ました。 ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1725/2595)
.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 という感じではないでしょうか。
お礼
ありがとうございます。 そういう理屈ですか。.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が選択されました。
お礼
たしかに。 Activeではないと .Range(Cells(2, 1), Cells(4, 1)).Value = "AAA" ではエラーになりました。Range(.Cells(2, 1), .Cells(4, 1)) = "AAA" なら正しく作動しました。