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 = 35 Const INTERVAL_COLUMN = 3 Const VMSTATLOG_ROW = 21 Const VMSTATLOG_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(VMSTATLOG_ROW, VMSTATLOG_COLUMN) Dim intRow As Integer Dim intFileNo As Integer Dim buff As String Dim strArray() 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 ' ' スペースで分割 ' strArray = Split(buff) n = UBound(strArray) ' ' 日付フォーマットの場合は日付処理 ' If Mid$(buff, 5, 1) = "/" And Mid$(buff, 8, 1) = "/" Then intRow = intRow + 1 If Sheets("Mem").Range("A1").Offset(intRow, 0) = buff Then Flag = True Else Flag = False Sheets("Mem").Range("A1").Offset(intRow, 0) = buff Sheets("CPU").Range("A1").Offset(intRow, 0) = buff End If ' ' PID のヘッダ部分は読み飛ばす ' ElseIf Mid$(buff, 1, 5) = " PID" Then ' Wall などの行は読み飛ばす ' ElseIf Mid$(buff, 15, 1) <> "." Then ' ' そうでない場合は空白区切りで pid, ppid, CPU, メモリ, プロセス名 を取り出す ' ElseIf Flag = False Then For i = 0 To n If strArray(i) <> "" Then pid = strArray(i) i = i + 1 Exit For End If Next i For i = i To n If strArray(i) <> "" Then ppid = strArray(i) i = i + 1 Exit For End If Next i For i = i To n If strArray(i) <> "" Then cpu = strArray(i) i = i + 1 Exit For End If Next i For i = i To n If strArray(i) <> "" Then memory = strArray(i) i = i + 1 Exit For End If Next i For i = i To n If strArray(i) <> "" Then process = strArray(i) i = i + 1 Exit For End If Next i For i = i To n If strArray(i) <> "" Then process = process & " " & strArray(i) End If Next i ' ' プロセス名が合致するかを検索 ' If Table.Exists(process) Then p = Table.Item(process) Else p = Table.Count + 1 Table.Add process, p Sheets("Mem").Range("A1").Offset(0, p) = process Sheets("CPU").Range("A1").Offset(0, p) = process End If Sheets("Mem").Range("A1").Offset(intRow, p) = Sheets("Mem").Range("A1").Offset(intRow, p) + memory Sheets("CPU").Range("A1").Offset(intRow, p) = Sheets("CPU").Range("A1").Offset(intRow, p) + cpu End If Loop Close intFileNo Charts("Mem(Graph)").SetSourceData Source:=Sheets("Mem").UsedRange, PlotBy:=xlColumns Charts("CPU(Graph)").SetSourceData Source:=Sheets("CPU").UsedRange, PlotBy:=xlColumns End Sub Sub クリア() Table.RemoveAll Sheets("Mem").Range("A1:IV65536").ClearContents Sheets("CPU").Range("A1:IV65536").ClearContents Charts("Mem(Graph)").SetSourceData Source:=Sheets("Mem").UsedRange, PlotBy:=xlColumns Charts("CPU(Graph)").SetSourceData Source:=Sheets("CPU").UsedRange, PlotBy:=xlColumns End Sub