【VBE操作】VBComponentsコレクションとVBComponentオブジェクトの使い方

Microsoft Visual Basic for Applications Extensibility 5.3」拡張ライブラリを利用することで、VBAからVBEを操作できるようになります。これにより、新規モジュールの作成や、指定したコードの一括書き換え、モジュールのエクスポートなど、さまざまな操作がVBAで可能になります。このライブラリを活用することで、VBA開発者はVBEでの作業効率を向上させることができます。

本ページではこの拡張ライブラリの中でも標準モジュールやクラスモジュール、UserFormを操作するためのVBComponentsコレクションとVBComponentオブジェクトについて解説していきます。
本ページで学べる内容は下記の通りです。

icon-check-square モジュール/UserFormを新規作成する方法
icon-check-square モジュール/UserFormを削除する方法
icon-check-square モジュール/UserFormをインポートする方法
icon-check-square モジュール/UserFormをエクスポートする方法

 icon-book 参考書籍

VBComponentsとVBComponent

VBAの拡張ライブラリの参照設定を行うことで、標準モジュールやクラスモジュール、UserFormなどは「VBComponent」というオブジェクトとして操作することができるようになります。オブジェクトの階層としては上図の通り「VBE>VBProjects>VBProject>VBComponents>VBComponent」となっており、VBComponentはVBProjectの子供にあたるオブジェクトとなっています。

VBProjectは名前の通りVBAのプロジェクトで上図でいうVBAProjectがこれにあたります。そしてその配下にいる標準モジュールやクラスモジュール、UserFormなどがすべてVBComponentオブジェクトであり、これらオブジェクトをまとめたコレクションがVBComponentsコレクションとなります。
 

コンポーネントタイプ

標準モジュールもクラスモジュールもUserFormもすべて同じVBComponentオブジェクト扱いとなっていますが、それぞれを見分けるためにVBComponentオブジェクトにはTypeプロパティが用意されています。Typeプロパティはvbext_ComponentType列挙型で下記のように定義されています。

定数名 内容
vbext_ct_StdModule 1 標準モジュール
vbext_ct_ClassModule 2 クラスモジュール
vbext_ct_MSForm 3 UserForm
vbext_ct_ActiveXDesigner 11 ActiveXデザイナ ※VBAでは利用不可
vbext_ct_Document 100 ドキュメントオブジェクト (ThisWorkbookやSheet1等)

このコンポーネントタイプを使うことで、「標準モジュールだけ」「クラスモジュールだけ」というような特定のコンポーネントに対してのみ処理を行うことができるようになっています。また、新規でVBComponentを作成する際も標準モジュールで作成するのか、クラスモジュールで作成するのかを指定するためにこのコンポーネントタイプで指示を行います。

コンポーネントタイプはVBComponentオブジェクトに対して下記のように記載することで取得することができます。Typeプロパティは読み取り専用のプロパティであるため値の変更はできません

 icon-code  Typeプロパティ 

Dim lComponentType As vbext_ComponentType
lComponentType
= [VBComponent].Type

 

モジュール/UserFormの新規作成

VBComponent(標準モジュール、クラスモジュール、UserForm)を新規作成するにはVBComponentsコレクションのAddメソッドを使い下記のように記載します。(ドキュメントオブジェクトは作成不可)

 icon-code  Addメソッド 

Dim oVBComponent As VBComponent
Set oVBComponent = [VBComponents].Add(ComponentType)

引数にコンポーネントタイプを入力することで、指定したタイプの新規コンポーネントを作成し、戻り値として作成したVBComponentオブジェクトを取得することができます。

新規作成されたVBComponentは名称が自動で付与されるため、任意の名称に設定したい場合はVBComponentオブジェクトのNameプロパティで変更することができます。ただし、VBComponents内に同名のVBComponentが存在する場合はエラーが発生するため注意が必要です。
 

サンプルコード

下記は指定のVBProject内に指定の名称のVBComponentを作成するサンプルコードです。

 

モジュール/UserFormの削除

VBComponent(標準モジュール、クラスモジュール、UserForm)を削除するにはVBComponentsコレクションのRemoveメソッドを使い下記のように記載します。(ドキュメントオブジェクトは削除不可)

 icon-code  Removeメソッド 

Call [VBComponents].Remove(VBComponent)

引数としてVBComponentオブジェクトを入力することでそのコンポーネントの削除が行えます。
 

サンプルコード

下記は指定のVBProject内に存在する指定の名称のVBComponentを削除するサンプルコードです。

 

モジュール/UserFormをインポートする

VBComponent(標準モジュール、クラスモジュール、UserForm)をインポートするにはVBComponentsコレクションのImportメソッドを使い下記のように記載します。

 icon-code  Importメソッド 

Dim oVBComponent As VBComponent
Set oVBComponent = [VBComponents].Import(FileName)

引数としてインポートするファイルのフルパスを入力することで、VBComponents内にコンポーネントをインポートすることができ、戻り値としてインポートしたVBComponentオブジェクトを取得することができます。同名のコンポーネントが存在する場合は名称が変更されてインポートされます。
 

サンプルコード

下記は指定のVBProjectが持つすべてのVBComponentをエクスポートするサンプルコードです。

 

モジュール/UserFormをエクスポートする

VBComponent(標準モジュール、クラスモジュール、UserForm、ドキュメントオブジェクト)をエクスポートするには、VBComponentオブジェクトのExportメソッドを使い下記のように記載します。

 icon-code  Exportメソッド 

Call [VBComponent].Export(FileName)

引数として出力するファイルのフルパスを入力することでVBComponentを指定のディレクトリにエクスポートすることができます。標準モジュール、クラスモジュール、UserFormはそれぞれエクスポート時の拡張子が違うため、動的にファイルパスを生成する場合はコンポーネントタイプからそれぞれの拡張子を判定する必要があります。(※UserFormは.frmで出力すると.frxも自動生成される)
 

サンプルコード

下記は指定のVBProjectが持つすべてのVBComponentをエクスポートするサンプルコードです。

 

まとめ

本ページの内容をまとめると下記のとおりです。

icon-check-square VBComponentの作成にはVBComponentsのAddメソッドを使う
icon-check-square VBComponentの作成にはVBComponentsのRemoveメソッドを使う
icon-check-square VBComponentをインポートするにはVBComponentsのImportメソッドを使う
icon-check-square VBComponentをエクスポートするにはVBComponentのExportメソッドを使う

現在のVBProject内の要素を一括でエクスポートしたり、指定のフォルダ内のファイルを一括でVBProjectに取り込むなどの処理はVBComponentsコレクションとVBComponentオブジェクトのプロパティ/メソッドを使うことで実現することができます。またこれに合わせてVBComponent内のコードを操作するCodeModuleオブジェクトのプロパティ/メソッドを利用することで、新規作成した標準モジュールに指定のコードを動的に記載するなどの処理も可能になります。
 

icon-share-square Microsoft公式リンク

参考:Visual Basic アドイン モデル リファレンス
   オブジェクト (Visual Basic アドイン モデル)

Excel, VBA, VBE

Posted by Lic