Excel VBA

Excel_VBA_Peak Search

https://www.nicovideo.jp/watch/sm45362107

ピークサーチ

PeakSearch01
                        
                        '※※※※※※※※※※※※※   は じ め に   ※※※※※※※※※※※※※※※※※※※※
                        '
                        '【このマクロは、測定器等で取得した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
                        
                    

使用したデータ

PeakSearch02 PeakSearch03

「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 \)