VBAのモジュールを個別もしくは一括でエクスポートする。
VBAでモジュール(標準モジュール・クラス・ユーザフォーム・ExcelObjects)を個別もしくは一括エクスポートするにはVBComponentsコレクションのExportメソッドを利用することでできます。
フォームのモジュールはエクスポート時に frx という拡張子のファイルが同時にエクスポートされます。フォームは出力指定したファイルとこのfrxファイルは2つで1つのモジュール扱いとなるので、インポートをする時はかならず2つのファイルが揃っている必要があります。
サンプルコードでは、指定のモジュールだけをエクスポートする方法と、指定のブックにあるすべてのモジュールを一括でエクスポートする方法を記載しています。
一括で出力する時には、出力先のフォルダにサブフォルダを作成してその中にエクスポートするようにしています。
※実行時に「プログラミングによる Visual Basic プロジェクトへのアクセスは信頼性に欠けます」または「’VBE’メソッドは失敗しました’_application’オブジェクト」のエラーメッセージが表示された場合
動作確認
Windows10/Excel2016:○
Windows11/Excel2024:○
●指定したモジュールのエクスポート
'******************************************************************************
' モジュールの個別エクスポート
'******************************************************************************
Sub moduleExport_Single()
'エクスポート対象のモジュールがあるオブジェクトを取得
'このサンプルコードは自ブックを参照
Dim wbObj As Workbook
Set wbObj = ThisWorkbook
'別ブックであれば下記のように記載
'Dim sBookPath As String
'sBookPath = "C:\VBA\VBAコード管理.xlsm"
'Set wbObj = Workbooks.Open(fileName:=sBookPath, ReadOnly:=True, UpdateLinks:=0)
'出力フォルダを指定
Dim sExportDir As String
sExportDir = "C:\VBA\module\"
'VBComponentsコレクションを取得
Dim VBComponents As Object
Set VBComponents = wbObj.VBProject.VBComponents
'指定のモジュールをエクスポート
'※指定したモジュール名が存在しない場合はエラーになる
VBComponents("VBA_MDL_EXPORT").Export sExportDir & "VBA_MDL_EXPORT.bas"
Set VBComponents = Nothing
End Sub■実行前

■実行結果

●モジュールの一括エクスポート(指定したブックのすべてのモジュールを一括でエクスポート)
'******************************************************************************
' モジュールの一括エクスポート
'******************************************************************************
Sub moduleExport()
'エクスポート対象のモジュールがあるファイルを指定
Dim sBookPath As String
sBookPath = "C:\VBA\VBAコード管理.xlsm"
'エクスポート対象のモジュールがあるオブジェクトを取得
Dim wbObj As Workbook
'読み取り専用、リンクの更新のメッセージを非表示
Set wbObj = Workbooks.Open(fileName:=sBookPath, ReadOnly:=True, UpdateLinks:=0)
'出力フォルダを指定
Dim sExportDir As String
sExportDir = "C:\VBA\module\"
'出力フォルダの末尾に\があるか確認、なければ付与
If Right(sExportDir, 1) <> "\" Then: sExportDir = sExportDir & "\"
'モジュールをエクスポート
Call moduleExport_All(wbObj, sExportDir)
MsgBox "完了"
End Sub
'******************************************************************************
' モジュールのエクスポート(全モジュール)
'------------------------------------------------------------------------------
' 第1引数:ブックオブジェクト
' 第2引数:出力フォルダのパス
'******************************************************************************
Sub moduleExport_All(getObjBook As Object, getExpPath As String)
'出力フォルダに出力用のサブフォルダを作成
Dim sExportSubDir As String
sExportSubDir = getExpPath & "Excel_mdl_" & Format(Now(), "yyyymmdd_hhmmss") & "\"
MkDir sExportSubDir
'VBComponentsコレクションを取得
Dim VBComponents As Object
Set VBComponents = getObjBook.VBProject.VBComponents
'全モジュールのエクスポート
Dim i As Long
For i = 1 To VBComponents.Count
With VBComponents(VBComponents(i).Name)
Dim sExt As String
'種類ごとに拡張子を変更
Select Case VBComponents(i).Type
Case 1 '標準モジュール
sExt = ".bas"
Case 2, 100 'クラスモジュール、ExcelObjects
sExt = ".cls"
Case 3 'フォーム
'フォームのエクスポート時はfrxファイルが同時にエクスポートされる
sExt = ".frm"
End Select
'エクスポート
.Export sExportSubDir & VBComponents(i).Name & sExt
End With
Next
'Excelファイルを閉じる
getObjBook.Close SaveChanges:=False
Set VBComponents = Nothing
End Sub■実行前

■実行結果




