黄金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
VB2. 売上表ライブラリ
' ===== 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
VB3. 勤怠表ライブラリ
' ===== 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
VB4. 在庫表ライブラリ
' ===== 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パターン」を 業務別ライブラリ化 し、さらに 共通モジュール化 して再利用可能になりました。


