個人的備忘録マクロ。
選択したExcelマクロブック(.xlsm)の全てのモジュール内のコードを同階層にフォルダを作ってエクスポートするやつ。
使用するためにはセキュリティーセンターかトラストセンターの「マクロの設定」で「VBA プロジェクト オブジェクト モデルへの信頼アクセスを許可する」にチェックを入れる必要あり。
重大なセキュリティ上の考慮事項を書いておくと、常時この設定を有効化していると危険性があるので、今回提示するマクロを使用する毎に設定のチェックON/OFFを切り替えることを強く推奨する。※もしこの意味が分からない人は絶対に使わないで
なんでこういうの作ったかというとWinMergeとかで差分比較する時に便利だから。めんどくさいからChatGPTに書かせて動作検証は最低限。当方は動作の一切の責任を負いません。
以上。
Option Explicit
Public Sub ExportVBAFromSelectedWorkbook()
Dim fd As FileDialog
Dim targetPath As String
Dim targetWorkbook As Workbook
Dim vbComp As Object
Dim exportFolder As String
Dim fileNameNoExt As String
' VBAプロジェクトへのアクセスを許可しているか確認
If Application.VBE.ActiveVBProject.Protection = 1 Then
MsgBox "VBAプロジェクトへのアクセスが制限されています。" & vbCrLf & _
"セキュリティセンターで『VBAプロジェクト オブジェクトモデルへの信頼アクセス』を有効にしてください。", vbCritical
Exit Sub
End If
' ファイル選択ダイアログ
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "エクスポートするマクロ付きExcelファイルを選択"
.Filters.Clear
.Filters.Add "Excel Macro-Enabled Workbook", "*.xlsm"
.AllowMultiSelect = False
If .Show <> -1 Then Exit Sub ' キャンセルされたら終了
targetPath = .SelectedItems(1)
End With
Application.ScreenUpdating = False
' ブックを非表示で開く(自動マクロなどがあれば注意)
Set targetWorkbook = Workbooks.Open(Filename:=targetPath, ReadOnly:=True)
' エクスポートフォルダ(同じ場所)
fileNameNoExt = Left(Dir(targetPath), InStrRev(Dir(targetPath), ".") - 1)
exportFolder = Left(targetPath, InStrRev(targetPath, "\")) & fileNameNoExt & "_VBAコード出力\"
If Dir(exportFolder, vbDirectory) = "" Then
MkDir exportFolder
End If
' モジュールごとに書き出し
For Each vbComp In targetWorkbook.VBProject.VBComponents
Select Case vbComp.Type
Case 1 ' 標準モジュール
vbComp.Export exportFolder & vbComp.Name & ".bas"
Case 2, 100 ' クラス or ThisWorkbook/Sheet
vbComp.Export exportFolder & vbComp.Name & ".cls"
Case 3 ' フォーム
vbComp.Export exportFolder & vbComp.Name & ".frm"
End Select
Next vbComp
targetWorkbook.Close SaveChanges:=False
Application.ScreenUpdating = True
MsgBox "エクスポート完了:" & vbCrLf & exportFolder, vbInformation
End Sub