Private Sub CommandButton1_Click() Call ThisWorkbook.データ読込 End Sub Private Sub ToggleButton1_Click() If ToggleButton1.Value = True Then ToggleButton1.Caption = "監視停止" Call ThisWorkbook.監視開始 Else ToggleButton1.Caption = "監視開始" End If End Sub Private Sub CommandButton2_Click() Call ThisWorkbook.クリア End Sub Const INTERVAL_ROW = 30 Const INTERVAL_COLUMN = 3 Const LOG_ROW = 16 Const LOG_COLUMN = 3 Const DEFAULT_INTERVAL_MIN = 5 Dim Table As Variant Private Sub Workbook_Open() Sheets("使用方法").Select Sheets("使用方法").ToggleButton1.Value = False Sheets("使用方法").ToggleButton1.Caption = "監視開始" Set Table = CreateObject("Scripting.Dictionary") End Sub Sub 監視開始() Dim TimeString As String Application.ScreenUpdating = False ' ' 監視間隔値の取得 ' Interval_min = Sheets("使用方法").Cells(INTERVAL_ROW, INTERVAL_COLUMN) If Interval_min <= 0 Or 60 <= Interval_min Then Interval_min = DEFAULT_INTERVAL_MIN End If TimeString = "00:" & Right$("00" & Mid$(Str(Interval_min), 2, Len(Str(Interval_min)) - 1), 2) & ":00" ' ' 次の監視をスケジュール ' StartTime = Now() + TimeValue(TimeString) Application.OnTime StartTime, "ThisWorkbook.監視開始" ' ' 監視実行 ' If Sheets("使用方法").ToggleButton1.Value = True Then Call ThisWorkbook.データ読込 End If End Sub Sub データ読込() Filename = Sheets("使用方法").Cells(LOG_ROW, LOG_COLUMN) Dim intRow As Integer Dim intFileNo As Integer Dim buff As String Dim Flag As Boolean ' 既に日付がある行は True としてスキップ intFileNo = FreeFile intRow = 0 Flag = False Open Filename For Input Access Read As intFileNo Do Until EOF(intFileNo) Line Input #intFileNo, buff ' ' 先頭行の最後に Windows 起動からの Total 時間が記されている ' If Left$(buff, 13) = "Pstat version" Then intRow = intRow + 1 Period = Mid$(buff, 47) If Sheets("Hnd").Range("A1").Offset(intRow, 0) = Period Then Flag = True Else Flag = False Sheets("UserTime").Range("A1").Offset(intRow, 0) = Period Sheets("KernelTime").Range("A1").Offset(intRow, 0) = Period Sheets("Faults").Range("A1").Offset(intRow, 0) = Period Sheets("Commit").Range("A1").Offset(intRow, 0) = Period Sheets("Hnd").Range("A1").Offset(intRow, 0) = Period End If ' ' 4文字目が : でない行は読み飛ばす ' ElseIf Mid$(buff, 4, 1) <> ":" Or Mid$(buff, 7, 1) <> ":" Then ' ' そうでない場合は空白区切りで pid, ppid, CPU, メモリ, プロセス名 を取り出す ' ElseIf Flag = False Then UserTime = Trim(Mid$(buff, 1, 13)) KernelTime = Trim(Mid$(buff, 14, 14)) Faults = Val(Mid$(buff, 34, 9)) Commit = Val(Mid$(buff, 43, 8)) Hnd = Val(Mid$(buff, 54, 5)) process = Mid$(buff, 68) ' ' プロセス名が合致するかを検索 ' If Table.Exists(process) Then p = Table.Item(process) Else p = Table.Count + 1 Table.Add process, p Sheets("UserTime").Range("A1").Offset(0, p) = process Sheets("KernelTime").Range("A1").Offset(0, p) = process Sheets("Faults").Range("A1").Offset(0, p) = process Sheets("Commit").Range("A1").Offset(0, p) = process Sheets("Hnd").Range("A1").Offset(0, p) = process End If worktime = Sheets("UserTime").Range("A1").Offset(intRow, p) Sheets("UserTime").Range("A1").Offset(intRow, p) = UserTime Sheets("UserTime").Range("A1").Offset(intRow, p) = Sheets("UserTime").Range("A1").Offset(intRow, p) + worktime worktime = Sheets("KernelTime").Range("A1").Offset(intRow, p) Sheets("KernelTime").Range("A1").Offset(intRow, p) = KernelTime Sheets("KernelTime").Range("A1").Offset(intRow, p) = Sheets("KernelTime").Range("A1").Offset(intRow, p) + worktime Sheets("Faults").Range("A1").Offset(intRow, p) = Sheets("Faults").Range("A1").Offset(intRow, p) + Faults Sheets("Commit").Range("A1").Offset(intRow, p) = Sheets("Commit").Range("A1").Offset(intRow, p) + Commit Sheets("Hnd").Range("A1").Offset(intRow, p) = Sheets("Hnd").Range("A1").Offset(intRow, p) + Hnd End If Loop Close intFileNo Charts("UserTime(Graph)").SetSourceData Source:=Sheets("UserTime").UsedRange, PlotBy:=xlColumns Charts("KernelTime(Graph)").SetSourceData Source:=Sheets("KernelTime").UsedRange, PlotBy:=xlColumns Charts("Faults(Graph)").SetSourceData Source:=Sheets("Faults").UsedRange, PlotBy:=xlColumns Charts("Commit(Graph)").SetSourceData Source:=Sheets("Commit").UsedRange, PlotBy:=xlColumns Charts("Hnd(Graph)").SetSourceData Source:=Sheets("Hnd").UsedRange, PlotBy:=xlColumns End Sub Sub クリア() Table.RemoveAll Sheets("UserTime").Range("A1:IV65536").ClearContents Sheets("KernelTime").Range("A1:IV65536").ClearContents Sheets("Faults").Range("A1:IV65536").ClearContents Sheets("Commit").Range("A1:IV65536").ClearContents Sheets("Hnd").Range("A1:IV65536").ClearContents Charts("UserTime(Graph)").SetSourceData Source:=Sheets("UserTime").UsedRange, PlotBy:=xlColumns Charts("KernelTime(Graph)").SetSourceData Source:=Sheets("KernelTime").UsedRange, PlotBy:=xlColumns Charts("Faults(Graph)").SetSourceData Source:=Sheets("Faults").UsedRange, PlotBy:=xlColumns Charts("Commit(Graph)").SetSourceData Source:=Sheets("Commit").UsedRange, PlotBy:=xlColumns Charts("Hnd(Graph)").SetSourceData Source:=Sheets("Hnd").UsedRange, PlotBy:=xlColumns End Sub