この記事では、自分自身のExcelファイルにあるVBAオブジェクトモジュールの名称を全て取得する方法についてご説明します。
【動画】自分自身のExcelファイルにあるVBAオブジェクトモジュールの名称を全て取得する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
VBComponentsコレクションを使ってVBAのオブジェクトモジュールの名称を全て取得しています。
ちなみに最初にエラーが発生しているのは、Excelのマクロの設定にある「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェックを付けなかったためです。
詳しくは後述しますが、この設定を行わないとVBComponentsコレクションを使うことができずエラーとなってしまいます。
マクロ作成の流れ
名称はVBComponentsコレクションのNameプロパティから取得することができます。
【注意】VBComponentsコレクションを扱うにはある設定を行わないとエラーになり動作しない
VBComponentsコレクションを扱うにはある設定を行わないとエラーになり動作しません。
設定を行わないままVBComponentsコレクションを呼び出そうとすると下のようにエラーが発生して正常に動作しません。
ではその必要な設定はというと、次の画面で行う「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」のチェックを付ける設定です。
このチェックを付けておかないとエラーが先ほどのエラーが発生してしまうので、必ずチェックをつけましょう。
なお、チェックを付けるとセキュリティ面が弱くなってしまうデメリットがあるので、もし本マクロを使わないときはチェックを外しておきましょう。
ただし、本マクロを使い終わった後のチェックの有無設定はExcelを使用している端末の環境の仕様を最優先し、その仕様に合わせて行って下さい。
あくまでExcelの設定はお使いの環境の仕様を絶対に守るようお使いくださいね。
コードの例
Excelのマクロのコード(例)
Option Explicit Sub test() Dim VBComp As Object '標準モジュールやシートなどを扱うためのオブジェクト変数 Dim cnt As Integer 'カウンタ用変数 'カウンタを初期化する cnt = 1 For Each VBComp In ThisWorkbook.VBProject.VBComponents Select Case VBComp.Type Case 1 '標準モジュールの場合 'コンポーネントに付けられている名前をセルに出力する Range("A" & cnt).Value = VBComp.Name '種類をセルに出力する Range("B" & cnt).Value = "標準モジュール" Case 2 'クラスモジュールの場合 'コンポーネントに付けられている名前をセルに出力する Range("A" & cnt).Value = VBComp.Name '種類をセルに出力する Range("B" & cnt).Value = "クラスモジュール" Case 3 'ユーザーフォームの場合 'コンポーネントに付けられている名前をセルに出力する Range("A" & cnt).Value = VBComp.Name '種類をセルに出力する Range("B" & cnt).Value = "ユーザフォーム" Case 11 'ユーザーフォームの場合 'コンポーネントに付けられている名前をセルに出力する Range("A" & cnt).Value = VBComp.Name '種類をセルに出力する Range("B" & cnt).Value = "ActiveX デザイナ" Case 100 'ワークブックやシートの場合 'コンポーネントに付けられている名前をセルに出力する Range("A" & cnt).Value = VBComp.Name '種類をセルに出力する Range("B" & cnt).Value = "ワークブックまたはシート" Case Else End Select cnt = cnt + 1 Next End Sub
注目すべきコード①
最初に見て頂きたいのは11行目です。
For Each VBComp In ThisWorkbook.VBProject.VBComponents
以上のコードは、自分自身のExcelファイルにあるVBAオブジェクトモジュールの名称をVBComponentsコレクションから取得するためのループ処理のコードです。
VBComponentsコレクションから取得したオブジェクトを変数VBCompが受け取ります。
ThisWorkbookは自分自身のExcelなので、自分自身のExcelからVBAオブジェクトモジュールの名称をVBComponentsコレクションから取得することができるようになります。
なおこのループは自分自身のExcelファイルにあるVBAオブジェクトモジュールの数だけループします。
注目すべきコード②
次に見て頂きたいのは13行目です。
Select Case VBComp.Type
以上のコードは、VBComponentsコレクションのTypeプロパティの値を判定するコードです。
VBComponentsコレクションのTypeプロパティの値は次の種類があります。
- 1:標準モジュール
- 2:クラスモジュール
- 3:ユーザーフォーム
- 11:ActiveXデザイナ
- 100:Excelオブジェクト(ワークブック・シート)
このVBComponentsコレクションのTypeプロパティによって、以上の表のVBAオブジェクトモジュールが特定することができます。
今回はVBAオブジェクトモジュールの名称が目的なので、以上のVBComponentsコレクションのTypeプロパティの話は本筋から外れているかもしれませんが、VBAオブジェクトモジュールの種類を明示したいために、VBComponentsコレクションのTypeプロパティの話をさせて頂きました。
なお、VBAオブジェクトモジュールの種類を明示するコードは23行目で行っています。
'種類をセルに出力する Range("B" & cnt).Value = "標準モジュール"
以上は標準モジュールの場合です。
注目すべきコード③
次に見て頂きたいのは20行目です。
'コンポーネントに付けられている名前をセルに出力する Range("A" & cnt).Value = VBComp.Name
以上のコードは、VBAオブジェクトモジュールの名前をNameプロパティから取得してセルに出力するコードです。
動作確認
マクロ実行前
以下のシートにVBAオブジェクトモジュールの名前出力します。
今回用意したExcelファイルのVBEのプロジェクトエクスプローラーには下の画面の通り、フォームやシート、標準モジュールなどが存在しています。
このフォームやシート、標準モジュールなどの名称をExcelのシートに出力します。
マクロ実行後
マクロを実行すると、VBEのプロジェクトエクスプローラーに存在するフォームやシート、標準モジュールなどの名称がExcelのシートに出力されました。
最後に
本記事では、自分自身のExcelファイルにあるVBAオブジェクトモジュールの名称を全て取得する方法についてご説明しました。
本マクロを実行すれば簡単に自分自身のExcelファイルにあるVBAオブジェクトモジュールの名称を全て取得することができるので、現在VBAに存在するVBAオブジェクトモジュールの名称が欲しい場合は参考にしてみてくださいね。
Excelのスキル向上やExcelの基礎知識をしっかりと学びたいなら
Excelのスキルを習得したい、Excelの基礎知識をもっと理解したい、そう考えているなら「無期限サポート付きExcel講座【すごい改善】」がおすすめです。
Excelのスキルの基礎を身につけるなら【すごい改善】で無期限サポート付きがあるので、これで「Excelのスキルや基礎」を学ぶのにおすすめですよ。