スタックトレース風ログ
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で 処理の流れやエラー発生箇所を追跡できる仕組み を簡単に作成できます。
