システムでエラーが発生したときにファイルにエラーログを出力する方法です。
参照設定
まず、今回ファイルの作成やフォルダの作成にFileSystemObjectオブジェクトを使ので参照設定で「Microsoft Scripting Runtime」を選択してください。
標準モジュール
次に標準モジュールに下記のように記述します。'Win32API
Private Declare Sub GetLocalTime Lib "kernel32" (lpSystem As SYSTEMTIME)
'構造体
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
'エラーログ作成
Public Sub MakeErrorLog(ByRef errObj As ErrObject, _
ByVal procName As String)
Dim errNumber As Long
Dim errDescription As String
Dim messageLog As String
'エラー情報を保管
errNumber = errObj.Number
errDescription = errObj.Description
'エラーを消去
errObj.Clear
messageLog = "【エラー番号】" & errNumber & _
" 【詳細】" & errDescription & _
" 【発生場所】" & procName
'書き込み
Call WriteLog(messageLog)
'メッセージボックス表示
MsgBox errNumber & Space(2) & errDescription, vbCritical, "エラー"
End Sub
'ログ出力
Private Sub WriteLog(ByVal message As String)
On Error GoTo ErrorTrap
Dim ts, fso As FileSystemObject
Dim projectPath As String
Dim logFolder As String
Dim logFile As String
Dim logFileName As String
Dim sysLocalTime As SYSTEMTIME
'現在時刻を取得
GetLocalTime sysLocalTime
'ログファイル名
logFileName = "error.log"
'プロジェクトパスを取得
projectPath = CurrentProject.Path
'ログ格納フォルダ
logFolder = projectPath & "\Log"
'FileSystemObjectオブジェクトを作成する
Set fso = CreateObject("Scripting.FileSystemObject")
'ログ格納フォルダの確認(なければ作成)
If fso.FolderExists(logFolder) = False Then
Call fso.CreateFolder(logFolder)
End If
'ログファイルフルパス名
logFile = logFolder & "\" & logFileName
'追記モードでファイルオープン
Set ts = fso.OpenTextFile(logFile, ForAppending, True)
'書き込み
Call ts.WriteLine("[" & sysLocalTime.wYear & "/" & _
Format(sysLocalTime.wMonth, "00") & "/" & _
Format(sysLocalTime.wDay, "00") & " " & _
Format(sysLocalTime.wHour, "00") & ":" & _
Format(sysLocalTime.wMinute, "00") & ":" & _
Format(sysLocalTime.wSecond, "00") & "." & _
Format(sysLocalTime.wMilliseconds, "000") & "] " & message)
'ファイルクローズ
ts.Close
Set ts = Nothing
Set fso = Nothing
Exit Sub
ErrorTrap:
MsgBox Err.Number & Space(2) & Err.Description, vbCritical, "エラー"
End Sub
今回、MakeErrorLogの引数にErrオブジェクトを渡してエラー番号とエラーの詳細をログに出力するようにしています。また、プロシージャ名を渡してどこでエラーが発生したかもログに残すようにしています。実際のファイルに出力する部分は、FileSystemObjectオブジェクトを使って行っています。ファイルは追記モードで開き、発生時刻はWin32APIを使いミリ秒まで出すようにしました。
使用例
実際に使用するときは下記のように記述してください。引数にErrオブジェクトとプロシージャ名を渡します。Public Sub ErrorLogTest()
On Error GoTo Err_Trap
Dim a As Long
a = 30 / 0
MsgBox "a = " & a
Exit Sub
Err_Trap:
Call MakeErrorLog(Err, "ErrorGotoTest")
End Sub
出力結果

スポンサーリンク