以下は「Offset を実務でガンガン使うためのテンプレ集」。
全部コピペで動くし、状況に合わせてそのままパーツとして組み込める。
1. 隣の列へ集計結果を書くテンプレ
B列〜D列の合計を右隣の E 列へ自動で書く
(最終行自動検出つき)
Sub Temp_Offset_SumRight()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
Dim r As Range
For Each r In Range("B2:B" & lastRow)
r.Offset(0, 3).Value = _
WorksheetFunction.Sum(r, r.Offset(0, 1), r.Offset(0, 2))
' B + C + D → E
Next r
End Sub
VB● 汎用化ポイント
- 「右へ3列」は
(0,3) - 列数が変わっても、Offset なら柔軟に対応可能
- 実務では合計だけでなく、差分や判定にも流用できる
2. 表の横方向へ項目を自動追加するテンプレ
A1 から右へ N 列、ヘッダ名を自動で並べる
Sub Temp_Offset_HeaderFill()
Dim startCell As Range
Set startCell = Range("A1")
Dim headers As Variant
headers = Array("ID", "名前", "数量", "単価", "金額")
Dim i As Long
For i = LBound(headers) To UBound(headers)
startCell.Offset(0, i).Value = headers(i)
Next i
End Sub
VB● こんな場面で使う
- 外部データを読み込んだシートにヘッダを自動生成
- 日次/週次レポートのフォーマット作成
3. 表末尾に行を自動追加して値を入れるテンプレ
最終行の 1 行下に、新しい行を作ってデータを書く
Sub Temp_Offset_AddNewRow()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Dim r As Range
Set r = Cells(lastRow, "A")
r.Offset(1, 0).Value = "新規データ"
r.Offset(1, 1).Value = Now ' 日付など
r.Offset(1, 2).Value = "担当:Halu"
End Sub
VB● よくある用途
- ログ記録
- 実行履歴・ステータス書き込み
- 自動レポートの1行追加
4. 「条件に合う行の右隣」へフラグを立てるテンプレ
B列が空欄の行にだけ「未入力」と右隣へ書く
Sub Temp_Offset_FlagMissing()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
Dim r As Range
For Each r In Range("B2:B" & lastRow)
If r.Value = "" Then
r.Offset(0, 1).Value = "未入力"
Else
r.Offset(0, 1).Value = ""
End If
Next r
End Sub
VB● 実務だと定番
- 入力チェック
- 欠損データのマーキング
- 審査待ち/処理済などのフラグ付け
5. Offset × Resize で「範囲ブロック」を右へコピー
2×5 の範囲をそのまま右へ2列ずらして複製
Sub Temp_Offset_ResizeCopy()
Dim block As Range
Set block = Range("A1").Resize(2, 5) ' 2行×5列
block.Copy Destination:=block.Offset(0, 2)
End Sub
VB● 超便利ポイント
- Offset で「位置」
- Resize で「サイズ」
- セットで使うと表操作が劇的に楽になる
6. 表の端まで連続処理(横へ広がる動的処理)
A1 を基準に、右にデータが続く限り自動処理
Sub Temp_Offset_AutoExpand()
Dim c As Range
Set c = Range("A1")
Do While c.Value <> ""
c.Offset(1, 0).Value = c.Value * 10
Set c = c.Offset(0, 1) ' 右へ1列進む
Loop
End Sub
VB● 便利なシーン
- 見出しが横に広い表
- 月が追加されるレポート(1月→2月→3月…)
- 右方向のデータ連鎖処理
7. Offset × Find で検索 → 隣へ書くテンプレ
指定文字が見つかった行の右隣へ値を入れる
Sub Temp_Offset_FindWrite()
Dim f As Range
Set f = Columns("A").Find("売上")
If Not f Is Nothing Then
f.Offset(0, 1).Value = "ヒット!"
End If
End Sub
VB● 実務で定番の“検索後処理”
- 見出し名が変動する場合
- 外部システムのデータ形式が毎回微妙に違う場合
8. Offset × ループで「行単位の複数列処理」をテンプレ化
B列〜E列を1行ずつ処理して、結果を右隣へ
Sub Temp_Offset_MultiColumnProcess()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
Dim r As Range
For Each r In Range("B2:B" & lastRow)
Dim total As Double
total = r.Value + r.Offset(0, 1).Value + r.Offset(0, 2).Value + r.Offset(0, 3).Value
r.Offset(0, 4).Value = total
Next r
End Sub
VB9. 新しい列を自動生成 → 値を入れるテンプレ
右端のさらに右に列を追加して”結果”列を作る
Sub Temp_Offset_AddColumn()
Dim lastCol As Long
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Dim baseCell As Range
Set baseCell = Cells(1, lastCol)
baseCell.Offset(0, 1).Value = "結果" ' 見出し
baseCell.Offset(1, 1).Resize(10, 1).Value = "OK" ' 下の10行にOK
End Sub
VB● 列追加も Offset が便利
- 日付列が増える帳票
- 新しい指標欄の追加
- データ分析の補助列
10. Offset × 条件で“次の空行”を探して追記
空の行を探して、自動で値を追記する
Sub Temp_Offset_AppendToBlankRow()
Dim r As Range
Set r = Range("A2")
Do While r.Value <> ""
Set r = r.Offset(1, 0) ' 下へ移動
Loop
' ここが最初の空行
r.Value = "追加データ"
r.Offset(0, 1).Value = Now
End Sub
VB● 日報・ログ・取引履歴などによくあるパターン
まとめ
Offset は「相対的に動く」ってだけの単純な仕様なのに、
実務に落とすとこんなに多用途なパーツになる。
- 隣列の計算
- 行の追加
- 列の拡張
- 検索後の処理
- データの広がりに自動追従
- ブロックコピー
- 欠損チェック
- ループでの多列処理
だいたいこの辺を押さえておけば、日常の Excel 業務はほぼ無双できる。


