Excel_VBA_Peak & Dip Search
https://www.nicovideo.jp/watch/sm45429203
'※※※※※※※※※※※※※ は じ め に ※※※※※※※※※※※※※※※※※※※※
'
'【このマクロは、測定器等で取得した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
「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 \) |