イベントビューアのテキスト出力されたログをExcelの表にする

イベントビューアのログを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)

コメント

タイトルとURLをコピーしました