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] を押します。
すると各成分の値がそれぞれのセルに出力されるはずです。
このように 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] を押します。
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でベクトルの内積を計算する
上で作成した 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 」という数値が表示されるはずです。
エクセルや数学に関するコメントをお寄せください