VBA によるベクトル計算(配列を返すユーザー定義関数)

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

配列を返すユーザー定義関数(VEC3DX関数)

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

 Option Base 1

 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つのセルを選択して

=VEC3DX(1,2,3)

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

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

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

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

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

 Option Base 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 列の配列としてベクトルを定義してみます。

 Option Base 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 つ選択した状態で

=VEC3D(1,2,3)

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

 vbaベクトル関数入力方法

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

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

 VEC3D関数を使って
 
\[\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ベクトル関数足し算
 

ベクトルの内積を計算するマクロ(VECPRODUCT)

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

 Option Base 1

 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 数学マクロコレクション

スポンサーリンク
スポンサーリンク
末尾広告
末尾広告

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください