Excel VBA 数学教室ではアフィリエイトプログラムを利用して商品を紹介しています。

【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 」という数値が表示されるはずです。

エクセルや数学に関するコメントをお寄せください