■ VBAからVBEを操作しよう!1
VBE(Visual Basic Editor)は、VBAの開発になくてはならない、必須のエディタです。このVBEをVBAから操作したいと思うことがよくあります。
例えば、複数ブックのプロジェクト内容を書き出したり、モジュールのコードをテキストファイルで書き出したり、VBAプロジェクト(VBAProject)にマクロでパスワードを設定したりという具合です。
VBAからVBEを操作する方法を覚えておくと、開発者の負担を減らすマクロを開発のいたるところで利用することができるようになります。
※VBAからVBEを操作するには、[ツール]メニューの[マクロ]、[セキュリティ]をクリック、[セキュリティ]ダイアログボックスの[信頼できる発行元]タブにある[Visual Basicプロジェクトへのアクセスを信頼する]チェックボックスをオンにする必要があります。
■VBProjectオブジェクトを利用する
VBProjectオブジェクトは、プロジェクト全体を表すオブジェクトでApplicationオブジェクトの配下にあります。VBProjectオブジェクトを取得することで、プロジェクト全体の情報を知ることができます。
例:
Sub Test()
Dim MyProject As Object
Set MyProject = Application.VBE
Debug.Print MyProject.VBProjects.Count
Debug.Print MyProject.VBProjects(1).Name
Debug.Print MyProject.VBProjects(1).Filename
Debug.Print MyProject.VBProjects(1).Protection
Debug.Print MyProject.VBProjects(2).Name
Debug.Print MyProject.VBProjects(2).Filename
Debug.Print MyProject.VBProjects(2).Protection
End Sub
"Book1"と"Book2"の2つのブックを開いた状態でプロシージャ"Test"を実行したとき、イミディエイトウィンドウに次のように出力されたとします。
2
VBAProject1
C:\Book1.xls
0
VBAProject2
C:\Book2.xls
0 |
|
・Countプロパティは現在アプリケーションで開かれているプロジェクトの数を返します。この場合、Book1とBook2の2つのプロジェクトが開かれているので2が返ります。
・Nameプロパティはプロジェクトの名前を返します。VBProjectsコレクションの1番目のプロジェクト、このケースではBook1のプロジェクト名"VBAProject1"が返りました。
※プロジェクト名は[VBAProjectのプロパティ]の[全般]タブ、[プロジェクト名]から変更することが可能です。[VBAProjectのプロパティ]は、[ツール]メニューより[VBAProjectのプロパティ]をクリックするか、または[プロジェクトエクスプローラ]でプロジェクトを右クリック、ショートカットメニューの[VBAProjectのプロパティ]をクリックすることで表示することができます。
・Filenameプロパティは、プロジェクトのブックの存在するパスを返します。Book1がCドライブ直下に保存されているとき、"C:\Book1.xls"が返ります。
※開いているブックがまだ保存されていないとき、Filenameプロパティは実行時エラー'76'を返します。
・Protectionプロパティは、プロジェクトがパスワード保護され内容を表示していないときは1を、内容を表示しているときは0を返します。ユーザーがパスワードを入力し、保護されている内容を表示しているときも、同様に0を返します。
※Protectionプロパティは読み取り専用のプロパティのため、値を設定することはできません。VBAからProtectionプロパティを使用して、プロジェクトの保護を解除することはできません。
■VBComponentオブジェクトを利用する
VBComponentオブジェクトは、プロジェクトに含まれる標準モジュールやクラスモジュールなどを表します。プロジェクトにどのようなモジュールが含まれているかは、このVBComponentオブジェクトを調べることで知ることができます。
例:
Sub Test()
Dim MyComponent As Object
Dim i As Long
Set MyComponent = ActiveWorkbook.VBProject
For i = 1 To MyComponent.VBComponents.Count
Debug.Print MyComponent.VBComponents(i).Name
Debug.Print MyComponent.VBComponents(i).Type
Next i
End Sub
この例では、現在アクティブなブックのプロジェクト内にある、すべてのコンポーネント名と種類をイミディエイトウィンドウに出力します。ちなみに、
ActiveWorkbook.VBProject
を
ThisWorkbook.VBProject
に変更すると、プロシージャ"Test"が記述されているブックを処理の対象とします。複数ブックが開かれているとき、そのブックがアクティブかどうかは関係ありません。 |
・Countプロパティはプロジェクトに含まれるコンポーネントの数を返します。アクティブブックのプロジェクトの内容が、
のとき、Countプロパティは5を返します。
・Nameプロパティは対象となるコンポーネントのオブジェクト名を返します。シートモジュールの場合、シート見出しのシート名ではなく、シートモジュールのオブジェクト名が返るので注意してください。
・Typeプロパティはコンポーナントの種類を表す数値を返します。返す値は次の通りです。
値 |
内容 |
1 |
標準モジュール |
2 |
クラス モジュール |
3 |
Microsoft Form |
11 |
ActiveX デザイナ |
100 |
Document モジュール |
例:
Sub Test()
Dim MyWorkbook As Object
Dim MyComponent As Object
Dim i As Long
For Each MyWorkbook In Workbooks
Set MyComponent = Workbooks(MyWorkbook.Name).VBProject
For i = 1 To MyComponent.VBComponents.Count
Debug.Print MyComponent.VBComponents(i).Name
Debug.Print MyComponent.VBComponents(i).Type
Next i
Next
End Sub
この例では、現在開かれているすべてのブックの、すべてのコンポーネント名と種類をイミディエイトウィンドウに出力します。 |
※Addメソッドを使用すると、プロジェクトにコンポーネントを追加することができます。このとき、引数を指定することで、追加するコンポーネントの種類を指定することができます。
値 |
内容 |
1 |
標準モジュール |
2 |
クラス モジュール |
3 |
Microsoft Form |
上の例で、標準モジュールのコンポーネントを追加するときは、
MyComponent.VBComponents.Add 1
と記述します。
次回はモジュール内のコードを取得するCodeModuleオブジェクトについて解説します。
|