二次元ベクトル演算用クラスモジュール|Excel VBA(clsVector2D)
- yuji fukami
- 1月26日
- 読了時間: 5分
更新日:1月27日

1. 概要(二次元ベクトル演算用クラスモジュール)
今回は、Excel VBA で 二次元ベクトルの演算を効率的に扱うためのクラスモジュールを紹介します。二次元ベクトルの加算・減算・スカラー倍・内積・単位ベクトル・回転・角度取得といった処理は、通常は数式をその都度コード上に書く必要があります。
本クラスモジュールでは、これらの演算を オブジェクト指向的にまとめて管理することで、
数式を直接書かなくても直感的に処理できる
ベクトル演算の意図がコードから読み取りやすくなる
同じ計算ロジックを何度も使い回せる
といったメリットがあります。
二次元ベクトルを 1つのオブジェクトとして扱えるようになるため、座標計算、方向判定、回転処理などを含むロジックを、シンプルかつ安全に実装できるようになります。
別途、三次元ベクトルの演算用のクラスモジュール(clsVector3D)の紹介記事もありますので、よかったら下記もご参考にしてください
三次元ベクトル演算用クラスモジュール|Excel VBA(clsVector3D)
2.インポート用ファイルダウンロード
本記事で紹介している二次元ベクトル演算クラスは、クラスモジュール(clsVector2D)として配布しています。
まずは、下記の ZIP ファイルをダウンロードしてください。
ZIP ファイルを解凍すると、clsVector2D.cls という クラスモジュール用ファイルが含まれています。
クラスモジュールのインポート手順
ダウンロードした ZIP ファイルを解凍する
Excel を起動し、対象のブックを開く
Alt + F11 を押して VBA エディタを起動する
プロジェクトエクスプローラーを表示する(表示されていない場合は Ctrl + R)
解凍した clsVector2D.cls ファイルを、プロジェクトエクスプローラー内へドラッグ&ドロップする
正常にインポートされると、プロジェクトエクスプローラーの 「クラス モジュール」配下にclsVector2D が追加されます。

3.実際の使い方
本章では、二次元ベクトルの基本的な数式と対応させながら、このクラス内で定義している各プロパティ・メソッドが「どのような演算を担当しているのか」を整理して解説します。
まず「clsVector2D」が使えるようになった前提で下記のサンプルコードを実行してください。
慣れている人でしたらコメントを追えば、どのタイミングでどのメソッド・プロパティを使っているかは、コードを読み慣れている方であれば概ね把握できると思います。
実行結果は次のようにイミディエイトウィンドウで表示されます。

3-1. ベクトルの基本構造(X, Y)
本クラスでは、二次元ベクトル

を、
PriX:X成分
PriY:Y成分
として内部に保持しています。
VectorA.SetXY 3, 0 ' A = (3, 0)
VectorB.SetXY 2, 3 ' B = (2, 3)SetXY メソッドは、単に X・Y を設定するだけでなく、後述する ノルム(ベクトルの大きさ) も同時に計算する役割を持っています。
3-2. ノルム(Norm)
ノルムは、ベクトルの長さを表します。

クラス内では、この値を PriNorm として保持し、Norm プロパティから取得できるようにしています。
Debug.Print "|A| = " & VectorA.Norm
Debug.Print "|B| = " & VectorB.Norm毎回計算するのではなく、SetXY 時に計算して保持することで、参照時の処理を軽くしています。
3-3. 単位ベクトル(Unit)
単位ベクトルは、元のベクトルと同じ向きを持ち、大きさを 1 に正規化したベクトルです。

本クラスでは Unit プロパティとして実装しています。
Set UnitA = VectorA.Unit
Set UnitB = VectorB.Unitなお、ゼロベクトル (0,0)(0,0)(0,0) の場合は割り算が成立しないため、本クラスでは 単位ベクトルとして (0,0) を返す仕様にしています。
3-4. 角度(Angle360)
Angle360 プロパティは、ベクトルの向きを 0~2π の範囲(ラジアン)で返します。
Debug.Print "Angle(A) = " & VectorA.Angle360これは、原点を基準とした極座標表現における角度に相当し、象限判定を含めて計算することで、第1~第4象限すべてを正しく扱えるようにしています。
3-5. ベクトルの加算・減算(Add / Dif)
加算

Set Result = VectorA.Add(VectorB)減算

Set Result = VectorA.Dif(VectorB)どちらも 元のベクトルは変更せず、演算結果を新しい clsVector2D インスタンスとして返す設計にしています。
3-6. スカラー倍(Mult)
スカラー倍は、ベクトルの各成分に定数を掛ける演算です。

Set Result = VectorA.Mult(2)移動量の倍率調整や、速度ベクトルのスケーリングなどでよく使われます。
3-7. 内積(InnerProduct)
内積は、次の式で定義されます。

Dot = VectorA.InnerProduct(VectorB)内積は、
ベクトル同士の向きの関係
直交判定(内積 = 0)
などに利用できます。
3-8. 回転(Rotate)
回転処理は、回転行列を用いた次の演算に対応しています。

Theta = WorksheetFunction.Pi / 2 ' 90度
Set Result = VectorA.Rotate(Theta)角度は ラジアン指定で、任意の角度だけベクトルを回転させた結果を新しいベクトルとして返します。
3-9. Show メソッド
Show メソッドは、デバッグ用途として X・Y 座標を Debug.Print で出力する簡易メソッドです。
動作確認や処理の途中経過を追う際に利用できます。
このように clsVector2D クラスでは、二次元ベクトルの代表的な演算を数式ベースで整理しつつ、VBAコードとして直感的に扱える形にまとめています。
4.clsVector2Dを使わない場合との比較
ここでは、同じ処理を 「clsVector2Dを使う場合」と、**「使わない場合(配列で計算する場合)」**で比較します。
やることはどちらも同じです。
ベクトルA = (3, 0)、ベクトルB = (2, 3) を用意
それぞれ 2 倍する(スカラー倍)
2倍したベクトル同士の内積を求める
4-1. clsVector2Dを使う場合(読みやすく、1行でつながる)
「2倍したA」と「2倍したB」の内積という意図が、コード上でもそのまま表現できています。
4-2. clsVector2Dを使わない場合(配列+成分計算が散らばる)
クラスを使わない場合、ベクトルを配列(x,y)で持ち、演算ごとに 成分を取り出して計算する必要があります。
4-3. 比較まとめ(どこが面倒になるか)
クラスを使わない場合は、どうしても次のような記述が増えます。
ベクトルを「配列」で保持する必要がある
スカラー倍のたびに X/Y を別々に計算して代入する必要がある
内積も XとYを手作業で組み立てる必要がある
演算が増えるほど、変数・配列・代入が増えてコードが散らかる
一方で clsVector2D を使うと、
「スカラー倍」「内積」などの演算を メソッドとして意味ごとまとめられる
数式の意図を保ったまま、Mult(2).InnerProduct(...) のように 直感的に連結できる
というメリットがあります。

