イベントビューアでPCの開始と終了、スリープの開始と復帰が分かる
イベントビューアのシステムを見ると、PCの開始時刻や終了時刻を確認できます。スリープの開始と復帰も同様に確認できます。
VBAでこれらの時刻を取得することが可能です。
事前設定
以下のマクロはWindows Management Instrumentation (WMI)を利用しています。
事前にVBA画面のツールメニュー→参照設定で「Microsoft WMI Scriptiong V1.2 Library」を選択する必要があります。
イベントログからPCの開始・終了時刻やスリープの開始・復帰時刻を取得するマクロ
以下の関数はイベントログからPCの開始・終了時刻やスリープの開始・復帰時刻を取得します。
イベントログの取得にはWindows Management Instrumentation (WMI)を利用しています。
実際の用途ではタイムカードのような使い方で日単位で開始時刻と終了時刻を取得したい場合や、PCの動作管理をするために単純に出力したい場合なども用途として考えられるため、ここでは取得方法を主に紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Sub GetStartEndTime() Dim oLocator As New SWbemLocator '// SWbemLocatorクラスオブジェクト Dim oWMI As SWbemServicesEx '// WMIサービスオブジェクト Dim oEventList As SWbemObjectSet '// 検索で抽出した全てのイベント Dim oEvent As SWbemObjectEx '// イベント Dim sQuery As String '// 検索条件 Dim sEventId As String '// イベントID Dim sDateTime As String '// イベント発生日時 Dim dtUtc As Date '// Date型のイベント発生日時(協定世界時) Dim dtJst As Date '// イベント発生日時(日本標準時) '// WMI ' Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set oWMI = oLocator.ConnectServer '// 検索条件:6005=PC起動、6006=PC終了、7001=スリープ開始、7002=スリープ復帰 sQuery = "SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System' AND " sQuery = sQuery & "(EventCode = '6005' OR EventCode = '6006' OR EventCode = '7001' OR EventCode = '7002')" '// イベントログ抽出結果を取得 Set oEventList = oWMI.ExecQuery(sQuery) '// 取得したイベントログ数ループ For Each oEvent In oEventList '// イベントID取得 sEventId = oEvent.EventCode '// 日時取得 sDateTime = Left(oEvent.TimeWritten, 14) '// Date型に変換 dtUtc = CDate( _ Mid(sDateTime, 1, 4) & "/" & Mid(sDateTime, 5, 2) & "/" & Mid(sDateTime, 7, 2) & " " & _ Mid(sDateTime, 9, 2) & ":" & Mid(sDateTime, 11, 2) & ":" & Mid(sDateTime, 13, 2)) '// 標準時間に9時間加算 dtJst = DateAdd("h", 9, dtUtc) Debug.Print sEventId & " " & Format(dtJst, "yyyy/mm/dd hh:mm:ss") Next End Sub |
コード説明
17、18行目でイベントログのSystemから、イベントIDが6005(PC起動)、6006(PC終了)、7001(スリープ開始)、7002(スリープ復帰)のイベントを抽出する条件文を書いています。
あとはその条件に一致したイベントを全て取得し、1イベントごとにイベントIDと日時を取得して出力します。
上にも書きましたが、イベントIDで開始か終了かの判定を行うことで、勤務表のようなフォーマットへの出力も可能になります。
イベントログで取得する時刻はOSによって協定世界時か日本標準時かが異なります。
Windows10はUTC(協定世界時)、Windows7含めそれ以前はJST(日本標準時)が取得されます。
37行目はWindows10の場合はそのままでいいですが、それより過去のOSの場合はコメントアウトしてください。
実行結果
このマクロは抽出する日時範囲を指定していないため、全てのイベントログが対象になります。そのため終わるまでに結構時間が掛かります。
実行すると以下のようにイミディエイトウィンドウに出力されます。
実際に使う場合はここで取得している日時を指定セルに貼り付けたりすることになると思います。