Excel VBA | Offset × Resize × ForEach の 黄金 100 パターン集

VBA
スポンサーリンク

黄金100パターン × 業務別ライブラリ(共通モジュール化)

では「黄金100パターン」を 業務別ライブラリ化 し、さらに 共通モジュール(汎用関数) として再利用できる形に落とし込みます。
これにより「売上表」「勤怠表」「在庫表」など異なる業務でも同じ関数を呼び出すだけで処理が可能になります。


共通モジュール設計

1. 基本構造

' ===== Module: TableUtils =====
Option Explicit

' 汎用:範囲を自動検出
Public Function GetTableRange(startCell As Range) As Range
    Set GetTableRange = startCell.CurrentRegion
End Function

' 汎用:最終行を取得
Public Function GetLastRow(col As Long) As Long
    GetLastRow = Cells(Rows.Count, col).End(xlUp).Row
End Function

' 汎用:最終列を取得
Public Function GetLastCol(row As Long) As Long
    GetLastCol = Cells(row, Columns.Count).End(xlToLeft).Column
End Function

' 汎用:隣列に加工結果を書き込む
Public Sub WriteToNextColumn(srcRange As Range, result)
    srcRange.Offset(0, 1).Value = result
End Sub
VB

2. 売上表ライブラリ

' ===== Module: SalesTable =====
Option Explicit

' 売上表:税込金額を右列へ
Public Sub AddTaxColumn(tbl As Range, taxRate As Double)
    Dim r As Range
    For Each r In tbl.Columns(3).Cells ' 金額列を想定
        If IsNumeric(r.Value) Then
            r.Offset(0, 1).Value = r.Value * (1 + taxRate)
        End If
    Next r
End Sub

' 売上表:月別集計を別ブロックへ
Public Sub MonthlySummary(tbl As Range, destCell As Range)
    Dim dict As Object, r As Range, pasteRow As Long
    Set dict = CreateObject("Scripting.Dictionary")
    For Each r In tbl.Columns(1).Cells ' 日付列を想定
        If IsDate(r.Value) Then
            dict(Format(r.Value, "YYYY/MM")) = dict(Format(r.Value, "YYYY/MM")) + r.Offset(0, 2).Value
        End If
    Next r
    
    pasteRow = 0
    Dim k As Variant
    For Each k In dict.Keys
        destCell.Offset(pasteRow, 0).Value = k
        destCell.Offset(pasteRow, 1).Value = dict(k)
        pasteRow = pasteRow + 1
    Next k
End Sub
VB

3. 勤怠表ライブラリ

' ===== Module: AttendanceTable =====
Option Explicit

' 勤怠表:勤務時間合計を右端へ
Public Sub AddWorkHoursSummary(tbl As Range)
    Dim r As Range
    For Each r In tbl.Rows
        r.Cells(1, tbl.Columns.Count).Offset(0, 1).Value = WorksheetFunction.Sum(r)
    Next r
End Sub

' 勤怠表:遅刻回数を右列にカウント
Public Sub CountLate(tbl As Range)
    Dim r As Range
    For Each r In tbl.Columns(3).Cells ' 出勤時刻列を想定
        If IsDate(r.Value) And Hour(r.Value) > 9 Then
            r.Offset(0, 1).Value = "遅刻"
        End If
    Next r
End Sub
VB

4. 在庫表ライブラリ

' ===== Module: StockTable =====
Option Explicit

' 在庫表:カテゴリ分類を右列へ
Public Sub CategorizeStock(tbl As Range)
    Dim r As Range
    For Each r In tbl.Columns(2).Cells ' 商品名列を想定
        Select Case r.Value
            Case "りんご", "みかん"
                r.Offset(0, 1).Value = "果物"
            Case "牛乳", "チーズ"
                r.Offset(0, 1).Value = "乳製品"
            Case Else
                r.Offset(0, 1).Value = "その他"
        End Select
    Next r
End Sub

' 在庫表:負の在庫を検出して印を付ける
Public Sub MarkNegativeStock(tbl As Range)
    Dim r As Range
    For Each r In tbl.Columns(3).Cells ' 在庫数列を想定
        If IsNumeric(r.Value) And r.Value < 0 Then
            r.Offset(0, 1).Value = "ERR"
        End If
    Next r
End Sub
VB

ライブラリの使い方(共通呼び出し)

Sub RunSalesSummary()
    Dim tbl As Range
    Set tbl = GetTableRange(Range("A1"))
    Call AddTaxColumn(tbl, 0.1)
    Call MonthlySummary(tbl, Range("H2"))
End Sub

Sub RunAttendanceSummary()
    Dim tbl As Range
    Set tbl = GetTableRange(Range("A1"))
    Call AddWorkHoursSummary(tbl)
    Call CountLate(tbl)
End Sub

Sub RunStockSummary()
    Dim tbl As Range
    Set tbl = GetTableRange(Range("A1"))
    Call CategorizeStock(tbl)
    Call MarkNegativeStock(tbl)
End Sub
VB

✅ まとめ

  • 共通モジュール(TableUtils) → 最終行・最終列検出、隣列書き込みなど汎用関数
  • 業務別モジュール(Sales / Attendance / Stock) → 売上・勤怠・在庫に特化した処理
  • 呼び出しはシンプルGetTableRange で表を検出 → 各業務関数を呼び出すだけ

💡 これで「黄金100パターン」を 業務別ライブラリ化 し、さらに 共通モジュール化 して再利用可能になりました。

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