このページで紹介する内容
このページで紹介するマクロは「記録したデータの中間の値を、数値として自動で出したい!」という場面で使えます。
具体例でいうと、下の図のX1(B列)-Y1(C列)のデータから、好きな値でX2(D列)を設定して、そのX2に対してY2(E列)の値を自動で算出してくれます。
コードの紹介
VBAの標準モジュールに、以下のコードを貼り付ければ完了です。
Sub 線形補完マクロ()
Dim countR1 As Long
Dim countR2 As Long
Dim num1 As Long
Dim num2 As Long
Dim x1(1000) As Single
Dim y1(1000) As Single
Dim x2(1000) As Single
Dim y2(1000) As Single
Dim K(1000) As Single
countR1 = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Row
countR2 = Sheets(1).Cells(Rows.Count, 4).End(xlUp).Row
num1 = countR1 - 2
num2 = countR2 - 2
x1(0) = Sheets(1).Cells(3, 2).Value
y1(0) = Sheets(1).Cells(3, 3).Value
x2(0) = Sheets(1).Cells(3, 4).Value
y2(0) = 0
For i = 1 To num1
x1(i) = Sheets(1).Cells(2 + i, 2).Value
y1(i) = Sheets(1).Cells(2 + i, 3).Value
Next i
For j = 1 To num2
x2(j) = Sheets(1).Cells(2 + j, 4).Value
i = 1
Do While x1(i - 1) < x2(j)
If (x1(i) - x1(i - 1)) <= 0 Then
K(j) = 0
Else
K(j) = (y1(i) - y1(i - 1)) / (x1(i) - x1(i - 1))
End If
y2(j) = K(j) * (x2(j) - x1(i - 1)) + y1(i - 1)
Sheets(1).Cells(2 + j, 5) = y2(j)
i = i + 1
Loop
Next j
End Sub
下のグラフは、X1-Y1のグラフとX2-Y2のグラフを重ねたものです。青い丸が元々のデータ(X1-Y1)です。青い丸の間の数値を計算したものが、赤い丸のデータ(X2-Y2)になります。
Rows.Countで使用しているセルの一番下の行番号を取得
もともとあったデータX1とY1、それぞれのデータの数を調べるために、Rows.Countコマンドを使います。
countR1 = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Row
countR2 = Sheets(1).Cells(Rows.Count, 4).End(xlUp).Row
num1 = countR1 - 2
num2 = countR2 - 2
X2の値とX1の値を比較して、間の数値を計算
飛び飛びの値の間の数値を計算する時には、線形(Xに対するYの変化量が一定)と考えると分かりやすいです。もともとあるデータの間毎にXとYの変化量を出すことで、間の数値を計算します。
For i = 1 To num1
x1(i) = Sheets(1).Cells(2 + i, 2).Value
y1(i) = Sheets(1).Cells(2 + i, 3).Value
Next i
For j = 1 To num2
x2(j) = Sheets(1).Cells(2 + j, 4).Value
i = 1
Do While x1(i - 1) < x2(j)
If (x1(i) - x1(i - 1)) <= 0 Then
K(j) = 0
Else
K(j) = (y1(i) - y1(i - 1)) / (x1(i) - x1(i - 1))
End If
y2(j) = K(j) * (x2(j) - x1(i - 1)) + y1(i - 1)
Sheets(1).Cells(2 + j, 5) = y2(j)
i = i + 1
Loop
Next j
Do While ・・・Loop関数で計算したい数値の場所を特定
筆者のつくったマクロでは、新たに計算したいX2の位置を、X1の数値と順番に比較しています。X2の数値が、X1の数値を超えた時、その時のX1の変化量でX2を計算する方法をとっています。
Do While x1(i - 1) < x2(j)
まとめ
元々あるデータから、その間の値を計算するのに、いちいちその数値の大小関係を調べながら、セルに直接数式を打ち込んでいくのは、とても面倒だと思い、このマクロを作成しました。
とにかく使いたいという方向けに、ダウンロードファイルを用意しましたので、好きに改造して使用してください。
線形補完マクロ
1 ファイル 352.11 KB
自分の備忘録のため作成したものですが、どこかで役に立てば幸いです。