Excel_VBA_Peak Search
https://www.nicovideo.jp/watch/sm45362107
'※※※※※※※※※※※※※ は じ め に ※※※※※※※※※※※※※※※※※※※※
'
'【このマクロは、測定器等で取得したCSVファイルからピークの推移を見るためのものです】
'
' このテキストを全コピーし、 『Ctrl + A』、『Ctrl + C』
' 新規エクセルファイルを開き、 『新規 Microsoft Excelワークシートを開く』
' VBEを開く(※開発タブ(要設定)) 『Alt + F11』
' 標準モジュールを開く 『「Alt」 → 「I」 → 「M」』
' このテキストをコードウィンドウに貼り付け 『Ctrl + V』
' マクロの実行 『F5』
' (途中で固まったときは、再度『F5』押下で続きを頑張ってくれます)
'
' ●「CSVファイル」と同じフォルダに「新規エクセルファイル」を格納してください。
' ●下記の「設定パラメータ」は一度、グラフを描いてから行ってください。
'★☆★☆★☆★☆★☆★☆★ 設定パラメータ ★☆★☆★☆★☆★☆★☆★★☆★☆★☆★
Const 器材タイプ As Byte = 1 '【器材の種類(1:器材A, 2:器材B)】
Const ナンバリングの仕方 As Byte = 2 '【ナンバリングの仕方(1:ゼロパディング, 2: 整数の連番)】
Const データファイル名 As String = "Data" '【「任意の文字列+間の文字+連番」の「任意の文字列」の部分を入力】
' 例:「Data20250901_001.csv」では、"Data20250901"のように入力(※ダブルクォーテーションで囲う)
Const 開始番号 As Long = 1 '【開始番号 (整数)】
Const 終了番号 As Long = 4 '【終了番号 (整数)】
Const データ切抜上部 As Long = 2 '【データ切抜上部(2以上の整数)(生データシートに貼り付けた際の行番号)】
Const データ切抜下部 As Long = 100 '【データ切抜下部(データポイント数+1以下の整数)(生データシートに貼り付けた際の行番号)】
Const ピークサーチエリアポイント数 As Long = 9 '【ピークサーチエリアポイント数(※奇数を入力)】
Const ピークサーチしきい値 As Double = 11.3 '【ピークサーチしきい値(小数にも対応)(※数値処理したY軸からノイズフロアを避けるように設定する)】
Const データラベル文字サイズ As Double = 12 '【グラフ; データラベルの文字サイズ(小数対応)】
Const 縦軸最小 As Double = 0 '【グラフ; 「縦軸の最小値」(小数対応)】
Const 縦軸最大 As Double = 25 '【グラフ; 「縦軸の最大値」(小数対応)】
Const 横軸最小 As Double = 0 '【グラフ; 「横軸の最小値」(小数対応)】
Const 横軸最大 As Double = 90 '【グラフ; 「横軸の最大値」(小数対応)】
'★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
Dim 一番下行番号 As Long ' 変数; 生データの一番下の行番号
Dim 切抜一番下行番号 As Long ' 変数; 切抜データの一番下の行番号
Sub Main()
Application.Speech.Speak "しばらくお待ちください", SpeakAsync:=True '★アナウンス
Call OpenCSVAndCopy '★CSVデータの取り込み
Call Calculation '★ログスケールの計算、範囲の指定(切抜)
Call PeakSearch '★ピークサーチ
Call MatomeGraph '★グラフ作成(※ログスケールのグラフが作成されます)
Application.Speech.Speak "処理が終わりました", SpeakAsync:=True '★アナウンス
'_____________________________
MsgBox "「Ctrl + PageUp」,「Ctrl + PageDown」で" _
& vbCrLf & "シートを切り替えることができます" _
& vbCrLf & "" _
& vbCrLf & "" _
& vbCrLf & "" _
& vbCrLf & " ∧ ∧___" _
& vbCrLf & " /(*゚ー゚) /\" _
& vbCrLf & " /| ̄∪∪ ̄ ̄ |\/" _
& vbCrLf & " | OMATASE |/" _
& vbCrLf & "  ̄ ̄ ̄ ̄ ̄" _
, vbOKOnly + vbInformation, "「お待たせしました」"
End Sub
Sub OpenCSVAndCopy() '★CSVデータの取り込み
Sheets("Sheet1").Name = "生データ" 'シート名を変更、Sheet1→「生データ」(※Sheet1というシートがないと、ここで止まります。)
Dim i As Long, j As Long '「iは、ファイルの番号」「jは、列」
Dim str() As Variant
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
'※ CSVファイルのデータの格納の仕方、ファイル名によって下記のArrayの中身を書き換えてください ※
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
' str(0)は、CSVデータの開始行(※ラベルを除く)
' str(1)は、ファイル名「任意の文字列 + 間の文字 + 連番」の「間の文字」の部分
' str(2)は、ゼロパディング桁数
If 器材タイプ = 1 Then '◆1:器材A⇒CSVデータの開始行が2、間の文字が「_」、ゼロパディング桁数が000
str = Array("2", "_", "000")
Else '◆2(その他):器材B⇒CSVデータの開始行が86、間の文字なし、ゼロパディング桁数が0000
str = Array("86", "", "0000")
End If
'開始番号のデータからX軸データをコピー
If ナンバリングの仕方 = 1 Then '◆1:ナンバリングの仕方がゼロパディング
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & データファイル名 & str(1) & Format(開始番号, str(2))
Else '◆2(その他):ナンバリングの仕方が整数の連番
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & データファイル名 & " " & 開始番号
End If
Workbooks(2).Sheets(1).Range(Cells(str(0), 1), Cells(str(0), 1).End(xlDown)).Copy _
Workbooks(1).Sheets(1).Cells(2, 1)
Application.CutCopyMode = False
Workbooks(2).Close
Sheets(1).Cells(1, 1) = "X軸 [単位]"
Sheets("生データ").Select '2列目以降に開始番号~終了番号のCSVファイルのY軸をコピーしていく。
j = 2
For i = 開始番号 To 終了番号
If ナンバリングの仕方 = 1 Then
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & データファイル名 & str(1) & Format(i, str(2))
Else
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & データファイル名 & " " & i
End If
Workbooks(2).Sheets(1).Range(Cells(str(0), 2), Cells(str(0), 2).End(xlDown)).Copy _
Workbooks(1).Sheets(1).Cells(2, j)
Application.CutCopyMode = False
Workbooks(2).Close
Cells(1, j) = i
j = j + 1
Next i
一番下行番号 = Range("A1").End(xlDown).Row '一番下にある行番号を取得
End Sub
Sub Calculation() '★ログスケールの計算、範囲の指定(切抜)
ActiveSheet.Copy After:=ActiveSheet 'シート「ログスケール」追加
ActiveSheet.Name = "ログスケール"
Range(Cells(2, 2), Cells(一番下行番号, 終了番号 - 開始番号 + 2)).FormulaR1C1 = _
"=IF(ISERROR(10*LOG10(生データ!RC)),-120,10*LOG10(生データ!RC))" '対数の計算(エラーが生じたら「-120」を出力する)
Worksheets().Add After:=Worksheets(2) '計算結果のシート「切抜」の作成
ActiveSheet.Name = "切抜"
Application.ScreenUpdating = False '画面更新停止
Sheets("ログスケール").Select '上部のラベルをコピー
Range(Cells(1, 1), Cells(1, 終了番号 - 開始番号 + 2)).Copy Sheets("切抜").Range("A1")
Application.CutCopyMode = False
Dim var1() As Variant '切り抜くセル範囲の値を配列に格納し、貼り付け
var1 = Sheets(2).Range(Cells(データ切抜上部, 1), Cells(データ切抜下部, 終了番号 - 開始番号 + 2)).Value
Sheets("切抜").Select
Sheets("切抜").Range(Cells(2, 1), Cells(データ切抜下部 - データ切抜上部 + 2, 終了番号 - 開始番号 + 2)) = var1
Application.ScreenUpdating = True '画面更新
切抜一番下行番号 = Sheets("切抜").Range("A1").End(xlDown).Row '切抜データの一番下にある行番号を取得
End Sub
Sub PeakSearch() '★ピークサーチ
Worksheets().Add After:=Sheets("切抜") '「ピークサーチ」を行うシートの追加
ActiveSheet.Name = "ピークサーチ"
Worksheets().Add After:=Sheets("ピークサーチ") 'ピークサーチの結果をまとめる「ピークロギング」シートの追加
ActiveSheet.Name = "ピークロギング"
Dim m As Long, n As Long, L As Long
Dim var1() As Variant
n = 1
Application.ScreenUpdating = False '画面更新停止
For m = 開始番号 To 終了番号
Worksheets("ピークサーチ").Cells.Clear 'ピークサーチシートの初期化
Sheets("切抜").Select 'X軸コピー
var1 = Sheets("切抜").Range(Cells(1, 1), Cells(切抜一番下行番号, 1)).Value
Sheets("ピークサーチ").Select
Sheets("ピークサーチ").Range(Cells(1, 1), Cells(切抜一番下行番号, 1)) = var1
Sheets("切抜").Select '切抜シートからコピー
var1 = Sheets("切抜").Range(Cells(2, n + 1), Cells(切抜一番下行番号, n + 1)).Value
Sheets("ピークサーチ").Select
Sheets("ピークサーチ").Range(Cells(2, 2), Cells(切抜一番下行番号, 2)) = var1
Cells(1, 2) = "Peak" & m '[データ]-[フィルター]-[エラー【-120】のデータのみ表示]
Range("$B$1:$B$50002").AutoFilter Field:=1, Criteria1:="-120"
' ↑
' サンプリングポイント数でRangeの調整が必要
'※※※※※※※※※※※※※※※※※※※※※※※※※
Range(Range("A2"), Range("A2").End(xlDown)).EntireRow.Delete 'エラーのデータがある行を削除
Columns("A:A").AutoFilter 'フィルタ解除
Cells(1, 1) = ピークサーチしきい値 'ピークの検出(ピークじゃなければ→#N/A、フィルタ広い範囲設定しているので→空欄あり)
Range(Cells(2 + ((ピークサーチエリアポイント数 - 1) / 2), 3), Cells(切抜一番下行番号 - ((ピークサーチエリアポイント数 - 1) / 2), 3)).FormulaR1C1 = _
"=IF(AND(ピークサーチ!RC[-1]=MAX(ピークサーチ!R[" & -(ピークサーチエリアポイント数 - 1) / 2 & "]C[-1]:R[" & (ピークサーチエリアポイント数 - 1) / 2 & "]C[-1]),ピークサーチ!RC[-1]>R1C1),ピークサーチ!RC[-1],NA())"
Range("$C$1:$C$50002").AutoFilter Field:=1, Criteria1:="=#N/A", Operator:=xlOr, Criteria2:="="
' ↑
' サンプリングポイント数でRangeの調整が必要
'※※※※※※※※※※※※※※※※※※※※※※※※※
Range(Cells(2, 3), Cells(切抜一番下行番号, 3)).EntireRow.Delete '空欄とエラーのデータがある行を削除
Columns("A:A").AutoFilter 'フィルタ解除
var1 = Range("A2:B501").Value 'ピークサーチの結果を「ピークロギング」シートへ
Sheets("ピークロギング").Select
Range(Cells(2, 2 * n - 1), Cells(501, 2 * n)) = var1
Cells(1, 2 * n - 1) = "Peak" & m
n = n + 1
Next m
Application.ScreenUpdating = True '画面更新
End Sub
Sub MatomeGraph() '★グラフ作成(※ログスケールのグラフが作成されます)
Worksheets().Add After:=Sheets("ピークロギング")
ActiveSheet.Name = "まとめグラフ"
Range("A1") = "書きたいメモ"
Range("B2") = "回目"
Range("F1") = "X軸 [単位]"
Range("G1") = "極大値 [単位]"
Range("K1") = "Y軸 [単位]"
With Cells(2, 3) '目印番号付け
.Value = 1
.AutoFill Destination:=Range(Cells(2, 3), Cells(切抜一番下行番号, 3)), Type:=xlFillSeries
End With
ActiveSheet.Spinners.Add(Range("A3").Left, Range("A3").Top, Range("A3:B4").Width, Range("A3:B4").Height).Select 'スピンボタンでグラフの参照範囲いじり
With Selection
.Value = 開始番号
.Min = 開始番号
.Max = 終了番号
.SmallChange = 1
.LinkedCell = "$A$2"
.Display3DShading = True
End With
Range("A8") = 開始番号 'グラフの参照範囲のインデックス
Range("A5").FormulaR1C1 = "=R[-3]C - R[3]C + 2"
Range("A6").FormulaR1C1 = "=2*(R[-4]C - R[2]C + 1)"
Range("A7").FormulaR1C1 = "=R[-1]C-1"
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
'※ ↑ 当初、下記のようにしていましたが、番号「0」を入れるとエラーになるため
'※ ↑ 開始番号を外に出しています。
'※ Range("A5").FormulaR1C1 = "=R[-3]C " & -開始番号 + 2 & ""
'※ Range("A6").FormulaR1C1 = "=2*(R[-4]C " & -開始番号 + 1 & ")"
'※ Range("A7").FormulaR1C1 = "=R[-1]C-1"
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
'X軸の参照
Range(Cells(2, 6), Cells(501, 6)).FormulaR1C1 = _
"=IF(INDEX(ピークロギング!R2C1:R501C[" & 2 * (終了番号 - 開始番号 + 1) - 5 & "],まとめグラフ!RC3,R7C1)=0,NA(),INDEX(ピークロギング!R2C1:R501C[" & 2 * (終了番号 - 開始番号 + 1) - 5 & "],まとめグラフ!RC3,R7C1))"
'ピーク値の参照
Range(Cells(2, 7), Cells(501, 7)).FormulaR1C1 = _
"=IF(INDEX(ピークロギング!R2C1:R501C[" & 2 * (終了番号 - 開始番号 + 1) - 6 & "],まとめグラフ!RC3,R6C1)=0,NA(),INDEX(ピークロギング!R2C1:R501C[" & 2 * (終了番号 - 開始番号 + 1) - 6 & "],まとめグラフ!RC3,R6C1))"
Dim var1() As Variant
'切抜X軸の参照
Sheets("切抜").Select
var1 = Sheets("切抜").Range(Cells(1, 1), Cells(切抜一番下行番号, 1)).Value
Sheets("まとめグラフ").Select
Sheets("まとめグラフ").Range(Cells(1, 10), Cells(切抜一番下行番号, 10)) = var1
'切抜Y軸の参照
Range(Cells(2, 11), Cells(切抜一番下行番号, 11)).FormulaR1C1 = _
"=IF(INDEX(切抜!R2C1:R50002C[" & 終了番号 - 開始番号 + 2 & "],まとめグラフ!RC3,R5C1)=0,NA(),INDEX(切抜!R2C1:R50002C[" & 終了番号 - 開始番号 + 2 & "],まとめグラフ!RC3,R5C1))"
'列の間隔の調整
Range("B:C").ColumnWidth = 5
Range("D:E,H:I").ColumnWidth = 0.54
Range("F:F").ColumnWidth = 15
Range("G:G").ColumnWidth = 11.5
Range("J:J").ColumnWidth = 15
Range("K:K").ColumnWidth = 18
'ピークの最大値をピンクに塗りつぶし(条件付き書式 ランキング優勝した値をピンクに塗りつぶし)
Range(Cells(2, 7), Cells(501, 7)).Select
Selection.FormatConditions.AddTop10
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1)
.TopBottom = xlTop10Top
.Rank = 1
.Percent = False
End With
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 16751103 'ピンクは「16751103」、赤色は「255」
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
'まとめグラフ
ActiveSheet.Shapes.AddChart.Select 'ピークの散布図挿入
ActiveChart.ChartType = xlXYScatter
ActiveChart.SeriesCollection(1).XValues = "=まとめグラフ!$J$2:$J$50001"
ActiveChart.SeriesCollection(1).Values = "=まとめグラフ!$K$2:$K$50001"
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(2).XValues = "=まとめグラフ!$F$2:$F$501"
ActiveChart.SeriesCollection(2).Values = "=まとめグラフ!$G$2:$G$501"
ActiveChart.SeriesCollection(2).Select 'データラベルの追加
ActiveChart.SetElement (msoElementDataLabelTop)
ActiveChart.SeriesCollection(2).DataLabels.Select
Selection.ShowCategoryName = True
Selection.ShowValue = False
Selection.Format.TextFrame2.TextRange.Font.Size = データラベル文字サイズ
Selection.Orientation = 90 '←←90度回転させています
ActiveChart.Axes(xlValue).MinimumScale = 縦軸最小 '軸の設定
ActiveChart.Axes(xlValue).MaximumScale = 縦軸最大
ActiveChart.Axes(xlValue).CrossesAt = 縦軸最小
ActiveChart.Axes(xlCategory).MinimumScale = 横軸最小
ActiveChart.Axes(xlCategory).MaximumScale = 横軸最大
ActiveChart.Axes(xlCategory).CrossesAt = 横軸最小
ActiveChart.SeriesCollection(1).Select '線の編集
Selection.MarkerStyle = -4142
Selection.Format.Fill.Visible = msoFalse
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
End With
With Selection.Format.Line
.Visible = msoTrue
.Weight = 1
End With
With ActiveSheet.ChartObjects("グラフ 1") 'グラフの移動・拡大
.Top = Range("L1").Top
.Left = Range("L1").Left
.Width = Range("L1:AA29").Width
.Height = Range("L1:AA29").Height
End With
' ↑
' 見やすいようにグラフ範囲を調整
'※※※※※※※※※※※※※※※※※※※
ActiveChart.Legend.Select '凡例の設定
Selection.Delete
End Sub
Sub main2()
' このコードを標準モジュールに貼り付けたら
Call Main ' そのまま「F5」を押して下さい。マクロを実行できます。
' ※途中でやめたいときは、キーボード左上にある「Esc」を押下
End Sub
「Data 1.csv」と「Data 3.csv」は{X,Y1}、
「Data 2.csv」と「Data 4.csv」は{X,Y2}を格納しています。
「DATA_001.csv」と「DATA_003.csv」は{X,Y1}、
「DATA_002.csv」と「DATA_004.csv」は{X,Y2}を格納しています。
\( X \) | \( Y1 \) | \( Y2 \) |
---|---|---|
\( 1 \) | \( 45 \) | \( 14.71 \) |
\( 2 \) | \( 58 \) | \( 9.03 \) |
\( 3 \) | \( 39 \) | \( 10.95 \) |
\( 4 \) | \( 39 \) | \( 7.69 \) |
\( 5 \) | \( 57 \) | \( 8.60 \) |
\( 6 \) | \( 48 \) | \( 15.40 \) |
\( 7 \) | \( 46 \) | \( 16.57 \) |
\( 8 \) | \( 53 \) | \( 9.00 \) |
\( 9 \) | \( 47 \) | \( 9.32 \) |
\( 10 \) | \( 34 \) | \( 8.82 \) |
\( 11 \) | \( 41 \) | \( 10.78 \) |
\( 12 \) | \( 50 \) | \( 9.96 \) |
\( 13 \) | \( 55 \) | \( 9.31 \) |
\( 14 \) | \( 48 \) | \( 15.50 \) |
\( 15 \) | \( 31 \) | \( 11.06 \) |
\( 16 \) | \( 42 \) | \( 7.29 \) |
\( 17 \) | \( 42 \) | \( 9.98 \) |
\( 18 \) | \( 41 \) | \( 9.68 \) |
\( 19 \) | \( 55 \) | \( 10.24 \) |
\( 20 \) | \( 49 \) | \( 10.12 \) |
\( 21 \) | \( 63 \) | \( 14.89 \) |
\( 22 \) | \( 58 \) | \( 14.81 \) |
\( 23 \) | \( 78 \) | \( 10.64 \) |
\( 24 \) | \( 51 \) | \( 12.37 \) |
\( 25 \) | \( 62 \) | \( 12.05 \) |
\( 26 \) | \( 51 \) | \( 9.96 \) |
\( 27 \) | \( 51 \) | \( 10.53 \) |
\( 28 \) | \( 61 \) | \( 16.08 \) |
\( 29 \) | \( 94 \) | \( 19.66 \) |
\( 30 \) | \( 64 \) | \( 16.77 \) |
\( 31 \) | \( 72 \) | \( 19.31 \) |
\( 32 \) | \( 43 \) | \( 19.33 \) |
\( 33 \) | \( 71 \) | \( 17.27 \) |
\( 34 \) | \( 47 \) | \( 16.43 \) |
\( 35 \) | \( 66 \) | \( 21.26 \) |
\( 36 \) | \( 94 \) | \( 23.09 \) |
\( 37 \) | \( 48 \) | \( 11.19 \) |
\( 38 \) | \( 41 \) | \( 16.83 \) |
\( 39 \) | \( 54 \) | \( 17.80 \) |
\( 40 \) | \( 60 \) | \( 10.88 \) |
\( 41 \) | \( 71 \) | \( 11.54 \) |
\( 42 \) | \( 89 \) | \( 17.42 \) |
\( 43 \) | \( 101 \) | \( 23.69 \) |
\( 44 \) | \( 123 \) | \( 12.86 \) |
\( 45 \) | \( 98 \) | \( 14.89 \) |
\( 46 \) | \( 104 \) | \( 14.48 \) |
\( 47 \) | \( 130 \) | \( 13.38 \) |
\( 48 \) | \( 106 \) | \( 12.64 \) |
\( 49 \) | \( 85 \) | \( 13.35 \) |
\( 50 \) | \( 76 \) | \( 17.63 \) |
\( 51 \) | \( 96 \) | \( 12.76 \) |
\( 52 \) | \( 108 \) | \( 10.56 \) |
\( 53 \) | \( 73 \) | \( 14.30 \) |
\( 54 \) | \( 98 \) | \( 14.26 \) |
\( 55 \) | \( 105 \) | \( 13.75 \) |
\( 56 \) | \( 139 \) | \( 15.65 \) |
\( 57 \) | \( 91 \) | \( 13.51 \) |
\( 58 \) | \( 100 \) | \( 9.20 \) |
\( 59 \) | \( 102 \) | \( 15.52 \) |
\( 60 \) | \( 88 \) | \( 11.70 \) |
\( 61 \) | \( 92 \) | \( 14.92 \) |
\( 62 \) | \( 69 \) | \( 16.83 \) |
\( 63 \) | \( 113 \) | \( 17.18 \) |
\( 64 \) | \( 95 \) | \( 16.52 \) |
\( 65 \) | \( 89 \) | \( 16.04 \) |
\( 66 \) | \( 87 \) | \( 10.62 \) |
\( 67 \) | \( 103 \) | \( 12.77 \) |
\( 68 \) | \( 71 \) | \( 12.31 \) |
\( 69 \) | \( 74 \) | \( 15.34 \) |
\( 70 \) | \( 131 \) | \( 20.26 \) |
\( 71 \) | \( 106 \) | \( 12.88 \) |
\( 72 \) | \( 96 \) | \( 14.36 \) |
\( 73 \) | \( 101 \) | \( 17.36 \) |
\( 74 \) | \( 120 \) | \( 13.64 \) |
\( 75 \) | \( 116 \) | \( 11.18 \) |
\( 76 \) | \( 110 \) | \( 12.83 \) |
\( 77 \) | \( 152 \) | \( 13.74 \) |
\( 78 \) | \( 116 \) | \( 11.18 \) |
\( 79 \) | \( 134 \) | \( 10.87 \) |
\( 80 \) | \( 83 \) | \( 11.81 \) |
\( 81 \) | \( 94 \) | \( 13.74 \) |
\( 82 \) | \( 101 \) | \( 11.05 \) |
\( 83 \) | \( 74 \) | \( 13.64 \) |
\( 84 \) | \( 113 \) | \( 16.82 \) |
\( 85 \) | \( 86 \) | \( 13.69 \) |
\( 86 \) | \( 99 \) | \( 12.79 \) |
\( 87 \) | \( 104 \) | \( 12.08 \) |
\( 88 \) | \( 80 \) | \( 11.86 \) |