みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
ExcelVBAによるマクロの動作状況をログファイルに残す方法についてシリーズでお伝えしています。
前回の記事はコチラ。
指定のテキストファイルにログを書き出す簡単なプログラムを紹介しました。
今回ですが、書き出し先のログファイルが指定のフォルダに存在しなかった場合の処理を追加してみたいと思います。
FileSystemオブジェクトを使っていると、この部分の処理がスッキリ簡単にできちゃいます。
ということで、エクセル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
マクロを仕込んでいるエクセルファイルと同階層にある「error.log」というテキストファイルに、タイムスタンプとともに「エラーが発生しました」というログを追加するという内容です。
OpenTextFileで「error.log」をTextStreamオブジェクトとして取り扱えるように開き、その最後尾にWriteLineで指定の内容を一行書き込むという流れになります。
ログファイルが存在していない場合
上記のプログラムですが、指定の場所にファイル「error.log」 が存在していない場合は、以下のように「実行時エラー ’53’: ファイルが見つかりません。」というエラーメッセージが表示されます。
今回は、ログファイルが存在していようがいまいがログ出力が正しく動作するように、ログファイルの存在を判定する処理を追加していきたいと思います。
ログファイルの存在を判定する
まず、ログファイルが存在するかどうかを判定するには、FileSystemオブジェクトのFileExistsメソッドを使います。
ファイルが存在していればTrue、そうでなければFalseが返ります。
以下記事で詳細お伝えしています。
ですから上記のプログラムの5行目以降に
If Not objFso.FileExists(ThisWorkbook.Path & "\error.log") Then
'ファイルを新規作成する処理"
End If
を挿入すれば良いということになります。
あとはファイルを新規作成する処理が必要ですね。
CreateTextFileメソッドでテキストファイルを新規作成する
FileSystemオブジェクトではテキストファイルを新規で作成することもできます。CreateTextFileメソッドです。
書き方はこちら。
ファイルパスはファイル名までを指定します。
以上をまとめると、全体のプログラムは以下のようになりますね。
Sub writeLog()
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
Dim strPath As String
strPath = ThisWorkbook.Path & "\error.log"
With objFso
If Not .FileExists(strPath) Then
.CreateTextFile (strPath)
End If
With .OpenTextFile(strPath, 8) '8:ForAppending
.WriteLine Now & vbTab & "エラーが発生しました "
.Close
End With
End With
Set objFso = Nothing
End Sub
同じファイルパスが何度も出てくるので変数にまとめたのと、Withステートメントを使ってobjFsoでくくりました。
実行しますと、ファイルが存在していない場合でも、以下のようにファイル「error.log」が生成されて
error.logの中身をエディタで見てみますと、以下のようにしっかりとログが記録されます。
まとめ
エクセルVBAのFileSystemオブジェクトを使って、ログファイルが存在しているかを判別して、ない場合は新規作成をする方法についてお伝えしました。
- ファイルの存在を判定するFileExistsメソッド
- 新規のテキストファイルを作成するCreateTextFileメソッド
がポイントです。FileSystemオブジェクト、便利ですね。
さて次回ですが、エラーログを記録する方法についてお伝えしたいと思います。
どうぞお楽しみに!