プログラム

VAコード・エクスポート:すべてのVBAモジュールのコードを1つのファイルにエクスポートする(Word/Excel VBA)

VBAの作成や修正に生成AIを使う機会が増えてきましたね。

そうですね。でも、修正を行うときに、VBAのコードをAIにコピー&ペーストするのが面倒です。

なるほど。VBEでは、モジュールを一つずつしかエクスポートできませんからね。
プロジェクト全体を一括してエクスポートするマクロを作ってみましょう。

お願いします。

単純なマクロなのでAIで作れると思います。

概要

このマクロを実行すると、現在開いているWord文書(またはExcelブック)に含まれるすべての標準モジュール、クラス・モジュール、ユーザー・フォーム、ドキュメント・モジュール(ThisDocumentやThisWorkbook, Sheetなど)のコードを、一つのtxtファイルにまとめて出力します。

出力されたテキストファイルを開いてコピーするだけで、プロジェクトの全コードを瞬時に渡すことができます。

プログラムのダウンロード

使い方

アドインへの登録

ダウンロードしたファイルをWordの場合は「スタートアップフォルダ」、Excelの場合は「アドインフォルダ」に保存すれば、アドインとして、いつでもマクロを利用できるようになります。(他の使い方もできますが、この方法を推奨します。)

セキュリティ設定の変更

このマクロは、VBAプロジェクトの構造自体にアクセスしてコードを読み取るため、実行前にExcel/Word側でセキュリティ設定を許可する必要があります。

  1. 「ファイル」 > 「オプション」 > [トラスト センター] を開きます。
  2. 「トラスト センターの設定」 ボタンを押します。
  3. 「マクロの設定」 を選択します。
  4. 「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」にチェックを入れます。

この設定がOFFになっていると、マクロはエラーで停止します。

エクセルのアドインの場合

このマクロは、エクセルのアドイン・ファイル(.xlam)には対応していません。アドイン・ファイルは通常のブック・ファイル(.xlsm)に戻してからエクスポートを行ってください。
アドイン・ファイルをブック・ファイルに変更する手順については、次の記事を参考にしてください。

コードのエクスポート

コードをエクスポートしたいWordまたはExcelファイル開いて、アクティブな状態にしてから、クイックアクセス・ツールバーの「ファイル作成」ボタンをクリックしてください。

エクスポートしたファイルは、アクティブになっているWordまたはExcelファイルと同じフォルダに保存されます。ただし、OneDrive上の場合は、マイドキュメント・フォルダに保存されます。

VBAコード

Word用プログラムのコード

'================================================================================
' Module      : basExportAllModules_Word
' Description : アクティブなWord文書またはテンプレートのVBAコードをエクスポートします。
'================================================================================

Option Explicit

'''
' @Description アクティブなWordファイル(文書、テンプレート等)のVBAコードを単一のテキストファイルにエクスポートします。
'
Public Sub ExportAllModulesFromActiveFile_Word()
    ' ---
    ' 事前準備:
    ' [ファイル] > [オプション] > [トラスト センター] > [トラスト センターの設定] >
    ' [マクロの設定] で「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」を有効にしてください。
    ' ---
    
    On Error GoTo ErrorHandler
    
    '--- 変数の宣言 ---
    Dim vbProj As Object          ' VBIDE.VBProject
    Dim vbComp As Object          ' VBIDE.VBComponent
    Dim codeMod As Object         ' VBIDE.CodeModule
    Dim exportFilePath As String  ' 出力ファイルパス
    Dim fileNum As Integer        ' ファイル番号
    Dim componentCode As String   ' モジュールコード
    Dim notificationMsg As String ' 通知用メッセージ
    
    '--- 1. アクティブなドキュメントのチェック ---
    If ActiveDocument Is Nothing Then
        MsgBox "アクティブなドキュメントがありません。", vbExclamation, "対象なし"
        Exit Sub
    End If
    
    '--- 2. アクティブなドキュメントのプロジェクトを取得 ---
    Set vbProj = ActiveDocument.VBProject

    '--- 3. 出力ファイルパスの決定ロジック (ActiveDocument 基準) ---
    If Left(LCase(ActiveDocument.Path), 4) = "http" Then
        ' 1. 対象がOneDrive上のファイルの場合
        exportFilePath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\" & _
                         Left(ActiveDocument.Name, (InStrRev(ActiveDocument.Name, ".") - 1)) & _
                         "_VBA_Code.txt"
        notificationMsg = "ドキュメントがOneDrive上に保存されているため、出力先を「ドキュメント」フォルダに変更しました。"
        
    ElseIf ActiveDocument.Path <> "" Then
        ' 2. 対象がローカルに保存されている通常のファイルの場合
        exportFilePath = ActiveDocument.Path & "\" & _
                         Left(ActiveDocument.Name, (InStrRev(ActiveDocument.Name, ".") - 1)) & _
                         "_VBA_Code.txt"
    Else
        ' 3. 対象が未保存のファイルの場合
        exportFilePath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\Unsaved_Document_VBA_Code.txt"
    End If

    '--- 4. 必要に応じてユーザーに通知 ---
    If notificationMsg <> "" Then
        MsgBox notificationMsg, vbInformation, "出力先の変更"
    End If
    
    '--- 5. ファイルへの書き込み処理 ---
    fileNum = FreeFile
    Open exportFilePath For Output As #fileNum

    For Each vbComp In vbProj.VBComponents
        Set codeMod = vbComp.CodeModule
        If codeMod.CountOfLines > 0 Then
            Print #fileNum, "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''"
            Print #fileNum, "' Component Name: " & vbComp.Name
            Print #fileNum, "' Component Type: " & GetComponentTypeName(vbComp.Type)
            Print #fileNum, "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''"
            Print #fileNum, ""
            componentCode = codeMod.Lines(1, codeMod.CountOfLines)
            Print #fileNum, componentCode
            Print #fileNum, ""
            Print #fileNum, ""
        End If
    Next vbComp
    
    Close #fileNum
    
    '--- 6. 完了メッセージ ---
    MsgBox "アクティブなファイル(" & ActiveDocument.Name & ")のコードが以下の場所に出力されました:" & vbCrLf & _
           exportFilePath, vbInformation, "エクスポート完了"
    
    Exit Sub

'--- エラー処理 ---
ErrorHandler:
    MsgBox "エラーが発生しました。" & vbCrLf & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical, "エラー"
    If fileNum > 0 Then Close #fileNum
End Sub

' コンポーネント種別名を返す関数
Private Function GetComponentTypeName(ByVal compType As Integer) As String
    Select Case compType
        Case 1: GetComponentTypeName = "標準モジュール"
        Case 2: GetComponentTypeName = "クラス・モジュール"
        Case 3: GetComponentTypeName = "ユーザー・フォーム"
        Case 100: GetComponentTypeName = "ドキュメント・モジュール (ThisDocument, Sheetなど)"
        Case Else: GetComponentTypeName = "不明な種類 (" & compType & ")"
    End Select
End Function

Excel用プログラムのコード

'================================================================================
' Module      : basExportAllModules_Excel
' Description : アクティブなExcelブック(アドインを除く)のVBAコードをエクスポートします。
'================================================================================

Option Explicit

'--------------------------------------------------------------------------------
' 事前準備:
' [ファイル] > [オプション] > [トラスト センター] > [トラスト センターの設定] >
' [マクロの設定] で「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」を有効にしてください。
'--------------------------------------------------------------------------------


'''
' @Description アクティブなExcelファイル(ブック、テンプレート等)のVBAコードを単一のテキストファイルにエクスポートします。
'
Public Sub ExportAllModulesFromActiveFile_Excel()
    
    '--- 変数の宣言 ---
    Dim vbProj As Object
    Dim vbComp As Object
    Dim codeMod As Object
    Dim exportFilePath As String
    Dim fileNum As Integer
    Dim componentCode As String
    Dim notificationMsg As String
    
    On Error GoTo ErrorHandler
    
    '--- 1. アクティブなブックのプロジェクトを取得 ---
    If ActiveWorkbook Is Nothing Then
        MsgBox "アクティブなブックがありません。", vbExclamation, "対象なし"
        Exit Sub
    End If
    
    Set vbProj = ActiveWorkbook.VBProject

    '--- 2. アドインファイルでないかチェック ---
    If ActiveWorkbook.IsAddin Then
        MsgBox "アドインファイル(.xlam)は対象外です。" & vbCrLf & _
               "ファイル形式を変更してから実行してください。", "処理中断"
        Exit Sub
    End If
    
    '--- 3. 出力ファイルパスの決定ロジック (ActiveWorkbook 基準) ---
    
    If Left(LCase(ActiveWorkbook.Path), 4) = "http" Then
        ' 1. 対象がOneDrive上のファイルの場合
        exportFilePath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\" & _
                         Left(ActiveWorkbook.Name, (InStrRev(ActiveWorkbook.Name, ".") - 1)) & _
                         "_VBA_Code.txt"
        notificationMsg = "ブックがOneDrive上に保存されているため、出力先を「ドキュメント」フォルダに変更しました。"
            
    ElseIf ActiveWorkbook.Path <> "" Then
        ' 2. 対象がローカルに保存されている通常のファイルの場合
        exportFilePath = ActiveWorkbook.Path & "\" & _
                         Left(ActiveWorkbook.Name, (InStrRev(ActiveWorkbook.Name, ".") - 1)) & _
                         "_VBA_Code.txt"
    Else
        ' 3. 対象が未保存のファイルの場合
        exportFilePath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\Unsaved_Workbook_VBA_Code.txt"
    End If
    
    '--- 4. 必要に応じてユーザーに通知 ---
    If notificationMsg <> "" Then
        MsgBox notificationMsg, vbInformation, "出力先の変更"
    End If
    
    '--- 5. ファイルへの書き込み処理 ---
    fileNum = FreeFile
    Open exportFilePath For Output As #fileNum

    For Each vbComp In vbProj.VBComponents
        Set codeMod = vbComp.CodeModule
        If codeMod.CountOfLines > 0 Then
            Print #fileNum, "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''"
            Print #fileNum, "' Component Name: " & vbComp.Name
            Print #fileNum, "' Component Type: " & GetComponentTypeName(vbComp.Type)
            Print #fileNum, "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''"
            Print #fileNum, ""
            componentCode = codeMod.Lines(1, codeMod.CountOfLines)
            Print #fileNum, componentCode
            Print #fileNum, ""
            Print #fileNum, ""
        End If
    Next vbComp
    
    Close #fileNum
    
    '--- 6. 完了メッセージ ---
    MsgBox "アクティブなファイル(" & ActiveWorkbook.Name & ")のコードが以下の場所に出力されました:" & vbCrLf & _
           exportFilePath, vbInformation, "エクスポート完了"
            
    Exit Sub

'--- エラー処理 ---
ErrorHandler:
    MsgBox "エラーが発生しました。" & vbCrLf & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical, "エラー"
    If fileNum > 0 Then Close #fileNum
End Sub


' コンポーネント種別名を返す関数
Private Function GetComponentTypeName(ByVal compType As Integer) As String
    Select Case compType
        Case 1: GetComponentTypeName = "標準モジュール"
        Case 2: GetComponentTypeName = "クラス・モジュール"
        Case 3: GetComponentTypeName = "ユーザー・フォーム"
        Case 100: GetComponentTypeName = "ドキュメント・モジュール (ThisWorkbook, Sheetなど)"
        Case Else: GetComponentTypeName = "不明な種類 (" & compType & ")"
    End Select
End Function

💡


コメント

タイトルとURLをコピーしました