Think Twice
IT技術メモ | VBAのメモ
Created: 2020-05-04 / Updated: 2021-05-19

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


当メモは2020-05-04に投稿されたものを加筆修正し、再掲したものです。

目次


はじめに

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

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

想定読者

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

準備

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

Microsoft Visual Basic for Applications Extensibility 5.3への参照設定にチェックを付ける
Microsoft Scripting Runtimeへの参照設定にチェックを付ける

方法

ソースはこちら

ExportModule
Copy
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

(イミディエイトウィンドウの出力結果)

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

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

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

まとめ

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


参考

元記事

参考サイト