システムでエラーが発生したときにファイルにエラーログを出力する方法です。
参照設定
まず、今回ファイルの作成やフォルダの作成に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
出力結果
スポンサーリンク