【ExcelVBA】閉じているExcelファイルにあるVBAオブジェクトモジュールのソースコードをファイルに保存する方法

この記事では、閉じているExcelファイルにあるVBAオブジェクトモジュールのソースコードをファイルに保存する方法についてご説明します。

【動画】閉じているExcelファイルにあるVBAオブジェクトモジュールの名称を全て取得する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


閉じているExcelファイルを開いてVBComponentsコレクションを使い、Exportメソッドを実行することでVBAのオブジェクトモジュールのソースコードをファイルに出力しています。

実はExcelファイルが閉じたままだとVBAのオブジェクトモジュールのソースコードを取得できません。

マクロがExcelのファイルが開いた状態にしておき、VBComponentsコレクションを使い、Exportメソッドを実行することでVBAのオブジェクトモジュールのソースコードをファイルに出力しています。

ちなみに、今回は読み取り専用でExcelのファイルを開いています。

マクロ作成の流れ

STEP.1
VBAのオブジェクトモジュールの名称を全て取得したいExcelファイルを開く
VBAのオブジェクトモジュールの名称を全て取得したいExcelファイルを開きます。
STEP.2
STEP.1で開いたExcelファイルに対してVBComponentsコレクションからExportメソッドを実行し、VBAのオブジェクトモジュールのソースコードをファイルに出力する。
STEP.1で開いたExcelファイルに対してVBComponentsコレクションのExportメソッドを実行し、VBAのオブジェクトモジュールのソースコードをファイルに出力します。

【注意】VBComponentsコレクションを扱うにはある設定を行わないとエラーになり動作しない

VBComponentsコレクションを扱うにはある設定を行わないとエラーになり動作しません。

設定を行わないままVBComponentsコレクションを呼び出そうとすると下のようにエラーが発生して正常に動作しません。

ではその必要な設定はというと、次の画面(トラストセンター画面)で行う「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」のチェックを付ける設定です。

このチェックを付けておかないとエラーが先ほどのエラーが発生してしまうので、必ずチェックをつけましょう。

なお、チェックを付けるとセキュリティ面が弱くなってしまうデメリットがあるので、もし本マクロを使わないときはチェックを外しておきましょう。

補足

ただし、本マクロを使い終わった後のチェックの有無設定はExcelを使用している端末の環境の仕様を最優先し、その仕様に合わせて行って下さい。
あくまでExcelの設定はお使いの環境の仕様を絶対に守るようお使いくださいね。

トラストセンター画面の開き方及び「マクロの設定」の表示方法

トラストセンター画面の開き方及び「マクロの設定」の表示方法は次の通りです。

①「ファイル」をクリックする

「ファイル」をクリックします。

②「オプション」をクリックする

「オプション」をクリックします。

③「Excelのオプション」画面でトラストセンターをクリックしトラストセンターボタンをクリックする

「Excelのオプション」画面が表示されたら、「トラストセンター」をクリックします。

するとトラストセンターに関する画面が表示されるので、その中にある「トラストセンターの設定」ボタンをクリックします。

④トラストセンター画面の開き方及び「マクロの設定」が表示される

「トラストセンター」画面が表示され、「マクロの設定」をクリックすると、「マクロの設定」に関する画面が表示されます。

手順は以上になります。

コードの例

Excelのマクロのコード(例)

Option Explicit

Sub test()

    Dim VBComp          As Object       '標準モジュールやシートなどを扱うためのオブジェクト変数
    Dim cnt             As Integer      'カウンタ用変数
    Dim excelFilePath   As String       'VBAオブジェクトモジュールの名称を取得したいExcelファイルの格納先
    Dim buf             As String       'Excelのファイル名を受け取る用の一時格納用変数
    Dim exportFilePath  As String       'ソースコードを書き出すファイルの出力先
    
    'カウンタを初期化する
    cnt = 1
    
    'VBAオブジェクトモジュールの名称を取得したいExcelファイルの格納先を取得する
    excelFilePath = ThisWorkbook.Path & "\" & "file" & "\"
    
    'ソースコードを書き出すファイルの出力先を取得する
    exportFilePath = ThisWorkbook.Path & "\" & "src" & "\"
    
    'VBAオブジェクトモジュールの名称を取得したいExcelファイルを取得する
    buf = Dir(excelFilePath & "*.xlsm")

    'Excelファイルの数だけ処理を繰り返すループ
    Do While buf <> ""
    
        'Excelファイルを読み取り専用で開く
        Workbooks.Open excelFilePath & buf, ReadOnly:=True

        'VBAオブジェクトモジュールの数だけ処理を繰り返すループ
        For Each VBComp In ActiveWorkbook.VBProject.VBComponents
        
            'マクロ側の(ブックと)シート
            With Workbooks(ThisWorkbook.Name).Worksheets("work")

                Select Case VBComp.Type
    
                    Case 1
    
                        '標準モジュールの場合
                        
                        'ソースコードをファイルに出力する
                        VBComp.Export exportFilePath & VBComp.Name & ".bas"
    
                    Case 2, 100
    
                        'クラスモジュール、ワークブックやシートの場合
                        
                        'ソースコードをファイルに出力する
                        VBComp.Export exportFilePath & VBComp.Name & ".cls"
    
                    Case 3
    
                        'ユーザーフォームの場合
                        
                        'ソースコードをファイルに出力する
                        VBComp.Export exportFilePath & VBComp.Name & ".frm"
    
                    Case Else
    
                End Select
                
            End With

            cnt = cnt + 1

        Next
    
        '開いたExcelファイルを閉じる
        Workbooks(buf).Close SaveChanges:=False
    
        'Excelファイル名を取得する
        buf = Dir()
        
    Loop
    
End Sub

注目すべきコード①

最初に見て頂きたいのは15行目から21行目です。

    'VBAオブジェクトモジュールの名称を取得したいExcelファイルの格納先を取得する
    excelFilePath = ThisWorkbook.Path & "\" & "file" & "\"
    
    'ソースコードを書き出すファイルの出力先を取得する
    exportFilePath = ThisWorkbook.Path & "\" & "src" & "\"
    
    'VBAオブジェクトモジュールの名称を取得したいExcelファイルを取得する
    buf = Dir(excelFilePath & "*.xlsm")

    'Excelファイルの数だけ処理を繰り返すループ
    Do While buf <> ""

以上のコードは、VBAオブジェクトモジュールのソースコードを取得するExcelファイルの置き場とそのソースコードのファイルを出力する格納先、そしてExcelファイルの数だけ処理を繰り返すDoループ文のコードです。

21行目で、フォルダ内の拡張子が「xlsm」のExcelファイルをDir関数を実行して取得しています。

次に24行目のDoループですが、Excelファイルの置き場にあるExcelファイル全てを対象に処理が終わると、この24行目のループは終了します。

注目すべきコード②

次に見て頂きたいのは27行目です。

        'Excelファイルを読み取り専用で開く
        Workbooks.Open excelFilePath & buf, ReadOnly:=True

以上のコードは、Excelファイルを読み取り専用で開く処理のコードです。

実はExcelファイルが閉じたままだとVBAのオブジェクトモジュールの名称を取得できません。

開いている状態でないとVBAのオブジェクトモジュールの名称を取得できないので、マクロがExcelのファイルが開いた状態にしておきます。

なお、開いたExcelファイルに誤って何か変更を加えて保存してしまうことが無いように、読み取り専用でExcelをファイルを開くようにしています。

注目すべきコード③

次に見て頂きたいのは26行目です。

        'VBAオブジェクトモジュールの数だけ処理を繰り返すループ
        For Each VBComp In ActiveWorkbook.VBProject.VBComponents

以上のコードは、開いたExcelファイルにあるVBAオブジェクトモジュールのソースコードをVBComponentsコレクションから取得するためのループ処理のコードです。

VBComponentsコレクションから取得したオブジェクトを変数VBCompが受け取ります。

ActiveWorkbookは開いたExcelなので、そのExcelファイルからVBAオブジェクトモジュールのソースコードをVBComponentsコレクションから取得することができるようになります。

なおこのループは開いたExcelファイルにあるVBAオブジェクトモジュールの数だけループします。

注目すべきコード④

次に見て頂きたいのは35行目です。

                Select Case VBComp.Type

以上のコードは、VBComponentsコレクションのTypeプロパティの値を判定するコードです。

VBComponentsコレクションのTypeプロパティの値は次の種類があります。

  1. 1:標準モジュール
  2. 2:クラスモジュール
  3. 3:ユーザーフォーム
  4. 11:ActiveXデザイナ
  5. 100:Excelオブジェクト(ワークブック・シート)

このVBComponentsコレクションのTypeプロパティによって、以上の表のVBAオブジェクトモジュールが特定することができます。

以上の1から100の値対してTypeプロパティの値の判定が合致しているかの判定は次のコードで行っています。

                    Case 1, 100
                    Case 2
                    Case 3

注目すべきコード③

次に見て頂きたいのは37行目から58行目です。

                    Case 1
    
                        '標準モジュールの場合
                        
                        'ソースコードをファイルに出力する
                        VBComp.Export exportFilePath & VBComp.Name & ".bas"
    
                    Case 2, 100
    
                        'クラスモジュール、ワークブックやシートの場合
                        
                        'ソースコードをファイルに出力する
                        VBComp.Export exportFilePath & VBComp.Name & ".cls"
    
                    Case 3
    
                        'ユーザーフォームの場合
                        
                        'ソースコードをファイルに出力する
                        VBComp.Export exportFilePath & VBComp.Name & ".frm"
    
                    Case Else

以上のコードは、VBAオブジェクトモジュールごとにソースコードをファイルに出力しているコードです。

ソースコードをファイルに出力するのはExportメソッドを実行します。

Exportメソッドの引数にはファイルの出力先を指定します。

ファイルに出力する際は、拡張子の文字列を連結させています。

拡張子の指定は実際に「ファイルのエクスポート」機能で出力されるときに指定される拡張子に合わせています。

【参考①:VBEのエクスポート時の拡張子の確認】標準モジュールの場合

標準モジュールの場合は拡張子は「bas」になります。

【参考②:VBEのエクスポート時の拡張子の確認】クラスモジュールの場合

クラスモジュールの場合は拡張子は「cls」になります。

【参考③:VBEのエクスポート時の拡張子の確認】Workbookの場合

Workbookの場合は拡張子は「cls」になります。

【参考④:VBEのエクスポート時の拡張子の確認】ワークシートの場合

Workbookの場合は拡張子は「cls」になります。

【参考⑤:VBEのエクスポート時の拡張子の確認】ユーザーフォームの場合

ユーザーフォームの場合は拡張子は「bas」になります。

動作確認

マクロ実行前

以下のフォルダにVBAオブジェクトモジュールのソースコードを書き出すファイルを生成します。

また、今回は以下のVBAオブジェクトモジュールのソースコードを対象にマクロを実行します。

標準モジュール(例)

クラスモジュール(例)

Workbook(例)

ワークシート(例)

ユーザーフォーム(例)

マクロ実行後

以下のフォルダにVBAオブジェクトモジュールのソースコードが生成されました。

生成されたファイルの中身は次の通りです。

標準モジュール(例)

クラスモジュール(例)

Workbook(例)

ワークシート(例)

ユーザーフォーム(例)

ソースコードの上の行にいくつかソースコードに関連する情報が書き込まれていますが、肝心のソースコード自体は問題なく存在していることが確認できます。

最後に

本記事では、閉じているExcelファイルにあるVBAオブジェクトモジュールのソースコードをファイルに保存する方法についてご説明しました。

VBAオブジェクトモジュールのソースコードはいちいちExcelを開いてVBEを開かないと確認できません。

ソースコード見たいのに面倒な手間がかかりますし、確認したいExcelファイルの数が多い場合はかなり大変だと思います。

そんなときは本記事のマクロを使うことで楽にソースコードを確認することができます。

また、本マクロを使ってソースコードを一気にファイルに出力することで、テキストエディタなどのGREP機能を使えばソースコードの中身を検索することもできます。

閉じているExcelファイルにあるVBAオブジェクトモジュールのソースコードを手軽に確認したい場合は本記事を参考にしてみてくださいね。

Excelのスキル向上やExcelの基礎知識をしっかりと学びたいなら

Excelのスキルを習得したい、Excelの基礎知識をもっと理解したい、そう考えているなら「無期限サポート付きExcel講座【すごい改善】」がおすすめです。

Excelのスキルの基礎を身につけるなら【すごい改善】で無期限サポート付きがあるので、これで「Excelのスキルや基礎」を学ぶのにおすすめですよ。

→ 受講後、何度でも無期限でメールで質問できるアフターサポートがついているExcelマスター講座はこちら