ここでは、Offset を使った「実務レベルの汎用テンプレ」を “1つの部品ライブラリ” としてまとめたプロ仕様コードを提供します。
- 隣列計算
- 表の自動拡張
- 自動入力
- 行挿入
- ブロックコピー
- データ検出
- 最終行 / 最終列検出
- Offset × Resize の黄金パターン
すべて 1つのモジュールとしてコピペするだけで使える“プロの部品ライブラリ” です。
プロの業務マクロで使える「Offset 汎用ライブラリ」
Excel の標準モジュール(Module1 など)に、そのまま貼り付けるだけで使えます。
'===========================================
' Offset を使った業務用 汎用ライブラリ
'===========================================
Option Explicit
'==============================
' 1. 隣列に計算結果を書き込む(汎用)
'==============================
Public Sub Ofs_WriteRight(ByVal rng As Range, ByVal value As Variant)
rng.Offset(0, 1).Value = value
End Sub
'==============================
' 2. 隣列に合計を書き込む(B列→C列)
'==============================
Public Sub Ofs_WriteSumRight(ByVal rng As Range)
rng.Offset(0, 1).Value = WorksheetFunction.Sum(rng)
End Sub
'==============================
' 3. 指定行の右隣に任意ラベルを付ける
'==============================
Public Sub Ofs_LabelRight(ByVal rng As Range, ByVal labelText As String)
rng.Offset(0, 1).Value = labelText
End Sub
'==============================
' 4. ブロック(範囲)を右にずらして複製
'==============================
Public Sub Ofs_CopyBlockRight(ByVal block As Range, ByVal colsRight As Long)
block.Copy Destination:=block.Offset(0, colsRight)
End Sub
'==============================
' 5. ブロックを下方向へ複製
'==============================
Public Sub Ofs_CopyBlockDown(ByVal block As Range, ByVal rowsDown As Long)
block.Copy Destination:=block.Offset(rowsDown, 0)
End Sub
'==============================
' 6. Offset + Resize で「表を拡張」
'==============================
Public Sub Ofs_ExtendTable(ByVal startCell As Range, _
ByVal srcRows As Long, _
ByVal srcCols As Long, _
ByVal expandRows As Long)
Dim area As Range
Set area = startCell.Resize(srcRows, srcCols)
Dim i As Long
For i = 1 To expandRows
area.Copy Destination:=area.Offset((i - 1) * srcRows, 0)
Next i
End Sub
'==============================
' 7. 最終行を基準に右隣へ出力(合計など)
'==============================
Public Sub Ofs_WriteToLastRowRight(ByVal ws As Worksheet, ByVal col As Variant, ByVal text As String)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).Row
ws.Cells(lastRow, col).Offset(0, 1).Value = text
End Sub
'==============================
' 8. 最終行を返す(共通関数)
'==============================
Public Function GetLastRow(ByVal ws As Worksheet, ByVal col As Variant) As Long
GetLastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).Row
End Function
'==============================
' 9. 最終列を返す(共通関数)
'==============================
Public Function GetLastCol(ByVal ws As Worksheet, ByVal row As Long) As Long
GetLastCol = ws.Cells(row, ws.Columns.Count).End(xlToLeft).Column
End Function
'==============================
' 10. Offset を安全に使う(シート端チェック)
'==============================
Public Function Ofs_IsValid(ByVal base As Range, _
ByVal rOffset As Long, _
ByVal cOffset As Long) As Boolean
Dim nr As Long, nc As Long
nr = base.Row + rOffset
nc = base.Column + cOffset
If nr < 1 Or nc < 1 Then Exit Function
If nr > base.Worksheet.Rows.Count Then Exit Function
If nc > base.Worksheet.Columns.Count Then Exit Function
Ofs_IsValid = True
End Function
'==============================
' 11. 安全オフセット(範囲を返す)
'==============================
Public Function Ofs_Safe(ByVal base As Range, _
ByVal rOffset As Long, _
ByVal cOffset As Long) As Range
If Ofs_IsValid(base, rOffset, cOffset) Then
Set Ofs_Safe = base.Offset(rOffset, cOffset)
Else
MsgBox "Offset がシート範囲外です。", vbExclamation
Set Ofs_Safe = base ' 基準点を返す
End If
End Function
'==============================
' 12. 行追加 + データ自動入力(右隣へ書き込み)
'==============================
Public Sub Ofs_InsertRowAndWriteRight(ByVal rng As Range, ByVal data As Variant)
rng.EntireRow.Insert
rng.Offset(0, 1).Value = data
End Sub
'==============================
' 13. 行ごと自動的に「下へ書き足していく」
'==============================
Public Sub Ofs_Append(ByVal ws As Worksheet, ByVal col As Variant, ByVal data As Variant)
Dim lr As Long
lr = GetLastRow(ws, col)
ws.Cells(lr + 1, col).Value = data
End Sub
VBプロの現場での使い方例(即戦力)
① 隣の列に計算結果(2倍)を書きたい
Sub CalcRight()
Dim r As Range
For Each r In Range("B2:B100")
Call Ofs_WriteRight(r, r.Value * 2)
Next r
End Sub
VB② 表を 10 行分増やしたい(毎回テンプレをコピー)
Sub ExtendTemplate()
Call Ofs_ExtendTable(Range("A1"), 3, 5, 10) '(3行×5列の表を10回繰り返す)
End Sub
VB③ 最終行の右に「合計」ラベルを付けたい
Sub PutTotal()
Call Ofs_WriteToLastRowRight(ActiveSheet, "B", "合計")
End Sub
VB④ ブロックを右へ 3 列ずらして複製
Sub CopyBlock()
Call Ofs_CopyBlockRight(Range("A1:C5"), 3)
End Sub
VB⑤ シート端チェック付きで安全にオフセット
Sub SafeMove()
Dim tgt As Range
Set tgt = Ofs_Safe(Range("A1"), -1, 0) ' A1 の1行上→範囲外→警告
tgt.Value = "TEST"
End Sub
VBこのライブラリが “プロ仕様” な理由
Offset を使う実務パターンを関数化して再利用できる
→ 毎回長いコードを書く必要がない
隣列計算 / ブロックコピー / 表拡張 / ラベル付け
→ 実務で必ず必要な処理を網羅
最終行/最終列 の検出もワンライナー
→ データ量が変動しても壊れない
安全オフセット(シート端チェック)を搭載
→ 規模の大きいマクロでも事故らない


