【ExcelVBA】イベントビューアのテキスト出力されたログを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)

VBAはどうやって覚える?

プログラムのコードが読めないと、参考にしているコードの理解や自分でプログラムを書くときに時間がかかってしまいます。
そんな時は基礎から学ぶと応用もできるようになり自分の作りたいプログラムがスムーズに作れるようになります。

無料でやるならネット上の学習サイトを参考にするといいです。
こちらはVBAの基礎から説明している無料のWEBサイトになります。

>>基礎から学べるWEBサイトを見てみる


過去にネットでの学習でつまずいた方には専門書をオススメします。
本なら基礎から学べる事はもちろん、読者視点で分かりやすい解説になっています。
一人で集中してコツコツ進めたい方は書籍を試してください。



本を読んでもわからない所が多すぎたり、誰かに質問したい場合はオンラインスクールを見てみましょう。
カウンセリングから目的に応じた学習プランと教材を提供してくれるので、プログラミングの敷居がとても低くなります。
誰かに相談できるのは心強いです。

>>オンラインスクールを無料体験で始める


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