【VBA】ベクトル計算

 VBA の配列を用いて ベクトル を扱ってみます。配列形式の FUNCTIONマクロをモジュールに実装しておけば、色々なサブルーチンの中で簡単に呼び出せるので便利です。

[VBA] ベクトル計算

 Excel関数の中には配列を戻り値とする(複数の値を返してくる)ような関数があります。そうした関数はもちろん VBA のユーザー定義関数として作ることも可能です。まず最も簡単な例として、3 次元ベクトルの各成分を引数で指定するマクロ(VECTOR_3DX関数)を書いてみます。

Option Base 1

'[VBA] 三次元ベクトル関数
Function VECTOR_3DX(a As Double, b As Double, c As Double) As Variant
  VECTOR_3DX = Array(a, b, c)
End Function

 VECTOR_3DX() は Array関数でインデックス番号 1, 2, 3 の配列を作成し、引数に指定した a, b, c の 3 つの値を放り込んでいるだけです。配列にきちんと指定引数が入っているかワークシートで確認してみましょう(実用上はこの関数を単独でワークシートで用いることはないと思いますが、あくまで確認のためです)。下図にあるように横方向に3つのセルを選択して

=VECTOR_3DX(1,2,3)

と入力し、[Ctrl] + [Shift] + [Enter] を押します。

 vbaセルを選択してベクトル関数を入力

 すると各成分の値がそれぞれのセルに出力されるはずです。

 vbaベクトル関数で戻り値が横並び

 このように Array関数でベクトルを定義できますが、1次元配列はシートに出力したときに横並びになってしまいます。これは次のように一般的な1次元配列を用いても結果は同じです。

Option Base 1

'[VBA] 三次元ベクトル関数
Function VECTOR_3DX2(a As Double, b As Double, c As Double) As Variant
  Dim mydata(3) As Double
  mydata(1) = a
  mydata(2) = b
  mydata(3) = c
  VECTOR_3DX2 = mydata
End Function

 VECTOR_3DX2() を使ってベクトルの足し算や引き算などを計算させても、出力結果はやはり横並びデータになってしまいます。できることなら Excelデータは縦並びで扱いたいですね。そこで敢えて 2 次元配列を使って 3 行 1 列の配列としてベクトルを定義してみます。

Option Base 1

'[VBA] 三次元ベクトル関数
Function VECTOR_3D(a As Double, b As Double, c As Double) As Variant
  Dim mydata(3, 1) As Double
  mydata(1, 1) = a
  mydata(2, 1) = b
  mydata(3, 1) = c
  VECTOR_3D = mydata
End Function

 3 行 1 列の Double型配列変数 mydata を定義し、それぞれの要素に引数を入れて、Variant型で宣言しておいた VECTOR_3D関数に配列を丸ごと格納してあります。この関数の戻り値をシートに表示させるときはセルを縦方向に 3 つ選択した状態で

=VECTOR_3D(1,2,3)

と入力し、[Ctrl] + [Shift] + [Enter] を押します。

 vbaベクトル関数入力方法

 2 次元配列を用いた記述はベクトルだけでなく、一般の行列を扱う場合においても、そのままの形で拡張できます。

ベクトルの足し算と引き算

 VECTOR_3D関数を使って
 
\[\vec{a}+\vec{b}=\begin{pmatrix}1\\ 2\\ 3\end{pmatrix}+\begin{pmatrix}4\\ 5\\ -1\end{pmatrix}\]
を計算してみます。3 つのセルを選択した状態で

=VEC3D(1,2,3)+VEC3D(4,5,-1)

と入力して [Ctrl] + [Shift] + [Enter] を押すと結果が出力されます。

 vbaベクトル関数足し算
 

VBAでベクトルの内積を計算する

 上で作成した VEC3D関数を呼び出して、ベクトルの内積
 
\[\vec{a}\cdot\vec{b}=\begin{pmatrix}3\\ 2\\ 5\end{pmatrix}\cdot\begin{pmatrix}7\\ 1\\ 4\end{pmatrix}\]
を計算するサブルーチンは次のようになります。

Option Base 1

'[VBA] ベクトルの内積
Sub VECTOR_PRODUCT()
  Dim va As Variant
  Dim vb As Variant
  Dim pd As Double
  va = VECTOR_3D(3, 2, 5)
  vb = VECTOR_3D(7, 1, 4)
  pd = va(1, 1) * vb(1, 1) + va(2, 1) * vb(2, 1) + va(3, 1) * vb(3, 1)
  Debug.Print pd
End Sub

 VECTOR_PRODUCT() を実行するとイミディエイトウィンドウに「 43 」という数値が表示されるはずです。

コメント

タイトルとURLをコピーしました