Option Explicit
' 以下の5行は手でセットします
Const 開始行 = 2
Const 最後行 = 101
Const 代表の数 = 10
Const 最初の代表値 = 6.6 ' 上端は使わないこと
Const 平均値の差の許容値 = 0.05 ' 正の数で指定すること
Dim 入力シート As Worksheet, 出力シート As Worksheet
Sub Get_10代表()
Dim i0 As Integer, j0 As Integer, 目標平均値 As Double, 代表値の間隔 As Double
Dim 目標(9) As Double, 偏差 As Double, 代表行 As Long, 累積誤差 As Double
Dim 調整値(9) As Double, 調整点 As Integer, 出力行調整 As Long, 結果の平均 As Double, 平均範囲 As Range
Set 入力シート = Worksheets("Sheet2")
Set 出力シート = Worksheets("Sheet3")
Set 平均範囲 = 入力シート.Range("A" & 開始行 & ":A" & 最後行)
目標平均値 = Application.WorksheetFunction.Average(平均範囲)
出力シート.Range("A1") = "代表行"
出力シート.Range("B1") = "代表値"
出力シート.Range("C1") = "偏差"
' 代表データの偏差の目標を設定
代表値の間隔 = 最初の代表値 * 0.2 / 0.9
調整点 = 代表の数 - 2
目標(0) = 最初の代表値
For i0 = 1 To 代表の数 - 1
目標(i0) = 目標(i0 - 1) - 代表値の間隔
Next i0
近そうな代表を選んでみる:
結果の平均 = 0
For j0 = 0 To 代表の数 - 1
i0 = 処理順(j0)
Get_代表 目標(i0) + 調整値(i0), 累積誤差, 代表行, 偏差
累積誤差 = 累積誤差 + 目標(i0) - 偏差
出力シート.Cells(i0 + 2 + 出力行調整, 1) = 代表行
出力シート.Cells(i0 + 2 + 出力行調整, 2) = 入力シート.Cells(代表行, 1)
出力シート.Cells(i0 + 2 + 出力行調整, 3) = 偏差
結果の平均 = 結果の平均 + 入力シート.Cells(代表行, 1)
Next j0
結果の平均 = 結果の平均 / 代表の数
出力シート.Cells(出力行調整 + 12, 1) = "目標平均値"
出力シート.Cells(出力行調整 + 12, 2) = 目標平均値
出力シート.Cells(出力行調整 + 13, 1) = "結果の平均"
出力シート.Cells(出力行調整 + 13, 2) = 結果の平均
出力シート.Cells(出力行調整 + 14, 1) = "平均値の差"
出力シート.Cells(出力行調整 + 14, 2) = 結果の平均 - 目標平均値
' 結果を見て気に入らなければ手直しする
If Abs(結果の平均 - 目標平均値) < 平均値の差の許容値 Then Exit Sub
調整点 = 調整点 - 1
If 調整点 < 1 Then Exit Sub
For i0 = 0 To 9
調整値(i0) = 0
Next i0
調整値(調整点) = 代表値の間隔 / 2# ' これはドテカンです
出力行調整 = 15
GoTo 近そうな代表を選んでみる
End Sub
お礼
mimeuさん、ありがとうございました。 「最初の代表値」ってそういう意味だったのですね。 率直に感心しました。 教えていただいた、コードを基に目的のコードを完成させたいと思います。 また、解らないことがあれば質問させていただきます、その時はよろしくお願いします。 本当にご丁寧な回答ありがとうございました。