Excel VBA 逆引き集 | スタックトレース風

Excel VBA
スポンサーリンク

スタックトレース風ログ

VBAには「スタックトレース(関数呼び出しの履歴)」を自動で出す仕組みはありません。
ですが、「どの処理を通ったか」「どこで止まったか」 を自分でログに残すことで、スタックトレース風に見える記録を作れます。
初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • スタックトレース風ログとは?
    関数やサブルーチンの「入口」「出口」を記録して、処理の流れを追えるようにする仕組み。
  • 用途:
    • デバッグ時に「どこまで動いたか」を確認
    • エラー発生時に「どの関数で止まったか」を特定
    • 複雑な処理の流れを見える化

テンプレ1:入口・出口をログに残す

Sub MainProcess()
    LogTrace "Enter MainProcess"
    
    Call Step1
    Call Step2
    
    LogTrace "Exit MainProcess"
End Sub

Sub Step1()
    LogTrace "Enter Step1"
    ' 何かの処理
    LogTrace "Exit Step1"
End Sub

Sub Step2()
    LogTrace "Enter Step2"
    ' 何かの処理
    LogTrace "Exit Step2"
End Sub

Sub LogTrace(ByVal msg As String)
    Debug.Print Format(Now, "yyyy-mm-dd HH:NN:SS") & " | " & msg
End Sub
VB
  • ポイント:
    • Enter 関数名Exit 関数名 を記録。
    • Debug.Print でImmediateウィンドウに出力。

テンプレ2:エラー時にスタックトレース風ログを残す

Sub MainProcessWithError()
    On Error GoTo ErrHandler
    LogTrace "Enter MainProcessWithError"
    
    Call StepWithError
    
    LogTrace "Exit MainProcessWithError"
    Exit Sub
    
ErrHandler:
    LogTrace "Error in MainProcessWithError: " & Err.Description
End Sub

Sub StepWithError()
    LogTrace "Enter StepWithError"
    ' 故意にエラー発生
    Worksheets("NoSheet").Activate
    LogTrace "Exit StepWithError"
End Sub
VB
  • ポイント:
    • エラーが出たら「どの関数で止まったか」をログに残す。
    • Err.Description を組み込むと原因が分かりやすい。

テンプレ3:シートにスタックトレース風ログを残す

Sub LogTraceSheet(ByVal msg As String)
    Dim ws As Worksheet: Set ws = Worksheets("TraceLog")
    Dim r As Long
    r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
    ws.Cells(r, 1).Value = Now
    ws.Cells(r, 2).Value = msg
End Sub

Sub ExampleTrace()
    LogTraceSheet "Enter ExampleTrace"
    Call Step1
    Call Step2
    LogTraceSheet "Exit ExampleTrace"
End Sub
VB
  • ポイント:
    • シートに「日時+メッセージ」を残す。
    • 後から処理の流れを一覧できる。

テンプレ4:スタックトレース風にインデントを付ける

Dim traceLevel As Integer

Sub LogTraceIndented(ByVal msg As String, Optional ByVal enter As Boolean = False, Optional ByVal exit As Boolean = False)
    If enter Then traceLevel = traceLevel + 1
    Debug.Print String(traceLevel * 2, " ") & msg
    If exit Then traceLevel = traceLevel - 1
End Sub

Sub ExampleIndentedTrace()
    LogTraceIndented "Enter Main", True
    LogTraceIndented "Enter Step1", True
    LogTraceIndented "Exit Step1", , True
    LogTraceIndented "Enter Step2", True
    LogTraceIndented "Exit Step2", , True
    LogTraceIndented "Exit Main", , True
End Sub
VB
  • ポイント:
    • traceLevel を使ってインデントを付ける。
    • ネスト構造が分かりやすくなる。

例題で練習

'例1:入口・出口をImmediateウィンドウに出力
'例2:エラー発生時にスタックトレース風ログを残す
'例3:シートに処理の流れを記録
'例4:インデント付きでネスト構造を見える化
VB

初心者向けポイント

  • VBAには自動スタックトレースはない → 自分でログを残す必要あり
  • 入口・出口を記録するだけで流れが分かる
  • エラー時は関数名+Err.Descriptionを残すと便利
  • シートやファイルに残すと後から確認できる
  • インデントを付けるとネスト構造が見やすい

👉 この「スタックトレース風ログテンプレ」を覚えておけば、Excel VBAで 処理の流れやエラー発生箇所を追跡できる仕組み を簡単に作成できます。

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