Excel VBA | 実務ですぐ使える 「改良版テンプレート(VBA 標準構成テンプレ)」

VBA
スポンサーリンク

ここでは 実務ですぐ使える “改良版テンプレート(VBA 標準構成テンプレ)” をまとめて提供します。

このテンプレは、
エラー処理/ログ/設定読み込み/共通モジュール/業務処理モジュール
をすべて含んだ “会社でそのまま使える構成” です。

実務で最も重要なポイントは
「共通化」「分割」「ログ記録」「エラー対応」「設定の外出し」
です。

そのため、下記のようなモジュール構成を採用します。


テンプレ構成(最適な 5 モジュール)

モジュール名役割実務での使いどころ
M_Mainメイン処理呼び出しのみ全体制御の入口
M_Common共通処理(文言、メッセージ、変換など)再利用・保守性◎
M_ErrorHandler統一的なエラー処理バグ調査が圧倒的に楽
M_Logログ書込み(時刻・内容)エラー調査・改善
M_Business業務固有ロジックシステム本体

① M_Main(メイン処理モジュール)

Option Explicit

Sub RunMain()
    On Error GoTo ERR_HANDLER

    LogWrite "=== 処理開始 ==="
    Call BusinessMain
    LogWrite "=== 処理終了 ==="
    MsgBox "完了しました", vbInformation

    Exit Sub

ERR_HANDLER:
    HandleError "RunMain", Err.Number, Err.Description
End Sub
VB

🔍 解説

  • RunMain からのみ業務処理を呼び出す
  • どんな処理もここから開始
  • 例外発生 → 統一的な HandleError

② M_Common(共通処理)

Option Explicit

Function Nz(v, Optional defaultValue As Variant = "") As Variant
    If IsEmpty(v) Or IsNull(v) Or v = "" Then
        Nz = defaultValue
    Else
        Nz = v
    End If
End Function

Function ToHankaku(ByVal s As String) As String
    ToHankaku = StrConv(s, vbNarrow)
End Function

Function GetConfig(key As String) As String
    Dim sh As Worksheet
    Set sh = Sheets("設定")
    
    Dim rng As Range
    Set rng = sh.Range("A:A").Find(what:=key, LookAt:=xlWhole)
    If rng Is Nothing Then
        GetConfig = ""
    Else
        GetConfig = rng.Offset(0, 1).Value
    End If
End Function
VB

🔍 実務ポイント

  • Nz は Access 系で超便利 → Null/Empty でも安全処理
  • 全角→半角などの 入力正規化 は実務で頻出
  • GetConfig は「設定シート」からパラメータを読み込む
    → 「設定を外部化すると保守が爆速」

③ M_ErrorHandler(エラー処理専用)

Option Explicit

Sub HandleError(procName As String, errNum As Long, errMsg As String)
    LogWrite "【エラー】" & procName & _
             " / Err:" & errNum & _
             " / " & errMsg
    MsgBox "エラーが発生しました:" & vbCrLf & _
           "場所:" & procName & vbCrLf & _
           "内容:" & errMsg, vbCritical
End Sub
VB

🔍 実務ポイント

  • すべてのエラーは「この関数に集約する」
  • どこで起きても
    • 処理場所
    • エラー番号
    • 内容
      がログに残るため、再現調査が劇的に減る。

④ M_Log(ログ記録モジュール)

Option Explicit

Sub LogWrite(msg As String)
    Dim sh As Worksheet
    Set sh = Sheets("ログ")

    Dim r As Long
    r = sh.Cells(Rows.Count, 1).End(xlUp).Row + 1

    sh.Cells(r, 1).Value = Now
    sh.Cells(r, 2).Value = msg
End Sub
VB

🔍 実務ポイント

  • ログは 最低限 2列(時刻+内容) あればOK
  • 必須:
    • 処理開始
    • 処理終了
    • エラー発生箇所
  • 不具合分析の生産性が 5 倍以上変わります

⑤ M_Business(業務処理モジュール)

例として「データ読み込み → 整形 → 出力」という
実務標準のフローにしています。

Option Explicit

Sub BusinessMain()
    On Error GoTo ERR_HANDLER

    LogWrite "業務処理開始"

    Dim data As Variant
    data = ReadData()

    data = NormalizeData(data)

    WriteData data

    LogWrite "業務処理終了"
    Exit Sub

ERR_HANDLER:
    HandleError "BusinessMain", Err.Number, Err.Description
End Sub
VB

データ読み込み(Range → 配列)

Function ReadData() As Variant
    Dim sh As Worksheet
    Set sh = Sheets("入力")

    ReadData = sh.Range("A1").CurrentRegion.Value
End Function
VB

データ整形(半角化・空白処理など)

Function NormalizeData(arr As Variant) As Variant
    Dim r As Long, c As Long
    For r = 1 To UBound(arr, 1)
        For c = 1 To UBound(arr, 2)
            arr(r, c) = ToHankaku(Trim(arr(r, c)))
        Next c
    Next r

    NormalizeData = arr
End Function
VB

出力(配列 → Range 書戻し)

Sub WriteData(arr As Variant)
    Dim sh As Worksheet
    Set sh = Sheets("出力")
    sh.Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
VB

実務テンプレの特徴まとめ

統一されたエラー処理

→ バグ発生箇所が一瞬で分かる

ログ出力(Debug.Print ではなくログシート)

→ 問題が起きても再現不要

設定値をシート化

→ EXE や外部ツール並みに扱いやすい

Range → 配列 → Range の定石フロー

→ 大量データも高速

Sub の分割と責務分離

→ バグが少なく保守しやすい構成

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