Excel VBA

Excel_VBA_Peak & Dip Search

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

ピーク&ディップサーチ

PeakSearch04
                        

                        '※※※※※※※※※※※※※   は じ め に   ※※※※※※※※※※※※※※※※※※※※
                        '
                        '【このマクロは、測定器等で取得した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 = 1                '【データ切抜上部(整数)】
                        Const データ切抜下部 As Long = 110              '【データ切抜下部(整数)】
                        Const ピークサーチエリアポイント数 As Long = 9    '【ピークサーチエリアポイント数(※奇数を入力)】
                        Const データラベル文字サイズ As Double = 12   '【グラフ; データラベルの文字サイズ(小数対応)】
                        Const 縦軸最小 As Double = 0                '【グラフ; 「縦軸の最小値」(小数対応)】
                        Const 縦軸最大 As Double = 100              '【グラフ; 「縦軸の最大値」(小数対応)】
                        Const 横軸最小 As Double = 0                '【グラフ; 「横軸の最小値」(小数対応)】
                        Const 横軸最大 As Double = 120              '【グラフ; 「横軸の最大値」(小数対応)】
                        '★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
                        Dim 一番下行番号 As Long  '変数; 生データの一番下の行番号

                        Sub Main()
                            Application.Speech.Speak "しばらくお待ちください", SpeakAsync:=True '★アナウンス
                            Call OpenCSVAndCopy '★CSVデータの取り込み、比率の計算
                            Call PeakDipSearch  '★ピーク・ディップサーチ
                            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 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
                            Dim var1() As Variant
                            var1 = Workbooks(2).Sheets(1).Range(Cells(str(0) + データ切抜上部 - 1, 1), Cells(str(0) + データ切抜下部 - 1, 1)).Value
                            Workbooks(2).Close
                            Workbooks(1).Sheets(1).Range(Cells(2, 1), Cells(データ切抜下部 - データ切抜上部 + 2, 1)) = var1
                            Sheets(1).Cells(1, 1) = "X軸 [単位]"
                            Dim i As Long, j As Long, k As Long		'「iは、ファイルの番号」「jは、列」「kは、配列の要素数(比率の計算で使用)」
                            Sheets("比率").Select   'Sheet1の2列目以降に配列上で計算した(Y● / Ref)を貼り付けていく、
                            Dim var2() As Variant, var3() As Variant    'ここで,「var1」にはY●,「var2」にはRef,「var3」には(Y● / Ref)を格納する.
                            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
                                var1 = Workbooks(2).Sheets(1).Range(Cells(str(0) + データ切抜上部 - 1, 2), Cells(str(0) + データ切抜下部 - 1, 2)).Value
                                var2 = Workbooks(2).Sheets(1).Range(Cells(str(0) + データ切抜上部 - 1, 3), Cells(str(0) + データ切抜下部 - 1, 3)).Value
                                Workbooks(2).Close
                                For k = 1 To UBound(var1, 1)
                                    ReDim Preserve var3(k)
                                    var3(k) = var1(k, 1) / var2(k, 1)
                                Next k
                                var3(0) = i
                                Range(Cells(1, j), Cells(データ切抜下部 - データ切抜上部 + 2, j)) = WorksheetFunction.Transpose(var3)
                                Cells(1, j) = i
                                j = j + 1
                            Next i
                            一番下行番号 = Range("A1").End(xlDown).Row    '一番下にある行番号を取得
                        End Sub
                        
                        Sub PeakDipSearch()   '★ピーク・ディップサーチ
                            Worksheets().Add After:=Sheets("比率")    '「作業場」「ピーク」「ディップ」シートの作成
                            ActiveSheet.Name = "作業場"
                            Worksheets().Add After:=Sheets("作業場")
                            ActiveSheet.Name = "ピーク"
                            Worksheets().Add After:=Sheets("ピーク")
                            ActiveSheet.Name = "ディップ"
                            Dim m As Long, n As Long 'mはファイル番号,nは列数
                            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        'ピークの検出(ピークじゃなければ→#N/A、フィルタ広い範囲設定して、空欄とともに削除する)
                                Range(Cells(2 + ((ピークサーチエリアポイント数 - 1) / 2), 3), Cells(一番下行番号 - ((ピークサーチエリアポイント数 - 1) / 2), 3)).FormulaR1C1 = _
                                    "=IF(AND(作業場!RC[-1]>作業場!R[-1]C[-1],作業場!RC[-1]>作業場!R[1]C[-1],作業場!RC[-1]=MAX(作業場!R[" & -(ピークサーチエリアポイント数 - 1) / 2 & "]C[-1]:R[" & (ピークサーチエリアポイント数 - 1) / 2 & "]C[-1])),作業場!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
                                '★ディップサーチ
                                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) = "Dip" & m     'ディップの検出(ディップじゃなければ→#N/A、フィルタ広い範囲設定して、空欄とともに削除する)
                                Range(Cells(2 + ((ピークサーチエリアポイント数 - 1) / 2), 3), Cells(一番下行番号 - ((ピークサーチエリアポイント数 - 1) / 2), 3)).FormulaR1C1 = _
                                    "=IF(AND(作業場!RC[-1]<作業場!R[-1]C[-1],作業場!RC[-1]<作業場!R[1]C[-1],作業場!RC[-1]=MIN(作業場!R[" & -(ピークサーチエリアポイント数 - 1) / 2 & "]C[-1]:R[" & (ピークサーチエリアポイント数 - 1) / 2 & "]C[-1])),作業場!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) = "Dip" & 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("J1") = "X軸 [単位]"
                            Range("K1") = "極小値"
                            Range("N1") = "X軸 [単位]"
                            Range("O1") = "比率"
                            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(502, 6)).FormulaR1C1 = _
                                "=IF(INDEX(ピーク!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 5 & "],RC3,R7C1)=0,NA()," & _
                                    "INDEX(ピーク!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 5 & "],RC3,R7C1))"
                            '極大値[%]の参照
                            Range(Cells(2, 7), Cells(502, 7)).FormulaR1C1 = _
                                "=IF(INDEX(ピーク!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 6 & "],RC3,R6C1)=0,NA()," & _
                                    "INDEX(ピーク!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 6 & "],RC3,R6C1)*100)"
                            '極小値X軸の参照
                            Range(Cells(2, 10), Cells(502, 10)).FormulaR1C1 = _
                                "=IF(INDEX(ディップ!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 9 & "],RC3,R7C1)=0,NA()," & _
                                    "INDEX(ディップ!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 9 & "],RC3,R7C1))"
                            '極小値[%]の参照
                            Range(Cells(2, 11), Cells(502, 11)).FormulaR1C1 = _
                                "=IF(INDEX(ディップ!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 10 & "],RC3,R6C1)=0,NA()," & _
                                    "INDEX(ディップ!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 10 & "],RC3,R6C1)*100)"
                            Dim var1() As Variant
                            Sheets("比率").Select     'X軸の参照
                            var1 = Sheets("比率").Range(Cells(1, 1), Cells(一番下行番号, 1)).Value
                            Sheets("比率リニアグラフ").Select
                            Sheets("比率リニアグラフ").Range(Cells(1, 14), Cells(一番下行番号, 14)) = var1
                            '比率[%]の参照
                            Range(Cells(2, 15), Cells(一番下行番号, 15)).FormulaR1C1 = _
                                "=IF(INDEX(比率!R2C1:R50002C[" & 終了番号 - 開始番号 - 13 & "],RC3,R5C1)=0,NA()," & _
                                    "INDEX(比率!R2C1:R50002C[" & 終了番号 - 開始番号 - 13 & "],RC3,R5C1)*100)"
                            '列の間隔の調整
                            Range("A:C").ColumnWidth = 5
                            Range("D:E,H:I,L:M").ColumnWidth = 0.54
                            Range("F:F,J:J,N:N").ColumnWidth = 15
                            Range("G:G,K:K,O:O").ColumnWidth = 11.5
                            'まとめグラフ
                            ActiveSheet.Shapes.AddChart.Select      '散布図挿入
                            ActiveChart.ChartType = xlXYScatter
                            ActiveChart.SeriesCollection(1).XValues = "=比率リニアグラフ!$N$2:$N$50002"
                            ActiveChart.SeriesCollection(1).Values = "=比率リニアグラフ!$O$2:$O$50002"
                            ActiveChart.SeriesCollection.NewSeries
                            ActiveChart.SeriesCollection(2).XValues = "=比率リニアグラフ!$F$2:$F$502"
                            ActiveChart.SeriesCollection(2).Values = "=比率リニアグラフ!$G$2:$G$502"
                            ActiveChart.SeriesCollection.NewSeries
                            ActiveChart.SeriesCollection(3).XValues = "=比率リニアグラフ!$J$2:$J$502"
                            ActiveChart.SeriesCollection(3).Values = "=比率リニアグラフ!$K$2:$K$502"
                            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.SeriesCollection(3).Select      'データラベルの追加
                            ActiveChart.SetElement (msoElementDataLabelBottom) 'データラベルを下に配置
                            ActiveChart.SeriesCollection(3).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.RGB = RGB(255, 0, 102) '線の色
                                .Transparency = 0 '線の透過具合
                                .Weight = 2 '線の太さ
                            End With
                            With ActiveSheet.ChartObjects("グラフ 1")          'グラフの移動・拡大
                                .Top = Range("P1").Top
                                .Left = Range("P1").Left
                                .Width = Range("P1:AC29").Width
                                .Height = Range("P1:AC29").Height
                            End With
                            '                    ↑
                            '  見やすいようにグラフ範囲を調整
                            '※※※※※※※※※※※※※※※※※※※
                            ActiveChart.Legend.Select   '凡例の設定
                            Selection.Delete
                            '★「ログスケール」のグラフ
                            Sheets("比率リニアグラフ").Copy After:=Sheets("比率リニアグラフ")
                            ActiveSheet.Name = "比率ロググラフ"
                            Range("A1") = "【dB】"
                            '極大値[dB]の参照
                            Range(Cells(2, 7), Cells(502, 7)).FormulaR1C1 = _
                                "=IF(INDEX(ピーク!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 6 & "],RC3,R6C1)=0,NA()," & _
                                    "10*LOG10(INDEX(ピーク!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 6 & "],RC3,R6C1)))"
                            '極小値[dB]の参照
                            Range(Cells(2, 11), Cells(502, 11)).FormulaR1C1 = _
                                "=IF(INDEX(ディップ!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 10 & "],RC3,R6C1)=0,NA()," & _
                                    "10*LOG10(INDEX(ディップ!R2C1:R502C[" & 2 * (終了番号 - 開始番号 + 1) - 10 & "],RC3,R6C1)))"
                            '比率[dB]の参照
                            Range(Cells(2, 15), Cells(一番下行番号, 15)).FormulaR1C1 = _
                                "=IF(INDEX(比率!R2C1:R50002C[" & 終了番号 - 開始番号 - 13 & "],RC3,R5C1)=0,NA()," & _
                                    "10*LOG10(INDEX(比率!R2C1:R50002C[" & 終了番号 - 開始番号 - 13 & "],RC3,R5C1)))"
                            '※※※※※※※※※※※※※※※※※※※※
                            '  ログスケールのグラフは、自分で縦軸を調整してください
                            '※※※※※※※※※※※※※※※※※※※※
                        End Sub
                        Sub main2()
                            ' このコードを標準モジュールに貼り付けたら
                            Call Main   ' そのまま「F5」を押して下さい。マクロを実行できます。
                            ' ※途中でやめたいときは、キーボード左上にある「Esc」を押下
                        End Sub
                        
                    

使用したデータ

PeakSearch02 PeakSearch05

「Data 1.csv」と「Data 3.csv」は{X,Y1,Y1(Ref)}、
「Data 2.csv」と「Data 4.csv」は{X,Y2,Y1(Ref)}を格納しています。

「DATA_001.csv」と「DATA_003.csv」は{X,Y1,Y1(Ref)}、
「DATA_002.csv」と「DATA_004.csv」は{X,Y2,Y1(Ref)}を格納しています。

\( 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 \)
\( 89 \)\( 92 \)\( 10.80 \)
\( 90 \)\( 91 \)\( 12.18 \)
\( 91 \)\( 100 \)\( 13.72 \)
\( 92 \)\( 133 \)\( 20.19 \)
\( 93 \)\( 118 \)\( 11.84 \)
\( 94 \)\( 80 \)\( 11.06 \)
\( 95 \)\( 104 \)\( 9.81 \)
\( 96 \)\( 94 \)\( 9.94 \)
\( 97 \)\( 101 \)\( 10.92 \)
\( 98 \)\( 183 \)\( 19.46 \)
\( 99 \)\( 94 \)\( 12.28 \)
\( 100 \)\( 96 \)\( 8.94 \)
\( 101 \)\( 90 \)\( 11.94 \)
\( 102 \)\( 118 \)\( 10.42 \)
\( 103 \)\( 81 \)\( 11.28 \)
\( 104 \)\( 76 \)\( 8.66 \)
\( 105 \)\( 157 \)\( 14.78 \)
\( 106 \)\( 99 \)\( 8.99 \)
\( 107 \)\( 111 \)\( 8.97 \)
\( 108 \)\( 73 \)\( 8.64 \)
\( 109 \)\( 88 \)\( 8.11 \)
\( 110 \)\( 100 \)\( 8.61 \)
\( 111 \)\( 82 \)\( 8.39 \)
\( 112 \)\( 87 \)\( 7.18 \)
\( 113 \)\( 119 \)\( 11.91 \)