エクセルVBAで、Offsetの使い方についてです。
Offsetはセルや選択範囲を移動するプロパティです。
簡単なコードでセルを移動させていくことが出来ますので、是非使い慣れておきましょう。
こんにちは、じゅんぱ店長(@junpa33)です。
エクセルVBAで、セルやセルの選択範囲を移動させるのにOffsetプロパティがあります。
今回の「VBA最速で理解」は、この便利な「Offsetプロパティ」の使い方について説明します。
- セルの範囲選択
- Range VS Cells !VBAで使えるのはどっち
- セルの範囲選択と設定は14のツールで対応する
- Rowsプロパティの働きと関連のメソッド
- Columnsプロパティでセルの列を指定する
- EntireRowとRowプロパティの違い
- EntireColumnとColumnの使い方
- Offsetプロパティは指定範囲を移動させる
- Resizeプロパティでセル範囲をサイズ変更
- CurrentRegionは連続データをまとめて掴む
- UnionとRangeの一括選択の働きを比較
- SpecialCellsメソッドはセル検索し選択する
- UsedRangeプロパティの使い方のコツ
- Endプロパティで上下左右の最終セルを取得
- データ入力済セルの最終行番号を取得する
コンテンツ
エクセルVBA Offsetの使い方。セルや選択範囲を移動する

「 Offset 」は「あるセル範囲を基準に、相対的に移動して別のセル範囲を選択します。」ということです。
「相対的に移動??」何かわかりにくいです。
つまり分かりやすく言うと、「Offset は、セルやセル範囲を移動させます。移動量は行方向に〇コ、列方向に〇コ、です。」になります。
Range オブジェクト.Offset(行方向移動量,列方向移動量)
それでは例題と共に説明していきます。
一つのセルの移動
一つのセルを決めて「Offset」で移動させてみます。
「Activecell」のデフォルト位置を「セルD4」とします。

Offset 行方向への移動
行方向にセルを移動させます。
Sub offsetテスト1()
ActiveCell.Offset(3, 0).Select
End Sub
実行結果
行のプラス方向に3つ移動しました。

Sub offsetテスト2()
ActiveCell.Offset(-3, 0).Select
End Sub
実行結果
行のマイナス方向に3つ移動しました。

Offset 列方向への移動
列方向にセルを移動させます。
Sub offsetテスト3()
ActiveCell.Offset(0, 3).Select
End Sub
実行結果
列のプラス方向に3つ移動しました。

Sub offsetテスト4()
ActiveCell.Offset(0, -3).Select
End Sub
実行結果
列のマイナス方向に3つ移動しました。

Offset 行・列方向への移動
行・列両方向にセルを移動させます。
Sub offsetテスト5()
ActiveCell.Offset(3, 3).Select
End Sub
実行結果
行・列両方向へプラス方向に3移動しました。

Sub offsetテスト6()
ActiveCell.Offset(-3, -3).Select
End Sub
実行結果
行・列両方向へマイナス方向に3移動しました。

セル範囲の移動
セルの範囲選択を行い、それを移動させてみます。
「セル範囲」のデフォルト位置を「セルF8からセルH10」とします。

Offset 行方向への移動
行方向に選択範囲を移動させます。
Sub offsetテスト7()
Range("F8:H10").Select
Selection.Offset(5, 0).Select
End Sub
実行結果
選択範囲が、行のプラス方向に5つ移動しました。

Sub offsetテスト8()
Range("F8:H10").Select
Selection.Offset(-5, 0).Select
End Sub
実行結果
選択範囲が、行のマイナス方向に5つ移動しました。

Offset 列方向への移動
Offset 行・列方向への移動
行・列両方向に選択範囲を移動させます。
Sub offsetテスト11()
Range("F8:H10").Select
Selection.Offset(5, 5).Select
End Sub
実行結果
選択範囲が、行・列両方向へプラス方向に5移動しました。

Sub offsetテスト12()
Range("F8:H10").Select
Selection.Offset(-5, -5).Select
End Sub
実行結果
選択範囲が、行・列両方向へマイナス方向に5移動しました。

Offset 実際に設置する時の1例
「Offset」を実際のコードの中でどのように使えるかを考えます。
1例として、その時のデータをコピーして違う場所に累積保存していく場合を考えます。
E列に置かれているデータをA列にコピーします。
A列にコピーされたデータは、このVBAコードを実行する毎に蓄積されていきます。
E列にあるデータはその都度、数量や値が変化します。
Sub offsetテスト14()
Dim C As Range
Dim ERow As Long, ARow As Long
'A列とE列の行数を調べます
ARow = Cells(Rows.Count, 1).End(xlUp).Row
ERow = Cells(Rows.Count, 5).End(xlUp).Row
'セルA1とセルE1の条件設定
If Range("A1") = "" Then ARow = 0
If Range("E1") = "" Then Exit Sub
'アクティブセルを選択します
Range("A" & ARow + 1).Select
'OffsetでA列の行を1段づつ下げる
For Each C In Range("E1:E" & ERow)
ActiveCell.Value = C.Value
ActiveCell.Offset(1).Select
Next C
End Sub
最初に起動した時

2回目以降




offsetの使い方まとめ

「 offset 」を「 ActiveCell 」と組み合わせ、それをループコードの中で展開して、
移動量指定でセルを動かしてみてください。
上手く使って、コードの簡潔化につなげてください。
アクティブセルと組み合われる場合は、その時どこにフォーカスがあるのかは十分注意してください。


電子書籍版「大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方」をamazonで見てみる
(著者)大村あつし(出版社)技術評論社
(税込価格)1,628円(本体1,480円+税)
学習書の新しい形です。
YouTubeと完全リンクした参考書です。入門と基礎を重点的に22本の動画で解説をしています。
ちょっとした空き時間を利用してでもスマホがあれば学習ができます。
動画は優しい語り口調で、視聴者にある意味安心感を与えてくれます。動画は5分から20分間ぐらいで22本の構成です。
文章解説と動画解説の関係性は、動画解説が主で、文章解説がサポートいう使い方もできます。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。