みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAによるマクロの動作状況については、Debug.Printによるイミディエイトウィンドウへの表示をすることで確認することができます。
ですが、表示したい内容が大量にある場合や、記録として残しておきたいときはどうしたら良いでしょうか?
そんな時は、ログファイルに出力して記録をとっておくという手法がオススメです。
ということで、何回かのシリーズで、ExcelVBAによるマクロの動作状況をログファイルに残す方法をお伝えしたいと思います。
以下記事で紹介しているOpenやCloseなどを使っても実現できるのですが、追々ファイルが存在しなかったときの処理も入れることを想定して、より扱いやすいFileSystemオブジェクトを使う方法にて紹介していきます。
初回の今回は、FileSystemオブジェクトを使ってログファイルに書き出す最も簡単なプログラムを紹介します。
では、行ってみましょう!
FileSystemオブジェクトとその生成と破棄
FileSystemオブジェクトはファイル、フォルダ、ドライブなどを操作するためのオブジェクトです。
なんで、ログファイルの書き込みにFileSystemオブジェクトを使うねんと思われるかも知れませんが、大丈夫です。
FileSystemオブジェクトはログファイル(つまりテキストファイルですが)の書き込みもできちゃう優れもののオブジェクトなのです。
使用する際は、オブジェクトの生成が必要になりますので、以下プログラムがベースとなります。
Sub FSOを使う()
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
'処理
Set objFso = Nothing
End Sub
CreateObjectで生成して、最後は破棄をします。
詳細については以下記事に書いていますので、合わせてご覧下さいね。
テキストファイルにログを記録するプログラム
それで今回ですが、例えば、エラーが発生したときのことを想定して
- タイムスタンプ
- 「エラーが発生しました」
とだけログファイルに蓄積して残していくプログラムを紹介したいと思います。
前提として、既にファイル「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メソッドを使います。
書き方はこうです。
ファイルパスは開くテキストファイルのパスです。フルパスで指定するのが一般的でしょう。
IOモードは以下に表で示すファイルを開くモードを指定します。
定数 | 値 | 内容 |
---|---|---|
ForReading | 1 | ファイルを読み取り専用として開く |
ForWriting | 2 | ファイルを書き込む専用として開く |
ForAppending | 8 | ファイルの最後に追加して書き込む用として開く |
今回は「error.log」にずっと蓄積をすることを想定していますので、「8」を指定しています。
なお、OpenTextFileメソッドで開いたファイルはTextStreamオブジェクトとして取り扱いが可能になります。
WriteLineメソッドでテキストファイルに一行書き込む
次に8行目ですが、開いたTextStreamオブジェクトに一行書き込む処理です。WriteLineメソッドを使います。
書き方はこちら。
これでTextStreamオブジェクトに文字列を書き込んだ上で改行をします。
プログラムでは、Nowで書き込み時点の日時にTabを挿入して「エラーが発生しました」というテキストを文字列として指定しています。
Closeメソッドでテキストファイルを閉じる
Closeメソッドは開いたTextStreamオブジェクトを閉じます。
開いたなら忘れずに閉じましょう。
ログファイルへの出力結果
上記プログラムを二回実行すると、error.logは以下のような内容になります。
無事にタイムスタンプとメッセージが出力されていますね。
まとめ
エクセルVBAでFileSystemオブジェクトを使ってログをテキストファイルに出力する最も簡単なプログラムを紹介しました。
OpenTextFileメソッド、WriteLineメソッド、Closeメソッドの3つでした。
次回は、error.logファイルが存在しなかったときに、ファイルを作成するという処理を追加したいと思います。
どうぞお楽しみに!