No Programming, No Life

プログラミング関連の話題や雑記

【VBA】VBAプロジェクトの全ソースを一括エクスポートする

f:id:fumokmm:20200504205857p:plain

VBAプロジェクトのソースって、他のJavaやCなどのプログラミング言語と違って、ExcelAccessVisual Studio Editor(VBE)をわざわざ開かないと閲覧・編集できないし、バージョン管理もしづらいですよね。そんなとき、ソースを右クリックし「ファイルのエクスポート」をすることができますが、これがファイル単位でしか行えないから非常に不便、みなさんそんな風に感じませんか?

そこで、この記事では、そんな悩み多きVBAプロジェクトで、全ソースを一括でエクスポートする方法をご紹介します。

なお、この記事ではExcelを例にご紹介しています。Accessなどでも同様のことを行いたい場合は、少しの修正で対応が可能になると思います。

想定読者

この記事はある程度VBAのスキルがある読者を想定しています。少なくてもVBAプロジェクトのソースをエクスポートして、ソース管理したいな・・・と思えるくらいの人を想定しています。

準備

まずはVBAプロジェクトの下準備が必要です。具体的には以下の参照設定にチェックが付けられているか確認して下さい。

f:id:fumokmm:20200504182529p:plain
Microsoft Visual Basic for Applications Extensibility 5.3への参照設定にチェックを付ける

f:id:fumokmm:20200504182726p:plain
Microsoft Scripting Rungimeへの参照設定にチェックを付ける

方法

1.まずVBEを開きます。(Alt + F11)

2.標準モジュールで新規モジュールを作成します。例ではExportModuleという名前で作成しました。(名前は任意)

f:id:fumokmm:20200504183504p:plain

ソースはこちら (ExportModule)

Option Explicit

Sub ExportMacroSource()
    ' [参照設定] Microsoft Visual Basic for Applications Extensibility 必要
    ' [参照設定] Microsoft Scripting Rungime 必要

    Dim p_fso As Scripting.FileSystemObject
    Set p_fso = New Scripting.FileSystemObject
    
    Dim p_macroDir As String
    p_macroDir = p_fso.BuildPath(Application.ActiveWorkbook.Path, "MacroSource")
    If Not p_fso.FolderExists(p_macroDir) Then
        p_fso.CreateFolder p_macroDir
    End If

    Dim p_vbComp As VBIDE.VBComponent
    Dim p_typeLabel As String
    Dim p_extension As String
    Dim p_outputFileName As String
    For Each p_vbComp In Application.VBE.ActiveVBProject.VBComponents
        ' タイプから拡張子を特定
        Select Case p_vbComp.Type
            Case vbext_ct_ActiveXDesigner
                p_typeLabel = "ActiveXDesigner"
                p_extension = "cls"
            
            Case vbext_ct_ClassModule
                p_typeLabel = "ClassModule"
                p_extension = "cls"
            
            Case vbext_ct_Document
                p_typeLabel = "Document"
                p_extension = "cls"
            
            Case vbext_ct_MSForm
                p_typeLabel = "MSForm"
                p_extension = "frm"
            
            Case vbext_ct_StdModule
                p_typeLabel = "StdModule"
                p_extension = "bas"
        End Select
    
        ' エクスポート実施
        p_outputFileName = p_fso.BuildPath(p_macroDir, p_vbComp.Name & "." & p_extension)
        Debug.Print "[export] " & p_outputFileName
        p_vbComp.Export Filename:=p_outputFileName
     
    Next p_vbComp
    
    Debug.Print "Finish export."

End Sub

3.ExportModuleを開いているエディタ上で、F5をクリック (実行)します。

4.イミディエイトウィンドウにも出力結果が出力されます。

f:id:fumokmm:20200504184452p:plain
イミディエイトウィンドウの出力結果

5.Excelファイルが置いてあるパスと同じパスに「MacroSource」というフォルダが作成されVBAプロジェクトの全ソースが一括エクスポートされます。

f:id:fumokmm:20200504184612p:plain

注意として、2回出力するとソースは上書きされますのでご注意下さい。 あとは、お好きなソース管理システムにコミットして下さい。

信頼性に欠けるというエラーが出た場合は?

実行時に「信頼性に欠ける」というエラーが出た場合、「開発者向けのマクロ設定」の「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」のチェックボックスにチェックを付けてから実行してみて下さい。

f:id:fumokmm:20200504184101p:plain

f:id:fumokmm:20200504184134p:plain

f:id:fumokmm:20200504184150p:plain

まとめ

ここではVBAプロジェクトで、全ソースを一括でエクスポートする方法をご紹介しました。 アドインにするなどすればもっと便利にできると思いますが、サクっと一括エクスポートできる環境を整えたい場合には、ぜひ今回ご紹介した方法を利用してみて下さいね!

参考

MS Access のVBAモジュールを全てエクスポート | mofu犬blog