Excel VBA 逆引き集 | マクロのログレベル設計

Excel VBA
スポンサーリンク

ねらい:マクロの「ログレベル設計」で運用を見える化する

業務マクロを長期運用すると「どこで失敗したか」「どこまで進んだか」「何が起きたか」が分からないと困ります。ログを設計する際に重要なのは「レベル分け」です。情報の粒度を揃えることで、初心者でも状況を把握でき、トラブル時の調査も速くなります。

重要ポイントの深掘り

ログは「全部出す」ではなく「必要なレベルを選んで出す」ことが肝心です。開発時は詳細、運用時は要点だけ、障害時はエラー中心。レベルを切り替えられる設計にすると、同じコードを開発・本番で安心して使えます。


ログレベルの基本設計

レベルの種類と役割

  • DEBUG:開発時に使う詳細ログ。変数の値や処理の分岐を記録。
  • INFO:通常運用で使う進捗や開始・終了の記録。
  • WARN:想定外だが処理継続可能な事象。例:空欄をスキップ。
  • ERROR:処理を止める重大なエラー。例外内容を記録。
  • FATAL:システム全体を止める致命的なエラー。

深掘り:なぜレベル分けが必要か

  • 情報過多を防ぐ:DEBUGを本番で出すとログが膨大になり、調査が逆に難しくなる。
  • 状況に応じた切り替え:開発時は詳細、本番は要点、障害時はエラー中心。
  • 調査効率を上げる:エラーだけを抽出すれば原因特定が速い。

ログ出力のテンプレート

ログ関数の設計例

' ModLog
Option Explicit

Public Enum LogLevel
    DEBUG = 1
    INFO = 2
    WARN = 3
    ERROR = 4
    FATAL = 5
End Enum

Public CurrentLogLevel As LogLevel

Public Sub Log(ByVal level As LogLevel, ByVal message As String)
    If level < CurrentLogLevel Then Exit Sub
    
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets("Log")
    If ws Is Nothing Then
        Set ws = ThisWorkbook.Worksheets.Add
        ws.Name = "Log"
        ws.Range("A1:D1").Value = Array("日時", "レベル", "メッセージ", "詳細")
    End If
    On Error GoTo 0
    
    Dim r As Long
    r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
    ws.Cells(r, 1).Value = Format(Now, "yyyy-mm-dd HH:NN:SS")
    ws.Cells(r, 2).Value = level
    ws.Cells(r, 3).Value = message
End Sub
VB

深掘り:ログ関数の設計ポイント

  • Enumでレベルを定義:数字ではなく名前で扱うと可読性が高い。
  • CurrentLogLevelでフィルタ:不要なログを出さない仕組み。
  • シート自動生成:Logシートがなければ作る。運用が楽になる。

実際の利用例

開始・終了・進捗をINFOで記録

Sub Run_Process()
    CurrentLogLevel = INFO
    Log INFO, "処理開始"
    
    ' …処理本体…
    
    Log INFO, "処理終了"
End Sub
VB

詳細な変数値をDEBUGで記録

Sub DebugExample()
    CurrentLogLevel = DEBUG
    Dim x As Long: x = 10
    Log DEBUG, "変数x=" & x
End Sub
VB

エラーをERRORで記録

Sub ErrorExample()
    On Error GoTo EH
    CurrentLogLevel = INFO
    Dim y As Long: y = 1 / 0
    Exit Sub
EH:
    Log ERROR, "ゼロ除算: " & Err.Description
End Sub
VB

運用での切り替え方

開発時はDEBUG

変数の値や分岐を細かく出す。バグ調査に役立つ。

本番運用はINFO

開始・終了・進捗だけを出す。ログが肥大化しない。

障害調査はERROR+WARN

エラーと警告だけを抽出。原因特定が速い。

深掘り:切り替えの仕組み

CurrentLogLevel を設定するだけで切り替え可能にしておくと、コードを変えずに運用モードを変えられる。これは「同じコードを開発・本番で安心して使える」ための重要な設計です。


例題で練習

例題1:INFOレベルで処理開始・終了を記録する

初心者はまず「処理開始」「処理終了」をログに出すだけで効果を体感できます。実行履歴が残るだけで安心感が増します。

例題2:DEBUGレベルで変数値を出してみる

変数の値をログに出すと、処理の流れが見えるようになります。バグ調査の第一歩です。

例題3:ERRORレベルで例外を記録する

意図的にゼロ除算を起こし、ログに「ゼロ除算」と出ることを確認します。エラー調査の基本が理解できます。


実務の落とし穴と対策

ログが多すぎて調査できない

対策:レベルフィルタを必ず設計し、不要なログは出さない。

ログが少なくて原因が分からない

対策:開発時はDEBUG、本番はINFO、障害時はERROR+WARNに切り替える。

ログシートが壊れる

対策:自動生成+ヘッダー行を固定。壊れても再作成できる。


スターター手順

  • ステップ1:Enumでログレベルを定義する
  • ステップ2:Log関数を作り、CurrentLogLevelでフィルタする
  • ステップ3:処理開始・終了をINFOで記録する
  • ステップ4:変数値をDEBUGで記録する
  • ステップ5:例外をERRORで記録する

まとめ

マクロのログレベル設計は「情報を出す仕組み」ではなく「情報を選ぶ仕組み」です。レベル分けとフィルタを導入するだけで、開発・本番・障害調査のすべてに対応できます。初心者はまず「処理開始・終了をINFOで出す」から始め、慣れたらDEBUGやERRORを組み合わせていくと、業務マクロが一気に安心して使えるシステムになります。

タイトルとURLをコピーしました