' ' 初期設定値 ' Const JVMSTATINTERVAL_ROW = 11 ' jvmstatコマンドの間隔セルの行番号 Const JVMSTATINTERVAL_COLUMN = 9 ' jvmstatコマンドの間隔セルの列番号 Const INTERVAL_ROW = 35 ' 監視間隔を入力するセルの行番号 Const INTERVAL_COLUMN = 3 ' 監視間隔を入力するセルの列番号 Const JVMSTATLOG_ROW = 21 ' jvmstatファイル名を入力するセルの行番号 Const JVMSTATLOG_COLUMN = 3 ' jvmstatファイル名を入力するセルの行番号 Const STARTTIME_ROW = 15 ' 開始時刻セルの行番号 Const STARTTIME_COLUMN = 3 ' 開始時刻セルの列番号 Const DEFAULT_INTERVAL_MIN = 1 ' 監視間隔のデフォルト(分) Dim Table As Variant Private Sub Worksheet_Activate() Static InitFlag As Boolean If InitFlag <> True Then InitFlag = True Sheets("使用方法").ToggleButton1.Value = False Sheets("使用方法").ToggleButton1.Caption = "監視開始" Set Table = CreateObject("Scripting.Dictionary") End If End Sub Private Sub CommandButton1_Click() ' ' 監視実行 ' Call jvmstatデータ読込 End Sub Private Sub CommandButton2_Click() Call クリア End Sub Private Sub ToggleButton1_Click() If ToggleButton1.Value = True Then ToggleButton1.Caption = "監視停止" Call 監視開始 Else ToggleButton1.Caption = "監視開始" End If End Sub Sub 監視開始() Dim Interval_min As Integer ' 監視間隔(数値) Dim TimeString As String ' 監視間隔(XX:XX 形式) ' ' マクロ動作をユーザーに意識させない ' Application.ScreenUpdating = False ' ' 監視間隔値の取得 ' Interval_min = Workbooks(ThisWorkbook.Name).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, "Sheet1.監視開始" ' ' 監視実行 ' If Workbooks(ThisWorkbook.Name).Sheets("使用方法").ToggleButton1.Value = True Then Call jvmstatデータ読込 End If End Sub Private Sub jvmstatデータ読込() ' ' 初期設定 ' Dim intIndex As Integer ' 配列の列(jvmstat の各項目に対応) Dim intRow As Integer ' 配列の行(jvmstat の行に対応) Dim intFileNo As Integer ' ファイル番号 Dim strText As String ' ファイルから1行読み込んだ内容 Dim noSpace As String ' 連続した空白を1つの空白に置換した内容となる Dim JvmstatFile As String ' jvmstat のログファイル名 Dim strArray() As String ' 空白区切りで配列にしたもの ' ' マクロ動作をユーザーに意識させない ' Application.ScreenUpdating = False If IsObject(Table) = False Then Set Table = CreateObject("Scripting.Dictionary") End If With Workbooks(ThisWorkbook.Name) ' ' 「使用方法」シートより jvmstat 結果のファイル名を取り出す ' JvmstatFile = .Sheets("使用方法").Cells(JVMSTATLOG_ROW, JVMSTATLOG_COLUMN) ' ' 「使用方法」シートより測定間隔を取り出す ' JvmstatInterval = .Sheets("使用方法").Cells(JVMSTATINTERVAL_ROW, JVMSTATINTERVAL_COLUMN) / 24 / 60 / 60 ' ' 「データ」シートの B3 セルから jvmstat の内容をロードする。 ' intFileNo = FreeFile Open JvmstatFile For Input Access Read As intFileNo Do Until EOF(intFileNo) ' ' 1行ずつ取り出し ' Line Input #intFileNo, strText ' ' 連続した空白をカット ' noSpace = "" For i = 1 To Len(strText) If Mid$(strText, i, 2) <> " " Then noSpace = noSpace & Mid$(strText, i, 1) End If Next ' ' 空白区切りで配列に展開 ' strArray = Split(Trim(noSpace), " ") ' ' ヘッダ部分は読み飛ばし、そうでない部分はセルに格納 ' If noSpace = "" Then ElseIf strArray(0) = "S0C" Then ElseIf UBound(strArray) <> 14 Or Val(strArray(0)) <= 0 Then Else If intRow = 0 Then .Sheets("Data").Cells(intRow + 2, 1) = .Sheets("使用方法").Cells(STARTTIME_ROW, STARTTIME_COLUMN) Else .Sheets("Data").Cells(intRow + 2, 1) = .Sheets("Data").Cells(intRow + 1, 1) + JvmstatInterval End If For intIndex = 0 To UBound(strArray) .Sheets("Data").Range("B2").Offset(intRow, intIndex) = strArray(intIndex) Next intIndex If intRow = 0 Then .Sheets("Data").Range("Q2") = 0 .Sheets("Data").Range("R2") = 0 Else .Sheets("Data").Range("Q2").Offset(intRow, 0) = .Sheets("Data").Range("M2").Offset(intRow, 0) - .Sheets("Data").Range("M2").Offset(intRow - 1, 0) .Sheets("Data").Range("R2").Offset(intRow, 0) = .Sheets("Data").Range("O2").Offset(intRow, 0) - .Sheets("Data").Range("O2").Offset(intRow - 1, 0) End If intRow = intRow + 1 End If Loop ' ' ファイルのクローズ ' Close intFileNo RowMax = Mid$(Str$(.Sheets("Data").UsedRange.Rows.Count), 2) ECU = "A1:A" + RowMax + ",F1:F" + RowMax + ",G1:G" + RowMax S0 = "A1:A" + RowMax + ",B1:B" + RowMax + ",D1:D" + RowMax S1 = "A1:A" + RowMax + ",C1:C" + RowMax + ",E1:E" + RowMax OCU = "A1:A" + RowMax + ",H1:H" + RowMax + ",I1:I" + RowMax PCU = "A1:A" + RowMax + ",J1:J" + RowMax + ",K1:K" + RowMax GCT = "A1:A" + RowMax + ",M1:M" + RowMax + ",O1:O" + RowMax + ",P1:P" + RowMax HEAP = "A1:A" + RowMax + ",B1:B" + RowMax + ",C1:C" + RowMax + ",D1:D" + RowMax + ",E1:E" + RowMax + ",F1:F" + RowMax + ",G1:G" + RowMax + ",H1:H" + RowMax + ",I1:I" + RowMax DELTA = "A1:A" + RowMax + ",Q1:Q" + RowMax + ",R1:R" + RowMax .Charts("EC,EU").SetSourceData Source:=.Sheets("Data").Range(ECU), PlotBy:=xlColumns .Charts("S0C,S0U").SetSourceData Source:=.Sheets("Data").Range(S0), PlotBy:=xlColumns .Charts("S1C,S1U").SetSourceData Source:=.Sheets("Data").Range(S1), PlotBy:=xlColumns .Charts("OC,OU").SetSourceData Source:=.Sheets("Data").Range(OCU), PlotBy:=xlColumns .Charts("PC,PU").SetSourceData Source:=.Sheets("Data").Range(PCU), PlotBy:=xlColumns .Charts("GCT").SetSourceData Source:=.Sheets("Data").Range(GCT), PlotBy:=xlColumns .Charts("ΔGCT").SetSourceData Source:=.Sheets("Data").Range(DELTA), PlotBy:=xlColumns .Charts("HEAP").SetSourceData Source:=.Sheets("Data").Range(HEAP), PlotBy:=xlColumns For no = 2 To .Sheets.Count .Sheets(no).Visible = xlSheetVisible Next no For no = 1 To .Charts.Count .Charts(no).Visible = xlSheetVisible Next no End With End Sub Private Sub クリア() With Workbooks(ThisWorkbook.Name) .Sheets("Data").Range("A2:Z65536").ClearContents For no = 2 To .Sheets.Count .Sheets(no).Visible = xlSheetHidden Next no For no = 1 To .Charts.Count .Charts(no).Visible = xlSheetHidden Next no If IsObject(Table) = True Then Table.RemoveAll End If End With End Sub