Offsetとは?
offsetには「相殺する(もの)」「埋め合わせをする(もの)」という意味があります。
offset
woblio英和辞典:https://ejje.weblio.jp/content/offset
(…を)差引勘定する、相殺(そうさい)する、(…で)(…を)相殺する、(…を)(…で)相殺する、(…を)オフセット刷りにする
VBAでは”任意のセル”から指定した移動距離にある”セル”を表すプロパティです。
具体例
任意のセルを(A1)とします
Range(“A1”)
行を下へ一つ移動すると(A2)になります
Range(“A2”) これをOffsetを用いると
Range(”A1″).Offset(1,0)と表現することが出来ます
行を下へ一つ、列を右へ一つ移動すると(B2)になります
Range(“B2”) これをOffsetを用いると
Range(“A1”).Offset(1,1)と表現することが出来ます
Offsetの使い方
1 |
Rangeオブジェクト.offset(行,列) |
Ranngeオブジェクトに移動する行と列を指定します。
Rangeオブジェクトはcells・Range・宣言された文字列でも可能です。
実際にコードを書いて動作をみてみましょう
1 2 3 4 5 6 7 |
Sub オフセット() Range("A1").Offset(1, 1).Select Selection.Cells.Interior.Color = vbYellow End Sub |
(A1)から行1、列1移動したセル(B2)の背景色を黄色にする命令文です
実行前
実行後
(B2)が黄色くなりました
Rangeオブジェクトで範囲(A1:B2)として指定します。
1 2 3 4 5 6 7 8 9 |
Sub オフセット() Dim MyRange As Range Set MyRange = Range("A1:B2") MyRange.Offset(1, 1).Select Selection.Cells.Interior.Color = vbYellow End Sub |
実行後
範囲指定して宣言した文字列でも正常に作動しました。
Offset の使い時とデメリット
offsetは任意のセルから距離を指定できます。そのため、当然ですが距離が一定の関係にある動作にしか使えません。私が思うoffsetの使い時・別の方法を考えた方が良い時をまとめてみました。
offsetの使い時
- 連続した動作を行うとき
- 隣または、距離が必ず決まっているとき(本当の本当に決まっているとき)
- どうしても他の方法が浮かばないとき
別の方法を考えた方が良い時
- 表を扱うとき
- 距離があまりにも遠いとき
- 相対的な位置が今後変わる可能性があるとき
1.連続した動作を行うとき 2.隣または、距離が必ず決まっているとき
「Excelシートのレイアウトをテンプレート化して入力するセルが必ず固定されている」このような場面は、offsetを使っても良いかもしれません。具体的にはリハ計画書等がよい例でしょうか。計画書のテンプレートが出来てしまえば、任意のセルから一定の距離に入力したいセルが作れます。ただし、一度VBAコードを組んでしまうと、レイアウト(計画書の書式)を変更出来なくなるので、必ずテンプレートを完璧に作ってしまう必要があります。
ある動作の次にoffsetでセルを指定する・ある動作の隣あったセルを指定する際にはoffsetは最適です。
1 |
Range("A1").end(xltoright).offset(1,0) |
(A1)から始まる1行目の一番右のセルを選択することができます。
3.どうしても他の方法が浮かばないとき
どうしても浮かばないときはoffsetを使用するしかありません。私も、データベースを作る際にoffsetを使うことしか思いつきませんでした。他の方法が思いついた際に書き換えるのも一つの方法です。この記事が、参考になれば幸いです。
4.表を扱うとき
私がoffsetを使用して後悔したポイントです。VBAコードを描いた後で、(しばらくして)表の項目を追加したいと思い列を増やしてしまいました。当然、マクロ作動の際に表がずれてしまいました。表なので、レイアウトが決まっているようで、将来的にはわからないものです。
表を使用している際は、見出し(一番上の行)を活用するとオススメです。方法はいくつかありますが、見出しの名前を検索して、対象の行を指定すれば、cells(行,列)でセルを求めることが出来ます。
5.距離が遠いとき
距離が遠いときは、offsetの数字が大きくなります。
任意のセルから距離を数えるのも大変ですし、バグがあった際の確認が大変になります。
セル数(セル位置)をイミディエイトウインドウを用いて検索する方法もありますが、初心者の頃はよく躓きました。別の方法があるなら、無理にoffsetを使用することは無いのかなと思います。
6.相対的な位置が今後変わる可能性があるとき
これが一番よくバグを起こす原因です。
作成時は変わることが無いと思っていたExcelシートに行や列を追加しなくてはならないことがありました。追加した行・列ぶんoffsetの数字を変えなければならないのですが、どこを変えれば良いかのデバグ作業がほんとストレスになります。
ぜひ注意してください。
まとめ
Offsetは視覚的にとらえやすく、記述も簡単ですのでVBAを始めたばかりの頃は多用してました。エクセルシートのレイアウトが変わらない場面や、決まった距離を指定する場面では使いやすいプロパティです。
ただ、位置が変わると使い物にならないので、使用する際はバグに注意して活用してみてください。
コメント