Excel VBA | Offset を実務でガンガン使うためのテンプレ集

VBA
スポンサーリンク

ここでは、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 を使う実務パターンを関数化して再利用できる

→ 毎回長いコードを書く必要がない

隣列計算 / ブロックコピー / 表拡張 / ラベル付け

→ 実務で必ず必要な処理を網羅

最終行/最終列 の検出もワンライナー

→ データ量が変動しても壊れない

安全オフセット(シート端チェック)を搭載

→ 規模の大きいマクロでも事故らない

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました