【VBE操作】VBComponentsコレクションとVBComponentオブジェクトの使い方
「Microsoft Visual Basic for Applications Extensibility 5.3」拡張ライブラリを利用することで、VBAからVBEを操作できるようになります。これにより、新規モジュールの作成や、指定したコードの一括書き換え、モジュールのエクスポートなど、さまざまな操作がVBAで可能になります。このライブラリを活用することで、VBA開発者はVBEでの作業効率を向上させることができます。
本ページではこの拡張ライブラリの中でも標準モジュールやクラスモジュール、UserFormを操作するためのVBComponentsコレクションとVBComponentオブジェクトについて解説していきます。
本ページで学べる内容は下記の通りです。
モジュール/UserFormを新規作成する方法
モジュール/UserFormを削除する方法
モジュール/UserFormをインポートする方法
モジュール/UserFormをエクスポートする方法
参考書籍
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列挙型で下記のように定義されています。
このコンポーネントタイプを使うことで、「標準モジュールだけ」「クラスモジュールだけ」というような特定のコンポーネントに対してのみ処理を行うことができるようになっています。また、新規でVBComponentを作成する際も標準モジュールで作成するのか、クラスモジュールで作成するのかを指定するためにこのコンポーネントタイプで指示を行います。
コンポーネントタイプはVBComponentオブジェクトに対して下記のように記載することで取得することができます。Typeプロパティは読み取り専用のプロパティであるため値の変更はできません。
Dim lComponentType As vbext_ComponentType
lComponentType = [VBComponent].Type
モジュール/UserFormの新規作成
VBComponent(標準モジュール、クラスモジュール、UserForm)を新規作成するにはVBComponentsコレクションのAddメソッドを使い下記のように記載します。(ドキュメントオブジェクトは作成不可)
Dim oVBComponent As VBComponent
Set oVBComponent = [VBComponents].Add(ComponentType)
引数にコンポーネントタイプを入力することで、指定したタイプの新規コンポーネントを作成し、戻り値として作成したVBComponentオブジェクトを取得することができます。
新規作成されたVBComponentは名称が自動で付与されるため、任意の名称に設定したい場合はVBComponentオブジェクトのNameプロパティで変更することができます。ただし、VBComponents内に同名のVBComponentが存在する場合はエラーが発生するため注意が必要です。
サンプルコード
下記は指定のVBProject内に指定の名称のVBComponentを作成するサンプルコードです。
Option Explicit
'-------------------------------------------------------------------------------
'- メイン処理
'-------------------------------------------------------------------------------
Sub main()
Dim oVBE As VBE
Dim oVBProject As VBProject
Dim oVBComponent As VBComponent
Set oVBE = Application.VBE
Set oVBProject = oVBE.ActiveVBProject
Set oVBComponent = AddComponent(oVBProject, "New_Module", vbext_ct_StdModule)
End Sub
'-------------------------------------------------------------------------------
'- コンポーネント作成
'- oVBProject :コンポーネントを追加するプロジェクト
'- sName :作成するコンポーネントの名称
'- lType :作成するコンポーネントタイプ
'- 戻り値 :作成したコンポーネント (同名が既に存在する場合はNothing)
'-------------------------------------------------------------------------------
Private Function AddComponent(ByVal oVBProject As VBProject, _
ByVal sName As String, _
ByVal lType As vbext_ComponentType) As VBComponent
Dim oVBComponent As VBComponent
'既に同名のコンポーネントが存在する場合は戻り値なしで終了
On Error Resume Next
Set oVBComponent = oVBProject.VBComponents.Item(sName)
On Error GoTo 0
If Not oVBComponent Is Nothing Then Exit Function
'コンポーネント作成
Set oVBComponent = oVBProject.VBComponents.Add(lType)
oVBComponent.Name = sName
'戻り値設定
Set AddComponent = oVBComponent
End Function
モジュール/UserFormの削除
VBComponent(標準モジュール、クラスモジュール、UserForm)を削除するにはVBComponentsコレクションのRemoveメソッドを使い下記のように記載します。(ドキュメントオブジェクトは削除不可)
Call [VBComponents].Remove(VBComponent)
引数としてVBComponentオブジェクトを入力することでそのコンポーネントの削除が行えます。
サンプルコード
下記は指定のVBProject内に存在する指定の名称のVBComponentを削除するサンプルコードです。
Option Explicit
'-------------------------------------------------------------------------------
'- メイン処理
'-------------------------------------------------------------------------------
Sub main()
Dim oVBE As VBE
Dim oVBProject As VBProject
Dim oVBComponent As VBComponent
Set oVBE = Application.VBE
Set oVBProject = oVBE.ActiveVBProject
Call DeleteComponent(oVBProject, "Delete_Module")
End Sub
'-----------------------------------------------------------------------
'- コンポーネント削除
'- oVBProject :削除するコンポーネントを含むプロジェクト
'- sName :削除するコンポーネントの名称
'-----------------------------------------------------------------------
Private Sub DeleteComponent(ByVal oVBProject As VBProject, _
ByVal sName As String)
Dim oVBComponent As VBComponent
'名称からコンポーネントが取得できなければ終了
On Error Resume Next
Set oVBComponent = oVBProject.VBComponents.Item(sName)
On Error GoTo 0
If oVBComponent Is Nothing Then Exit Sub
'コンポーネント削除
Call oVBProject.VBComponents.Remove(oVBComponent)
End Sub
モジュール/UserFormをインポートする
VBComponent(標準モジュール、クラスモジュール、UserForm)をインポートするにはVBComponentsコレクションのImportメソッドを使い下記のように記載します。
Dim oVBComponent As VBComponent
Set oVBComponent = [VBComponents].Import(FileName)
引数としてインポートするファイルのフルパスを入力することで、VBComponents内にコンポーネントをインポートすることができ、戻り値としてインポートしたVBComponentオブジェクトを取得することができます。同名のコンポーネントが存在する場合は名称が変更されてインポートされます。
サンプルコード
下記は指定のVBProjectが持つすべてのVBComponentをエクスポートするサンプルコードです。
Option Explicit
'-------------------------------------------------------------------------------
'- メイン処理
'-------------------------------------------------------------------------------
Sub main()
Dim oVBE As VBE
Dim oVBProject As VBProject
Dim oVBComponent As VBComponent
Dim sPath As String
Set oVBE = Application.VBE
Set oVBProject = oVBE.ActiveVBProject
'インポートファイルパス設定 (任意の場所を設定)
sPath = "C:\...\Module1.bas"
'コンポーネントのインポート
Set oVBComponent = ImportComponent(oVBProject, sPath)
End Sub
'-----------------------------------------------------------------------
'- コンポーネントのインポート
'- oVBProject :コンポーネントを追加するプロジェクト
'- sPathDir :インポートするファイルパス
'- 戻り値 :インポートしたコンポーネント (インポート失敗の場合はNothing)
'-----------------------------------------------------------------------
Private Function ImportComponent(ByVal oVBProject As VBProject, _
ByVal sPath As String) As VBComponent
Dim oVBComponent As VBComponent
'ファイルインポート
On Error Resume Next
Set oVBComponent = oVBProject.VBComponents.Import(sPath)
On Error GoTo 0
Set ImportComponent = oVBComponent
End Function
モジュール/UserFormをエクスポートする
VBComponent(標準モジュール、クラスモジュール、UserForm、ドキュメントオブジェクト)をエクスポートするには、VBComponentオブジェクトのExportメソッドを使い下記のように記載します。
Call [VBComponent].Export(FileName)
引数として出力するファイルのフルパスを入力することでVBComponentを指定のディレクトリにエクスポートすることができます。標準モジュール、クラスモジュール、UserFormはそれぞれエクスポート時の拡張子が違うため、動的にファイルパスを生成する場合はコンポーネントタイプからそれぞれの拡張子を判定する必要があります。(※UserFormは.frmで出力すると.frxも自動生成される)
サンプルコード
下記は指定のVBProjectが持つすべてのVBComponentをエクスポートするサンプルコードです。
Option Explicit
'-------------------------------------------------------------------------------
'- メイン処理
'-------------------------------------------------------------------------------
Sub main()
Dim oVBE As VBE
Dim oVBProject As VBProject
Dim oVBComponent As VBComponent
Dim sPathDir As String
Set oVBE = Application.VBE
Set oVBProject = oVBE.ActiveVBProject
'ディレクトリパス設定 (任意の場所を設定)
sPathDir = "C:\...\ExportFolder"
'全コンポーネントをエクスポート
For Each oVBComponent In oVBProject.VBComponents
Call ExportComponent(oVBComponent, sPathDir)
Next
End Sub
'-----------------------------------------------------------------------
'- コンポーネントのエクスポート
'- VBComponent :エクスポート対象のコンポーネント
'- sPathDir :出力ディレクトリパス
'-----------------------------------------------------------------------
Private Sub ExportComponent(ByVal oVBComponent As VBComponent, _
ByVal sPathDir As String)
Dim sPath As String
Dim sExt As String
'コンポーネントタイプから拡張子設定
Select Case oVBComponent.Type
Case vbext_ct_StdModule: sExt = ".bas"
Case vbext_ct_ClassModule: sExt = ".cls"
Case vbext_ct_Document: sExt = ".cls"
Case vbext_ct_MSForm: sExt = ".frm"
End Select
'出力パス作成
sPath = sPathDir & "\" & oVBComponent.Name & sExt
'コンポーネント出力
Call oVBComponent.Export(sPath)
End Sub
まとめ
本ページの内容をまとめると下記のとおりです。
VBComponentの作成にはVBComponentsのAddメソッドを使う
VBComponentの作成にはVBComponentsのRemoveメソッドを使う
VBComponentをインポートするにはVBComponentsのImportメソッドを使う
VBComponentをエクスポートするにはVBComponentのExportメソッドを使う
現在のVBProject内の要素を一括でエクスポートしたり、指定のフォルダ内のファイルを一括でVBProjectに取り込むなどの処理はVBComponentsコレクションとVBComponentオブジェクトのプロパティ/メソッドを使うことで実現することができます。またこれに合わせてVBComponent内のコードを操作するCodeModuleオブジェクトのプロパティ/メソッドを利用することで、新規作成した標準モジュールに指定のコードを動的に記載するなどの処理も可能になります。
Microsoft公式リンク
参考:Visual Basic アドイン モデル リファレンス
オブジェクト (Visual Basic アドイン モデル)










