【VBA】マクロの実行ログをファイルに自動記録する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク
  1. この記事でわかること
  2. どんな場面で使う?
  3. 完成イメージ(Before / After)
  4. 実行前の準備
    1. バックアップを取る
    2. Excelをマクロ有効ブック(.xlsm)で保存する
    3. ログファイルの出力先を確認する
  5. 手順(コピペ → 実行まで約5分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  6. コード(基本版)– Open/Print#でテキストにログ出力
    1. 書き換えポイント
  7. コード(応用版)– タイムスタンプ・エラーレベル付きログ
    1. 書き換えポイント
  8. コード(実務版)– マクロ実行の開始/終了/エラーを自動記録
    1. 書き換えポイント
  9. よくある落とし穴5選
    1. 1. Close を書き忘れてファイルがロックされた
    2. 2. For Output で既存ログが消えた
    3. 3. ファイル番号 #1 の競合でエラー
    4. 4. 出力先フォルダが存在しなくてエラー
    5. 5. タイムスタンプの「分」が月になった
    6. 6. ログファイルのサイズが数百MBになってしまった
    7. 7. 複数のブックから同じログファイルに同時書き込みしてエラー
    8. VBAでログファイルに書き込めないときの対処法
    9. VBAのPrint#でログが文字化けするときの対処法
    10. VBAでログファイルがロックされて書き込みエラーになるときの対処法
  10. FAQ
    1. Q1: ログファイルの保存先を変えたい
    2. Q2: ログファイルが大きくなりすぎた
    3. Q3: ログにユーザー名を記録したい
    4. Q4: ログに日本語を書いても大丈夫か
    5. Q5: ログファイルを開いたまま(メモ帳で表示中)でもマクロは動くか
  11. まとめ
    1. 関連記事
  12. 次にやりたくなること
  13. もっとカスタマイズしたい場合

この記事でわかること

  • VBAでマクロの実行ログをテキストファイルに自動記録できる
  • タイムスタンプ・エラーレベル(INFO/WARN/ERROR)付きのログを出力できる
  • 汎用ログ関数を使って、どのマクロにも2行追加するだけでログを残せる

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

どんな場面で使う?

ログ出力は、マクロが「ちゃんと動いたかどうか」を後から確認するための仕組みです。以下のような場面で特に役に立ちます。

  • 複数人で共有しているマクロの管理 — 誰がいつ実行したかをログに残しておけば、「昨日の夕方にデータがおかしくなった」というときに実行履歴から原因を追える。共有ブックのトラブル対応が格段に楽になる
  • 定期実行するマクロの動作確認 — 毎朝自動で動く集計マクロが、ある日エラーで止まっていた。ログがあれば「何時に止まったか」「どのエラーが出たか」がすぐわかるので、復旧に時間がかからない
  • 大量データ処理の進捗記録 — 数千件のデータを処理するマクロで、途中でエラーが発生しても「何件目まで正常に処理できたか」がログからわかる。エラー発生時にゼロからやり直す必要がない
  • マクロの実行時間を計測する — 開始と終了のログにタイムスタンプが入るので、処理にかかった時間が自動的に記録される。パフォーマンス改善の前後比較にも使える
  • エラー発生パターンの分析 — 同じエラーが繰り返し発生していないか、特定の曜日や時間帯にエラーが多くないかを、ログファイルから傾向分析できる

自分は業務マクロには必ずログ出力を入れるようにしている。たった2行追加するだけなのに、トラブル時の安心感がまるで違う。

完成イメージ(Before / After)

Before(ログなし):

マクロが動いたかどうか分からない。エラーが出ても「いつ・何で・どうなったか」を追えない。

After(ログファイルが自動生成):


2026/03/14 09:00:01 [INFO]  売上集計マクロ - 処理を開始しました
2026/03/14 09:00:03 [INFO]  売上集計マクロ - 150件を処理しました
2026/03/14 09:00:03 [INFO]  売上集計マクロ - 処理が正常に完了しました
2026/03/14 09:15:22 [ERROR] 売上集計マクロ - 実行時エラー 1004: ファイルが見つかりません

自分も以前、共有マクロで「動かない」と連絡を受けたが、いつ・誰が実行したのか分からず原因を特定できなかった。イミディエイトウィンドウの出力は閉じたら消えるし、どうにもならなかった。ログファイルに記録するようにしてからは、エラー発生時に「いつ・何の処理で・どんなエラーが出たか」が即座に分かるようになった。原因調査が5分で終わる。同じようにマクロの実行状況が見えなくて困っている人に、この記事でログ出力を体験してほしい。

マクロは「動いたかどうか」が見えないと、トラブル対応が後手に回る。ログを残しておけば原因調査が一瞬で終わる。

なお、ログではなくデータをCSVファイルに書き出したい場合は データをCSVファイルに書き出す方法 を参照。

実行前の準備

バックアップを取る

ログ出力のコード自体はデータを書き換えないが、実務版では業務マクロに組み込んで使う。念のためファイルのコピーを別フォルダに保存してから実行する。

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

ログファイルの出力先を確認する

このコードはブックと同じフォルダにログファイル(macro_log.log)を出力する。ブックがデスクトップにあればデスクトップに、共有フォルダにあれば共有フォルダにログが作成される。

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. Alt + F8 → マクロ名を選んで「実行」

ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。

コード(基本版)– Open/Print#でテキストにログ出力

最もシンプルなログ出力。Open文でテキストファイルを開き、Print#で1行書き込み、Closeで閉じる。


'============================================================
' ■ テキストファイルにログを出力(基本版)
'   → ブックと同じフォルダにログファイルを作成・追記
'============================================================
Sub WriteLogBasic()

    '--- ★書き換えポイント ---
    Dim logFileName As String
    logFileName = "macro_log.log"     '← ログファイル名

    Dim logMessage As String
    logMessage = "マクロが実行されました" '← ログに書き込む内容
    '--- ★ここまで ---

    '--- ログファイルのフルパスを組み立て
    Dim logFilePath As String
    logFilePath = ThisWorkbook.Path & "\" & logFileName

    '--- ファイルを開いて書き込み(Append = 追記モード)
    Open logFilePath For Append As #1
    Print #1, logMessage
    Close #1

    MsgBox "ログを出力しました。" & vbCrLf & logFilePath, vbInformation

End Sub

書き換えポイント

変数 説明 初期値
logFileName ログファイル名 "macro_log.log"
logMessage ログに書き込む内容 "マクロが実行されました"

ポイント: For Append は追記モード。実行するたびにファイル末尾にログが追加される。For Output にすると毎回上書きされるので注意。

コードの流れを詳しく解説:

ThisWorkbook.Path はマクロが入っているブックの保存先フォルダのパスを返します。これに "\" & logFileName を繋げることで、ブックと同じフォルダにログファイルが作成されます。ブックの保存先を変えても、ログファイルは常にブックの隣に出力されるので管理が楽です。

Open logFilePath For Append As #1 の部分で、ファイルを「追記モード」で開いています。ファイルが存在しない場合は自動的に新規作成され、既に存在する場合は末尾に追記されます。この動作は非常に便利で、初回実行時にファイル作成処理を別途書く必要がありません。

Print #1, logMessage でログメッセージを1行書き込み、Close #1 でファイルを閉じています。Open〜Closeは必ずセットで書くのがルール。Closeを忘れるとファイルがロックされたまま残り、次の実行でエラーになります。

コード(応用版)– タイムスタンプ・エラーレベル付きログ

実用的なログには「いつ」「どのレベル」の情報が必要。FreeFileで安全にファイル番号を取得し、タイムスタンプとエラーレベルを付与する。


'============================================================
' ■ タイムスタンプ・エラーレベル付きログ出力(応用版)
'   → [INFO] [WARN] [ERROR] のレベル分けに対応
'============================================================
Sub WriteLogWithTimestamp()

    '--- ★書き換えポイント ---
    Dim logFileName As String
    logFileName = "macro_log.log"     '← ログファイル名

    Dim logLevel As String
    logLevel = "INFO"                 '← INFO / WARN / ERROR

    Dim logMessage As String
    logMessage = "売上集計マクロが正常に完了しました"
    '--- ★ここまで ---

    '--- ログファイルのフルパスを組み立て
    Dim logFilePath As String
    logFilePath = ThisWorkbook.Path & "\" & logFileName

    '--- タイムスタンプを生成
    Dim timeStamp As String
    timeStamp = Format(Now, "yyyy/mm/dd hh:nn:ss")

    '--- エラーレベルを整形(7文字に揃える)
    Dim levelTag As String
    levelTag = "[" & logLevel & "]" & Space(7 - Len(logLevel))

    '--- ログの1行を組み立て
    Dim logLine As String
    logLine = timeStamp & " " & levelTag & logMessage

    '--- FreeFileで安全にファイル番号を取得
    Dim fileNum As Long
    fileNum = FreeFile

    '--- ファイルを開いて書き込み
    Open logFilePath For Append As #fileNum
    Print #fileNum, logLine
    Close #fileNum

End Sub

書き換えポイント

変数 説明 初期値
logFileName ログファイル名 "macro_log.log"
logLevel ログレベル(INFO/WARN/ERROR) "INFO"
logMessage ログに書き込む内容 "売上集計マクロが正常に完了しました"

出力例:


2026/03/14 09:00:01 [INFO]  売上集計マクロが正常に完了しました
2026/03/14 09:15:22 [ERROR] ファイルが見つかりません

応用版コードのポイントを補足:

基本版との大きな違いは FreeFile 関数の導入です。基本版では #1 と固定番号を使っていたけれど、他のマクロで同時にOpen文を使っている場合(例えばCSVの読み込み処理など)にファイル番号が競合してエラーになります。FreeFile は「今使われていない最小のファイル番号」を自動で返してくれるので、番号の衝突を心配する必要がなくなります。

Format(Now, "yyyy/mm/dd hh:nn:ss") でタイムスタンプを生成しています。ここで「分」を nn と書いているのが重要で、mm と書くと「月」と解釈されてしまう場合があります。これはVBAのFormat関数の仕様で、時刻部分では nn が「分」を意味します。

levelTag の整形で Space(7 - Len(logLevel)) を使って文字幅を揃えているのは、ログファイルをテキストエディタで見たときに列がきれいに揃うようにするためです。INFO(4文字)とERROR(5文字)で幅が違うと読みにくくなるので、この一手間が地味に効きます。

エラー処理の基本については エラー処理で止まらないマクロを作る方法 を参照。

コード(実務版)– マクロ実行の開始/終了/エラーを自動記録

実務では「汎用ログ関数」を1つ作っておき、各マクロから呼び出すのが効率的。どのマクロにも2行追加するだけでログが残るようになる。

汎用ログ関数を作ってからは、どのマクロにも2行追加するだけでログが残るようになった。トラブル対応が劇的に楽になった。


'============================================================
' ■ 汎用ログ関数(実務版)
'   → どのマクロからでも呼び出せるログ出力関数
'   → 開始/終了/エラーを自動記録
'============================================================

'--- 汎用ログ出力関数(このSubを標準モジュールに置く)
Sub WriteLog(ByVal logLevel As String, ByVal procName As String, ByVal logMessage As String)

    '--- ★書き換えポイント ---
    Dim logFileName As String
    logFileName = "macro_log.log"     '← ログファイル名
    '--- ★ここまで ---

    '--- ログファイルのフルパスを組み立て
    Dim logFilePath As String
    logFilePath = ThisWorkbook.Path & "\" & logFileName

    '--- タイムスタンプを生成
    Dim timeStamp As String
    timeStamp = Format(Now, "yyyy/mm/dd hh:nn:ss")

    '--- エラーレベルを整形
    Dim levelTag As String
    levelTag = "[" & logLevel & "]" & Space(7 - Len(logLevel))

    '--- ログの1行を組み立て
    Dim logLine As String
    logLine = timeStamp & " " & levelTag & procName & " - " & logMessage

    '--- ファイルに追記
    Dim fileNum As Long
    fileNum = FreeFile

    Open logFilePath For Append As #fileNum
    Print #fileNum, logLine
    Close #fileNum

End Sub

'============================================================
' ■ 使い方サンプル — 売上集計マクロにログを組み込む例
'============================================================
Sub SampleMacroWithLog()

    Const PROC_NAME As String = "売上集計マクロ"

    '--- 開始ログ
    Call WriteLog("INFO", PROC_NAME, "処理を開始しました")

    On Error GoTo ErrHandler

    '--- ここに実際の業務処理を書く ----------
    Dim lastRow As Long
    lastRow = ThisWorkbook.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row

    Call WriteLog("INFO", PROC_NAME, lastRow - 1 & "件を処理しました")
    '--- 業務処理ここまで --------------------

    '--- 正常終了ログ
    Call WriteLog("INFO", PROC_NAME, "処理が正常に完了しました")
    MsgBox "処理が完了しました。", vbInformation
    Exit Sub

ErrHandler:
    '--- エラーログ
    Call WriteLog("ERROR", PROC_NAME, "実行時エラー " & Err.Number & ": " & Err.Description)
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbCritical

End Sub

書き換えポイント

変数 説明 初期値
logFileName(WriteLog内) ログファイル名 "macro_log.log"
PROC_NAME(各マクロ内) 処理名(ログに表示される名前) "売上集計マクロ"

出力例:


2026/03/14 09:00:01 [INFO]  売上集計マクロ - 処理を開始しました
2026/03/14 09:00:03 [INFO]  売上集計マクロ - 150件を処理しました
2026/03/14 09:00:03 [INFO]  売上集計マクロ - 処理が正常に完了しました
2026/03/14 09:15:22 [ERROR] 売上集計マクロ - 実行時エラー 1004: ファイルが見つかりません

ポイント: 新しいマクロにログを追加する場合は、以下の2行を追加するだけで良い。


Const PROC_NAME As String = "処理名"
Call WriteLog("INFO", PROC_NAME, "メッセージ")

処理の進捗をリアルタイムに確認したい場合は 処理の進捗をステータスバーに表示する方法 も参考になる。

よくある落とし穴5選

1. Close を書き忘れてファイルがロックされた

自分もこれで引っかかった。Openしたファイルを閉じ忘れると、ファイルがロックされたままになり、次の実行でエラーになった。

対策: Open文の直後にCloseを書く習慣をつける。実務版のWriteLog関数ならOpen/Print#/Closeがセットになっているので閉じ忘れがない。

2. For Output で既存ログが消えた

原因: For Append(追記)ではなく For Output(上書き)を指定してしまい、実行するたびに過去のログが消えた。

対策: ログファイルは必ず For Append を使う。基本版・応用版・実務版すべてAppendを使用している。

3. ファイル番号 #1 の競合でエラー

原因: ファイル番号を #1 で固定していると、他のOpen文(CSVの読み込みなど)と番号が競合してエラーになる。

対策: FreeFile で未使用の番号を自動取得する。応用版・実務版ではFreeFileを使用している。

4. 出力先フォルダが存在しなくてエラー

原因: ThisWorkbook.Path が空文字になるケースがある。ブックを一度も保存していない(新規ブックのまま)場合、Pathは空文字を返す。

対策: ブックを保存してから実行する。または If ThisWorkbook.Path = "" Then でチェックを入れる。

5. タイムスタンプの「分」が月になった

原因: Format(Now, "yyyy/mm/dd hh:mm:ss") と書くと、時刻の「分」の mm が「月」と解釈される場合がある。

対策: 分は nn を使う。正しくは Format(Now, "yyyy/mm/dd hh:nn:ss")

6. ログファイルのサイズが数百MBになってしまった

原因: 大量のデータを処理するマクロでループ内の毎行にログを書き込んでいると、ログファイルが肥大化する。毎回ファイルを開いて閉じるのでI/Oも遅くなる。

対策: ループ内での詳細ログは開発・デバッグ時だけにする。本番運用では「開始」「終了」「エラー発生時」の3ポイントだけログを出力するのが現実的。また、月ごとにファイルを分ける(FAQ Q2参照)のも効果的。

7. 複数のブックから同じログファイルに同時書き込みしてエラー

原因: 2つのExcelブックが同時にWriteLog関数を呼び出すと、一方のOpen文でファイルがロックされているため、もう一方がエラーになる。

対策: ブックごとにログファイル名を変える(例: logFileName = ThisWorkbook.Name & "_log.log")か、エラー処理を入れてリトライする仕組みを追加する。

VBAでログファイルに書き込めないときの対処法

「WriteLogを実行したのにログファイルが作成されない・書き込めない」という場合、原因は出力先のパスが無効になっていることが多い。最もよくあるのは、ブックを一度も保存していない状態で ThisWorkbook.Path が空文字を返すケース。自分も新規ブックでテスト実行してハマった経験がある。対処法は、ブックを先に保存してから実行するか、If ThisWorkbook.Path = "" Then MsgBox "先にブックを保存してください" のチェックを入れること。また、ネットワークドライブの場合はアクセス権限も確認しておくと安心だ。

VBAのPrint#でログが文字化けするときの対処法

「ログファイルをメモ帳で開いたら文字化けしている」という場合、原因はファイルのエンコーディングの不一致だ。VBAの Open/Print# はShift_JIS(ANSI)で出力するが、メモ帳やエディタがUTF-8で開こうとすると文字化けする。Windows 10以降のメモ帳はデフォルトでUTF-8になっている場合がある。対処法は、メモ帳で開くときに「名前を付けて保存」→文字コードを「ANSI」に指定して保存し直すか、エディタ側でShift_JISを指定して開くこと。どうしてもUTF-8で出力したい場合は ADODB.Stream を使う方法があるが、実務レベルではShift_JISのままで問題ないことがほとんどだ。

VBAでログファイルがロックされて書き込みエラーになるときの対処法

「WriteLogを実行すると『ファイルが開かれています』というエラーが出る」という場合、原因はログファイルをメモ帳やエディタで開いたままマクロを実行していることだ。Open文は排他ロックをかけるため、他のアプリケーションがファイルを開いていると書き込みに失敗する。対処法は、ログ確認後にメモ帳を閉じてからマクロを実行すること。リアルタイムでログを確認したい場合は、ログ出力のたびに Open/Print#/Close をセットで実行する(実務版コードはこの方式になっている)のが安全だ。

FAQ

Q1: ログファイルの保存先を変えたい

logFilePath の値を変更する。ネットワークドライブのUNCパスも指定できる:


logFilePath = "\\server\share\log\macro_log.log"

Q2: ログファイルが大きくなりすぎた

月ごとにファイル名を変える:


logFileName = "macro_log_" & Format(Now, "yyyymm") & ".log"

これで macro_log_202603.log のように月別のファイルが作成される。

Q3: ログにユーザー名を記録したい

Environ("USERNAME") でWindowsのログインユーザー名を取得できる:


logLine = timeStamp & " " & levelTag & "[" & Environ("USERNAME") & "] " & logMessage

Q4: ログに日本語を書いても大丈夫か

Open/Print#はShift_JIS(ANSI)で出力される。日本語は問題なく記録できる。メモ帳で正常に表示される。

Q5: ログファイルを開いたまま(メモ帳で表示中)でもマクロは動くか

メモ帳で開いている場合は書き込みエラーになることがある。ログを確認するときは、マクロ実行前にメモ帳を閉じるか、読み取り専用で開く。

まとめ

  • 基本版: Open/Print#/Close の3行でテキストファイルにログを出力できる
  • 応用版: FreeFile + Format(Now, ...) でタイムスタンプ・エラーレベル付きログを出力
  • 実務版: 汎用ログ関数 WriteLog を作れば、各マクロに2行追加するだけでログが残る
  • エラーの発生日時・内容がログに残るので、トラブル対応が速くなる

ログ出力は「入れておいて損はないけど、入れていないと困る」典型的な仕組みです。マクロが正常に動いているうちは存在を忘れているけれど、いざエラーが発生したときに「ログがあって本当に良かった」と思う。特に複数人で使うマクロや、定期的に自動実行するマクロでは、ログなしでの運用はリスクが高い。まずは基本版の3行からでいいので、今あるマクロに追加してみてほしい。

関連記事

次にやりたくなること

もっとカスタマイズしたい場合

「ログの出力先をネットワークドライブにしたい」「複数ブックのログを一元管理したい」「ログファイルのローテーション(一定サイズで切り替え)を実装したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。

相談時に伝えると話が早い情報:

  • Excel のバージョン / OS
  • ログを記録したいマクロの本数
  • ログの出力先(ローカル / ネットワークドライブ)
  • 記録したい情報(日時・ユーザー名・処理名・エラー内容など)

コメント

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