VBA の 配列 を用いて ベクトル を扱ってみます。配列形式の FUNCTIONマクロをモジュールに実装しておけば、色々なサブルーチンの中で簡単に呼び出せるので便利です。
配列を返すユーザー定義関数(VEC3DX関数)
Excel関数の中には配列を戻り値とする(複数の値を返してくる)ような関数があります。そうした関数はもちろん VBA のユーザー定義関数として作ることも可能です。まず最も簡単な例として、3 次元ベクトルの各成分を引数で指定するマクロ(VEC3DX関数)を書いてみます。
Function VEC3DX(a As Double, b As Double, c As Double) As Variant
VEC3DX = Array(a, b, c)
End Function
関数名の VEC は VECTOR 、3D は 3 成分、X は横並びであることを意味する記号です。このマクロは単に Array関数でインデックス番号 1, 2, 3 の配列を作成し、引数に指定した a, b, c の 3 つの値を放り込んでいるだけです。配列にきちんと指定引数が入っているかワークシートで確認してみましょう(実用上はこの関数を単独でワークシートで用いることはないと思いますが、あくまで確認のためです)。下図にあるように横方向に3つのセルを選択して
と入力し、[Ctrl] + [Shift] + [Enter] を押します。
すると各成分の値がそれぞれのセルに出力されるはずです。
このように Array関数でベクトルを定義できますが、1次元配列はシートに出力したときに横並びになってしまいます。これは次のように一般的な1次元配列を用いても結果は同じです。
Function VEC3DX2(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
VEC3DX2 = mydata
End Function
この関数を使ってベクトルの足し算や引き算などを計算させても、出力結果はやはり横並びデータになってしまいます。
2 次元配列を使ってベクトルを定義します(VEC3D関数)
しかしできることなら Excelデータは縦並びで扱いたいものです。そこで敢えて 2 次元配列を使って 3 行 1 列の配列としてベクトルを定義してみます。
Function VEC3D(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
VEC3D = mydata
End Function
3 行 1 列の Double型配列変数 mydata を定義し、それぞれの要素に引数を入れて、Variant型で宣言しておいた VEC3D関数に配列を丸ごと格納してあります。この関数の戻り値をシートに表示させるときはセルを縦方向に 3 つ選択した状態で
と入力し、[Ctrl] + [Shift] + [Enter] を押します。
2 次元配列を用いた記述はベクトルだけでなく、一般の行列を扱う場合においても、そのままの形で拡張できます。
ベクトルの足し算と引き算
VEC3D関数を使って
\[\vec{a}+\vec{b}=\begin{pmatrix}1\\ 2\\ 3\end{pmatrix}+\begin{pmatrix}4\\ 5\\ -1\end{pmatrix}\]
を計算してみます。3 つのセルを選択した状態で
と入力して [Ctrl] + [Shift] + [Enter] を押すと結果が出力されます。
ベクトルの内積を計算するマクロ(VECPRODUCT)
上で作成した VEC3D関数を呼び出して、ベクトルの内積
\[\vec{a}\cdot\vec{b}=\begin{pmatrix}3\\ 2\\ 5\end{pmatrix}\cdot\begin{pmatrix}7\\ 1\\ 4\end{pmatrix}\]
を計算するサブルーチンは次のようになります。
Sub VECPRODUCT()
Dim va As Variant
Dim vb As Variant
Dim pd As Double
va = VEC3D(3, 2, 5)
vb = VEC3D(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
マクロを実行するとイミディエイトウィンドウに「 43 」という数値が表示されるはずです。 ≫ VBA 数学マクロコレクション