VBScript用の公開スクリプトを元に、Excel等のVBAからWMI(Windows Management Instrumentation)を利用して、指定した1日分のWindowsイベントログを取得できるようにコンバートしたサンプルコードです。
WMIを利用することで、VBAだけでなくVBScriptやPowerShellなど、さまざまな環境からWindowsのシステム情報を操作・取得できます。
事前準備
VBAからWMIスクリプトオブジェクトを利用するため、VBEのメニューから「ツール」>「参照設定」を開き、「Microsoft WMI Scripting V1.2 Library」にチェックを入れる必要があります。
VBAサンプルコード
Sub イベントログからの1日分のイベントの取得()
' 参考: Microsoft WMI Scripting / Win32_NTLogEvent
Const CONVERT_TO_LOCAL_TIME As Boolean = True
Dim dtmStartDate As New WbemScripting.SWbemDateTime
Dim dtmEndDate As New WbemScripting.SWbemDateTime
' 取得対象の日付を設定
Dim DateToCheck As Date
DateToCheck = CDate("2024-11-06")
dtmStartDate.SetVarDate DateToCheck, CONVERT_TO_LOCAL_TIME
dtmEndDate.SetVarDate DateToCheck + 1, CONVERT_TO_LOCAL_TIME
Dim oLocator As SWbemLocator
Dim oService As SWbemServices
Dim colEvents As SWbemObjectSet
Dim objEvent As SWbemObjectEx
Set oLocator = New WbemScripting.SWbemLocator
Set oService = oLocator.ConnectServer(".")
Set colEvents = oService.ExecQuery _
("Select * from Win32_NTLogEvent Where TimeWritten >= '&" _
& dtmStartDate & "' and TimeWritten < '&" & dtmEndDate & "'")
For Each objEvent In colEvents
Debug.Print "Category: " & objEvent.Category
Debug.Print "Computer Name: " & objEvent.ComputerName
Debug.Print "Event Code: " & objEvent.EventCode
Debug.Print "Message: " & objEvent.Message
Debug.Print "Record Number: " & objEvent.RecordNumber
Debug.Print "Source Name: " & objEvent.SourceName
Debug.Print "Time Written: " & objEvent.TimeWritten
Debug.Print "Event Type: " & objEvent.Type
Debug.Print "User: " & objEvent.User
Debug.Print objEvent.LogFile
Debug.Print "-----------------------------------"
Next objEvent
End Sub
注意事項
Windowsのセキュリティ権限やログの規模(件数)によっては、クエリの実行に時間がかかる場合や、管理者権限が必要になる場合があります。実運用ではエラーハンドリングや出力先の変更(イミディエイトウインドウからワークシートへの転記など)を行ってご利用ください。
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月30日
- 変更リンク切れとなったTechNetスクリプトセンターへの参照表記を見直しました。
- 変更VBAコードのblockquoteによる表示崩れを修正し、整形されたHTML構造に更新しました。
