エクセルVBAでマクロの動作をログファイルに記録する最も簡単なプログラム

log-file-2

photo credit: bwc Old school log file via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAによるマクロの動作状況については、Debug.Printによるイミディエイトウィンドウへの表示をすることで確認することができます。

ですが、表示したい内容が大量にある場合や、記録として残しておきたいときはどうしたら良いでしょうか?

そんな時は、ログファイルに出力して記録をとっておくという手法がオススメです。

ということで、何回かのシリーズで、ExcelVBAによるマクロの動作状況をログファイルに残す方法をお伝えしたいと思います。

以下記事で紹介しているOpenやCloseなどを使っても実現できるのですが、追々ファイルが存在しなかったときの処理も入れることを想定して、より扱いやすいFileSystemオブジェクトを使う方法にて紹介していきます。

エクセルVBAでテキストファイルに書き出す最も簡単なプログラム
エクセルVBAでは様々なテキストファイルを生成できますが、今回はその中でも最も簡単な拡張子txtのテキストファイルをエクセルシートのデータを元に出力する方法についてお伝えしています。

初回の今回は、FileSystemオブジェクトを使ってログファイルに書き出す最も簡単なプログラムを紹介します。

では、行ってみましょう!

スポンサーリンク

FileSystemオブジェクトとその生成と破棄

FileSystemオブジェクトはファイル、フォルダ、ドライブなどを操作するためのオブジェクトです。

なんで、ログファイルの書き込みにFileSystemオブジェクトを使うねんと思われるかも知れませんが、大丈夫です。

FileSystemオブジェクトはログファイル(つまりテキストファイルですが)の書き込みもできちゃう優れもののオブジェクトなのです。

使用する際は、オブジェクトの生成が必要になりますので、以下プログラムがベースとなります。

Sub FSOを使う()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

'処理

Set objFso = Nothing

End Sub

CreateObjectで生成して、最後は破棄をします。

詳細については以下記事に書いていますので、合わせてご覧下さいね。

429 Too Many Requests

テキストファイルにログを記録するプログラム

それで今回ですが、例えば、エラーが発生したときのことを想定して

  • タイムスタンプ
  • 「エラーが発生しました」

とだけログファイルに蓄積して残していくプログラムを紹介したいと思います。

前提として、既にファイル「error.log」は空のファイルとして存在しているものとします。

フォルダの構成はこんな感じです。

エクセルマクロファイルとログファイル

そして、マクロとして「ログファイル.xlsm」に仕込むVBAプログラムはこちらです。

Sub writeLog()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

With objFso.OpenTextFile(ThisWorkbook.Path & "\error.log", 8)

    .WriteLine Now & vbTab & "エラーが発生しました "
    .Close

End With

Set objFso = Nothing

End Sub

あら、簡単そうじゃないですか?

上記ベースから追加になったのは、6行目からの4行だけです。

以下、解説していきますね。

OpenTextFileメソッドでテキストファイルとしてファイルを開く

まず6行目の部分ですが、ログファイル「error.log」を書き込み用として開く処理です。

テキストファイルとしてファイルを開く場合は、OpenTextFileメソッドを使います。

書き方はこうです。

FileSystemオブジェクト.OpenTextFile(ファイルパス, IOモード)

ファイルパスは開くテキストファイルのパスです。フルパスで指定するのが一般的でしょう。

IOモードは以下に表で示すファイルを開くモードを指定します。

定数 内容
ForReading 1 ファイルを読み取り専用として開く
ForWriting 2 ファイルを書き込む専用として開く
ForAppending 8 ファイルの最後に追加して書き込む用として開く

今回は「error.log」にずっと蓄積をすることを想定していますので、「8」を指定しています。

なお、OpenTextFileメソッドで開いたファイルはTextStreamオブジェクトとして取り扱いが可能になります。

WriteLineメソッドでテキストファイルに一行書き込む

次に8行目ですが、開いたTextStreamオブジェクトに一行書き込む処理です。WriteLineメソッドを使います。

書き方はこちら。

TextStreamオブジェクト.WriteLine 文字列

これでTextStreamオブジェクトに文字列を書き込んだ上で改行をします。

プログラムでは、Nowで書き込み時点の日時にTabを挿入して「エラーが発生しました」というテキストを文字列として指定しています。

Closeメソッドでテキストファイルを閉じる

Closeメソッドは開いたTextStreamオブジェクトを閉じます。

TextStreamオブジェクト.Close

開いたなら忘れずに閉じましょう。

ログファイルへの出力結果

上記プログラムを二回実行すると、error.logは以下のような内容になります。

エクセルVBAで出力されたログファイル

無事にタイムスタンプとメッセージが出力されていますね。

まとめ

エクセルVBAでFileSystemオブジェクトを使ってログをテキストファイルに出力する最も簡単なプログラムを紹介しました。

OpenTextFileメソッド、WriteLineメソッド、Closeメソッドの3つでした。

次回は、error.logファイルが存在しなかったときに、ファイルを作成するという処理を追加したいと思います。

エクセルVBAでテキストファイルを新規作成するFileSystemオブジェクトの使い方
エクセルVBAによるマクロの動作状況をログファイルに残す方法をお伝えしています。今回は、書き出し先のテキストファイルの有無を判定して、もし存在しなければ新規作成するという処理を追加していきます。

どうぞお楽しみに!

連載目次:エクセルVBAでマクロの動作状況をログファイルに残す方法

マクロの動作状況やエラーの発生などをログファイルに記録しておきたいときありますよね。本シリーズではFileSystemオブジェクトを使ってログをテキストファイルに書き込む方法についてお伝えしていきます。
  1. エクセルVBAでマクロの動作をログファイルに記録する最も簡単なプログラム
  2. エクセルVBAでテキストファイルを新規作成するFileSystemオブジェクトの使い方
  3. エクセルVBAでエラーが発生したらエラーの内容をログファイルに書き出すプログラム
タイトルとURLをコピーしました