イベントビューアのログをExcelに読み込むためのコードを書いた。
目視チェックなんてやってられない人は使って欲しい。
読み込むデータのサンプル
イベントビューアのログをwevtutilコマンドでテキスト出力した結果です。
Event[0]: Log Name: System Source: Service Control Manager Date: 2021-06-01T23:05:50.8310000Z Event ID: 7034 Task: N/A Level: エラー Opcode: N/A Keyword: クラシック User: N/A User Name: N/A Computer: user-PC Description: Application Information サービスは予期せぬ原因により終了しました。このサービスの強制終了は 1 回目です。 Event[1]: Log Name: System Source: Service Control Manager Date: 2021-06-01T23:05:50.8310000Z Event ID: 7031 Task: N/A Level: エラー Opcode: N/A Keyword: クラシック User: N/A User Name: N/A Computer: user-PC Description: Group Policy Client サービスは予期せぬ原因により終了しました。このサービスの終了は 1 回目です。次の修正操作が 120000 ミリ秒以内に実行されます: サービスの再開。
動き
サンプルの形式のログを読み込んで、縦に並んでいるログをExcelの表に変えるだけ。
コード
ヘッダ開始リストとヘッダ終了リストの順番を変えたり削ったりすることで結果をカスタマイズできます。
Sub wevtutilのイベントログの取り込み() Const ヘッダ有無 As Boolean = True 'True=ヘッダ有り、false=ヘッダ無し Const シート名 As String = "Sheet1" 開始フラグ文字 = "Event[[]" '新しいイベントのキーとなる文字。 Dim ヘッダ開始リスト As Variant 'ヘッダ名 ヘッダ開始リスト = Array("Log Name: ", "Source: ", "Date: ", "Event ID: ", "Task: ", "Level: ", "Opcode: ", "Keyword: ", "User: ", "User Name: ", "Computer: ", "Description:") Dim ヘッダ終了リスト As Variant 'ヘッダ毎の読み込み終了判定文字。1行の場合は同じヘッダ名を入れる ヘッダ終了リスト = Array("Log Name: ", "Source: ", "Date: ", "Event ID: ", "Task: ", "Level: ", "Opcode: ", "Keyword: ", "User: ", "User Name: ", "Computer: ", "Event[[]") 'ファイル選択 Dim ファイルパス As String ChDir ThisWorkbook.Path ファイルパス = Application.GetOpenFilename 'キャンセルしたら終了 If ファイルパス = "False" Then Exit Sub End If 'テキストファイル読み込みの関数呼び出し Dim ファイルの内容 As Variant ファイルの内容 = ファイルの内容を配列へ格納(ファイルパス) Dim 読み込み中ヘッダ要素番号 As Variant '1行で終了しないヘッダの読み込みフラグ。0以上が読み込み中 読み込み中ヘッダ要素番号 = -1 Dim Count As Long 'イベント数のカウント Count = 0 Dim ヘッダ数 As Long '説明用 ヘッダ数 = UBound(ヘッダ開始リスト) + 1 Dim 出力データ As Variant 'Range貼り付け用配列 ReDim 出力データ(1 To ヘッダ数, 1 To 1) As Variant '第一はヘッダ。第二要素をイベント数分追加する If ヘッダ有無 = True Then Count = Count + 1 出力データ = WorksheetFunction.Transpose(ヘッダ開始リスト) End If For i = 0 To UBound(ファイルの内容) '開始フラグ文字確認 If ファイルの内容(i) Like "*" & 開始フラグ文字 & "*" Then Count = Count + 1 ReDim Preserve 出力データ(1 To ヘッダ数, 1 To Count) As Variant End If '①ヘッダ読み込み中フラグが立ってる(0以上)場合 If 読み込み中ヘッダ要素番号 > -1 Then '終了フラグと一致している場合はフラグを消す If ファイルの内容(i) Like "*" & ヘッダ終了リスト(読み込み中ヘッダ要素番号) & "*" Then 読み込み中ヘッダ要素番号 = -1 'セル内改行で追記していく Else 出力データ(読み込み中ヘッダ要素番号 + 1, Count) = _ 出力データ(読み込み中ヘッダ要素番号 + 1, Count) & vbLf & _ ファイルの内容(i) End If GoTo コンテニュー End If '②ヘッダリストと一致したら値を書き込む処理 For j = 0 To UBound(ヘッダ開始リスト) If ファイルの内容(i) Like "*" & ヘッダ開始リスト(j) & "*" Then 出力データ(j + 1, Count) = Split(ファイルの内容(i), ヘッダ開始リスト(j))(1) '1行で終わらない場合は取得する要素番号を保存 If Not ヘッダ開始リスト(j) = ヘッダ終了リスト(j) Then 読み込み中ヘッダ要素番号 = j End If GoTo コンテニュー End If Next コンテニュー: Next 'シート名が存在しない場合は書き込みされない。 For Each WS In Worksheets If WS.Name = シート名 Then With Worksheets(シート名) 'クリア .Cells.ClearContents '③読み込んだ内容をエクセルに貼り付ける .Range(.Cells(1, 1), .Cells(UBound(出力データ, 2), UBound(出力データ, 1))) = WorksheetFunction.Transpose(出力データ) End With End If Next End Sub Function ファイルの内容を配列へ格納(ファイルパス) Set FSO = CreateObject("Scripting.FileSystemObject") Set テキストファイル = FSO.OpenTextFile(ファイルパス) ファイルの内容を配列へ格納 = Split(テキストファイル.ReadAll, vbLf) テキストファイル.Close End Function
作成中に「実行時エラー’93’:パターン文字列が不正です。」が出た
If ファイルの内容(i) Like “*” & 開始フラグ文字 & “*” Then
ここのLikeで怒られる
直し方
ダメな書き方->開始フラグ文字 = “Event[”
良い書き方->開始フラグ文字 = “Event[[]”
Like演算子にパターンのオプションというのがあって[]を使うことでパターン指定ができるんだけど[しかないから]も書け!って言ってるみたい。[]で包むことで文字として認識したんだね。よかった。
Like 演算子 - Visual Basic
詳細情報: Like 演算子 (Visual Basic)
VBAはどうやって覚える?
プログラムのコードが読めないと、参考にしているコードの理解や自分でプログラムを書くときに時間がかかってしまいます。そんな時は基礎から学ぶと応用もできるようになり自分の作りたいプログラムがスムーズに作れるようになります。
無料でやるならネット上の学習サイトを参考にするといいです。
こちらはVBAの基礎から説明している無料のWEBサイトになります。
>>基礎から学べるWEBサイトを見てみる
過去にネットでの学習でつまずいた方には専門書をオススメします。
本なら基礎から学べる事はもちろん、読者視点で分かりやすい解説になっています。
一人で集中してコツコツ進めたい方は書籍を試してください。
本を読んでもわからない所が多すぎたり、誰かに質問したい場合はオンラインスクールを見てみましょう。
カウンセリングから目的に応じた学習プランと教材を提供してくれるので、プログラミングの敷居がとても低くなります。
誰かに相談できるのは心強いです。
>>オンラインスクールを無料体験で始める