【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を作成するサンプルコードです。

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メソッドを使い下記のように記載します。(ドキュメントオブジェクトは削除不可)

 icon-code  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メソッドを使い下記のように記載します。

 icon-code  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メソッドを使い下記のように記載します。

 icon-code  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

 

まとめ

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

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