top of page

​タグ一覧

配列処理(73)

階層化フォーム(33)

ファイル操作(28)

開発事例(22)

シート・セル操作(18)

図形操作(13)

コード自動生成(10)

ユーザーフォーム(9)

文字列操作(8)

設計思想(7)

開発効率化(6)

数学(6)

GAS(5)

アニメーション(5)

技術解説(4)

講座実施報告(5)

イミディエイトウィンドウ(4)

Googleスプレッドシート(4)

副業(4)

クリップボード(4)

条件付き書式(4)

その他(4)

ココナラ(3)

小説(3)

HTML(3)

JavaScript(3)

OneDrive(2)

イベントプロシージャ(2)

Enum(2)

PDF(2)

フリーランス(2)

リスキリング(2)

Outlook(2)

介護(2)

Discord(2)

シフト表(2)

LookerStudio(2)

日報(2)

カレンダー(2)

罫線(2)

パズル(2)

小ネタ(2)

コード解説(2)

クラスモジュール(2)

ステータスバー(1)

コード解析(1)

バックアップ(1)

可変長引数配列(1)

ブック処理(1)

スクレイピング(1)

スプレッドシート(1)

coconala(1)

リボン登録マクロ(1)

QRコード(1)

実行予約(1)

給与計算(1)

VBA不使用(1)

リボン(1)

超勉強会(1)

スピログラフ(1)

図名描写(1)

連想配列(1)

溶接ロボット(1)

保育士(1)

楽天市場(1)

経理(1)

医療(1)

文書作成(1)

発注書(1)

ショートカット(1)

WebAPI(1)

色操作(1)

スーパー開発ショートカット(1)

ライブラリ処理(1)

放課後等デイサービス(1)

児童福祉支援(1)

学校(1)

UI(1)

CAD(1)

カーソル操作(1)

二次元ベクトル演算用クラスモジュール|Excel VBA(clsVector2D)

更新日:1月27日

二次元ベクトル演算用クラスモジュール|Excel VBA

1. 概要(二次元ベクトル演算用クラスモジュール)

 今回は、Excel VBA で 二次元ベクトルの演算を効率的に扱うためのクラスモジュールを紹介します。二次元ベクトルの加算・減算・スカラー倍・内積・単位ベクトル・回転・角度取得といった処理は、通常は数式をその都度コード上に書く必要があります。


本クラスモジュールでは、これらの演算を オブジェクト指向的にまとめて管理することで、

  • 数式を直接書かなくても直感的に処理できる

  • ベクトル演算の意図がコードから読み取りやすくなる

  • 同じ計算ロジックを何度も使い回せる

といったメリットがあります。


二次元ベクトルを 1つのオブジェクトとして扱えるようになるため、座標計算、方向判定、回転処理などを含むロジックを、シンプルかつ安全に実装できるようになります。


別途、三次元ベクトルの演算用のクラスモジュール(clsVector3D)の紹介記事もありますので、よかったら下記もご参考にしてください


三次元ベクトル演算用クラスモジュール|Excel VBA(clsVector3D)


2.インポート用ファイルダウンロード


本記事で紹介している二次元ベクトル演算クラスは、クラスモジュール(clsVector2D)として配布しています。


まずは、下記の ZIP ファイルをダウンロードしてください。

 

ZIP ファイルを解凍すると、clsVector2D.cls という クラスモジュール用ファイルが含まれています。


クラスモジュールのインポート手順

  1. ダウンロードした ZIP ファイルを解凍する

  2. Excel を起動し、対象のブックを開く

  3. Alt + F11 を押して VBA エディタを起動する

  4. プロジェクトエクスプローラーを表示する(表示されていない場合は Ctrl + R)

  5. 解凍した clsVector2D.cls ファイルを、プロジェクトエクスプローラー内へドラッグ&ドロップする


正常にインポートされると、プロジェクトエクスプローラーの 「クラス モジュール」配下にclsVector2D が追加されます。


インポート用ファイルのインポート

3.実際の使い方


本章では、二次元ベクトルの基本的な数式と対応させながら、このクラス内で定義している各プロパティ・メソッドが「どのような演算を担当しているのか」を整理して解説します。 


まず「clsVector2D」が使えるようになった前提で下記のサンプルコードを実行してください。

慣れている人でしたらコメントを追えば、どのタイミングでどのメソッド・プロパティを使っているかは、コードを読み慣れている方であれば概ね把握できると思います。


実行結果は次のようにイミディエイトウィンドウで表示されます。

イミディエイトウィンドウの実行結果
イミディエイトウィンドウの実行結果


3-1. ベクトルの基本構造(X, Y)

本クラスでは、二次元ベクトル

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)

ノルムは、ベクトルの長さを表します。


3-2. ノルム(Norm)

クラス内では、この値を PriNorm として保持し、Norm プロパティから取得できるようにしています。

Debug.Print "|A| = " & VectorA.Norm
Debug.Print "|B| = " & VectorB.Norm

毎回計算するのではなく、SetXY 時に計算して保持することで、参照時の処理を軽くしています。


3-3. 単位ベクトル(Unit)

単位ベクトルは、元のベクトルと同じ向きを持ち、大きさを 1 に正規化したベクトルです。


3-3. 単位ベクトル(Unit)

本クラスでは 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)

加算


3-5. ベクトルの加算・減算(Add / Dif)
Set Result = VectorA.Add(VectorB)

減算


3-5. ベクトルの加算・減算(Add / Dif)
Set Result = VectorA.Dif(VectorB)

どちらも 元のベクトルは変更せず、演算結果を新しい clsVector2D インスタンスとして返す設計にしています。


3-6. スカラー倍(Mult)

スカラー倍は、ベクトルの各成分に定数を掛ける演算です。


3-6. スカラー倍(Mult)
Set Result = VectorA.Mult(2)

移動量の倍率調整や、速度ベクトルのスケーリングなどでよく使われます。


3-7. 内積(InnerProduct)

内積は、次の式で定義されます。


3-7. 内積(InnerProduct)
Dot = VectorA.InnerProduct(VectorB)

内積は、

  • ベクトル同士の向きの関係

  • 直交判定(内積 = 0)

などに利用できます。



3-8. 回転(Rotate)

回転処理は、回転行列を用いた次の演算に対応しています。


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(...) のように 直感的に連結できる

というメリットがあります。


5.ソースコード


Excel VBAによる業務自動化・ツール開発をご検討の方へ

​"脱Excel"の前に、現状のExcelの潜在能力を120%発揮してみませんか?

Softex-Celware

​インボイス登録番号:T5810983887134

  • Facebook
  • Twitter
  • YouTube

©2023 softex-celware。Wix.com で作成されました。

bottom of page