[[20260119083652]] 『Rangeの指定方法について』(栗栄太) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『Rangeの指定方法について』(栗栄太)

1.現在のセル"A1"の右下を指定するのに
Range("A1").Offset(1, 1)
オフセットを使用すると"B2"を指定できます。

2.次に、"B2" から "H2" までセル結合して
Range("B2").Offset(1, 1) → I3
こうなります。

結合を無視したかったので以下のようにしました。
最初はoffsetの入力を忘れてわかったことなのですが
1.Range("A1")(2, 2) → B2
同様に
2.Range("B2")(2, 2) → C3

これは仕様上問題ないのでしょうか?
それとも現在のバージョンでたまたまこうなっているだけなのでしょうか?

ネットをしらべてみたのですが、
オフセットの方法はどこにでも表示されているのですが、
このやり方をしているのをどこにも見つけることができませんでした。
今までは以下のようにしていました。
ネットではこのようなやり方が書かれていました。

 Cells(Range("B2").Row + 1, Range("B2").Column + 1)

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


このあたり読んでください

 Range.Item プロパティ (Excel)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.item

 解説にこのような記載があります
 >Range の既定のメンバーは、パラメーターを持つ呼び出しを Item メンバーに転送します。 したがって、 
 >someRange(1) と someRange(1,1) はそれぞれ someRange.Item(1) と someRange.Item(1,1)に相当します。

 Range("A1")(2, 2) は Range("A1").Item(2,2)
 Range("B2")(2, 2) は Range("B2").Item(2,2)
 です

 >これは仕様上問題ないのでしょうか
 どのような問題が想定されますか?
(´・ω・`) 2026/01/19(月) 09:14:41

1.Range("A1")(2, 2) → B2
2.Range("B2")(2, 2) → C3

B2をA1に見立てた1と同じ位置
(気分) 2026/01/19(月) 09:47:34


通常のCellsは
Cells(2, 2).Select

こんな感じ
Range("a1").Cells(2, 2).Select

(気分) 2026/01/19(月) 09:54:47


(´・ω・`)さん
ありがとうございます。

「指定したセル範囲のオフセット値で指定される範囲を表す Range オブジェクトを返します。」
「 someRange(1,1) はそれぞれ someRange.Item(1,1)に相当します」
と、書かれていました。

ここでいうオフセット値というのは
soumeRange.offset(RowIndex,ColumnIndex)で設定されるオフセットの値とは
内部の処理が異なると認識してよいのでしょうか?

また、Items の仕様として、セルが結合されていようがいまいが
指定した値は結合されていないセル1つということであれば問題ないと思います。

(栗栄太) 2026/01/19(月) 10:21:10


Range("A1:C5").Offset(5, 2).Select
とか色々実験して自分で試してからききなよ・・・

ひょっとして、(メラゾーム)(コルム)同じ人?
質問の仕方が似ているので
(気分) 2026/01/19(月) 10:40:51


 誤解があるようです。
 Range.Item プロパティとRange.Offset プロパティは全く別物です。

 ・Range.Item プロパティ
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.item
 左上の基点を(1,1)と考える。
 Rangeオブジェクトの既定プロパティ

 ・Range.Offset プロパティ
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.offset
 左上の基点を(0,0)と考える。

 (´・ω・`)さんが書かれている通りでRange("B2")(2, 2)という書き方は
Rangeオブジェクトの既定プロパティItemを 省略した書き方で
 Range("B2")(2, 2) と Range("B2").Item(2, 2)と同義です。
(まる2021) 2026/01/19(月) 10:51:44

 問題の発端は、
 Range(・・・).Offset(  ) 
 が状況依存で、セルの結合の有無で結果が変わることだと思います
 (以下の(a)と(b)の結果が変わる)
 Range(   ).Offset(  ) が Range(   ).MergeArea.Offset(    ) と同じ結果が返るので
 ユーザーの立場としてはどうしようもありませんが、
 これはこういうモノだと覚えておくしかありませんね

 Sub test()
   Cells.UnMerge
    Debug.Print Range("B2").Offset(1, 1).Address                  ' (a)
    Range("B2:C3").Merge
    Debug.Print Range("B2").Offset(1, 1).Address                  ' (b)
    Debug.Print Range("B2").MergeArea.Offset(1, 1).Address        ' (c)
 End Sub

 Itemプロパティの RowIndex,ColumnIndexが 1 始まりなのでOffsetとはどうしても1ずれます
 RowIndex,ColumnIndexが 0 始まりだったら、Offsetと同じ数値を指定できるので
 覚えるのが楽だったかもしれませんが、これもそういうものなのでどうしようもありません

 覚えて慣れるしかないです
(´・ω・`) 2026/01/19(月) 11:07:44

ありがとうございました。

個人的に、offset はセルの結合の有無で結果が変わり、
誤動作することもあって使いたくなかったので、先にも書いたように
Cells(Range("B2").Row + 1, Range("B2").Column + 1)
などとして使っていたのですが、
少し面倒だったたので今回たまたま
Cells("B2")(2,2)で同じようなことができるのがわかったのですが
今まで使ったことがなかったので、仕様がわからずお聞きしました。
また、これについて一応ネットで調べてみたのですが
使っているものを見つけることができませんでした。
自分でも一応試してみて同じ結果を得ることは確認できたのですが、
確信がもてなかったので質問させていただきました。
教えていただきありがとうございました。

ちなみに、メラゾーム、コルムについてはわからないです。

(栗栄太) 2026/01/19(月) 13:18:56


 >Cells("B2")(2,2)で同じようなことができる
 >使っているものを見つけることができません

 Cells("B2").Cells(2,2) として使われることが多いと思います

 Range.Cells プロパティ
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.cells
(´・ω・`) 2026/01/19(月) 14:21:52

 >Cells("B2").Cells(2,2)

 Range("B2").Cells(2,2)  か
 Cells(2,"B").Cells(2,2) ですよね?

(半平太) 2026/01/19(月) 15:57:39


 半平太様
 そのとおりでした

 確認が不十分で申し訳ありません
(´・ω・`) 2026/01/19(月) 16:30:01

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.