VBAサンプル集
VBA モジュールエクスポートツール
モジュールを選別して一括出力

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2026-08-06 最終更新日:2026-08-08

VBA モジュールエクスポートツール|モジュールを選別して一括出力


VBA開発や保守運用を行っていると、既存のブックから特定種類のモジュール(標準モジュールやクラス、フォームなど)のみを選別して一括エクスポートしたい場面が多々あります。
全てのモジュールを一括でエクスポートするだけなら短いコードで済みますが、必要なモジュールだけを選別してエクスポートするとなると、VBE(Visual Basic Editor)の標準機能では1つずつ手動で行う必要があり、作業が非常に煩雑です。


そこで、モジュールのタイプ(種別)ごとに表示を絞り込み、必要なモジュールだけを選択して指定フォルダへ一括エクスポートできるユーザーフォームツールを作成しました。

※本記事のVBAコードおよび解説文章の多くは、生成AI(ChatGPT、Gemini、Claude)を活用して作成しました。VBA動作や解説文の最終的な内容は人間による確認・編集を経て掲載しています。


ページ内目次

機能概要

モジュールタイプによる表示フィルター
チェックボックス(標準モジュール、クラスモジュール、ユーザーフォーム、ブック/シート)のオン・オフで、リストに表示するモジュール種別を即座に絞り込むことができます。

リストボックスでの柔軟なモジュール選択
対象ブックからモジュール一覧を読み込み、「モジュール名」と「種別」の2列で一覧表示します。複数選択(マルチセレクト)に対応しており、必要なものだけを任意に選べます。

エクスポート先の自由指定と各種設定の保持
ダイアログで指定したフォルダへ、各タイプに合った適切な拡張子(.bas / .cls / .frm)でまとめてエクスポートします。次回操作時の利便性のため、前回の選択ファイル・フォルダやフィルターのチェック状態を専用シート(Config)へ自動保存します。


事前設定

本ツールは外部ブックのVBA構造(VBProject)をプログラムから操作するため、事前にExcel側で以下のセキュリティ許可を設定する必要があります。

Excelの
[ファイル] > [オプション] > [トラスト センター](セキュリティ センター)
を開きます。

[トラスト センターの設定] ボタンをクリックします。

Excel VBA モジュールエクスポートツール

[マクロの設定] タブで 「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」 にチェックを入れて OK をクリックします。

Excel VBA モジュールエクスポートツール


設定保存用シート(Configシート)

本ツールでは、設定情報の保存に Windows レジストリ(SaveSetting / GetSetting)を使わず、自ブック内に作成した Config という専用シートを利用しています。
アドイン化やブックの移動・配布が容易になり、環境が変わっても同一の設定環境を保持できます。

Excel VBA モジュールエクスポートツール

データ構造

Config シートは、A列を「設定キー(Key)」、B列を「設定値(Value)」とするシンプルかつ拡張性の高い Key-Value 構造でデータを管理します。

A列(キー名) B列(設定値の例) 説明
chkDocument True / False 「ブック/シート」チェックボックスの状態
chkStdModule True / False 「標準モジュール」チェックボックスの状態
chkClassModule True / False 「クラスモジュール」チェックボックスの状態
chkForm True / False 「ユーザーフォーム」チェックボックスの状態
LastFilePath C:\Users\...\Target.xlsm 前回選択した対象ファイルのフルパス
LastExportFolder C:\Users\...\Export 前回エクスポート先に指定したフォルダパス


フォームの概要

VBAのユーザーフォームオブジェクト名: frmModuleExporter
フォーム上に配置するコントロールの一覧は以下の通りです。

コントロール種別 オブジェクト名 (Name) 役割 / 設定内容
TextBox txtFilePath 選択した対象Excelファイルのパスを表示
CommandButton btnSelectFile ファイル選択ダイアログを開く
CheckBox chkDocument ブック/シートモジュールの表示切替
CheckBox chkStdModule 標準モジュールの表示切替
CheckBox chkClassModule クラスモジュールの表示切替
CheckBox chkForm ユーザーフォームの表示切替
ListBox lstModules モジュール一覧を表示(MultiSelect プロパティを 1 - fmMultiSelectMulti に設定)
CommandButton btnExport 選択したモジュールのエクスポート処理を実行


フォームモジュールのVBA

ユーザーフォーム(frmModuleExporter)のコードウィンドウに記述する全コードです。

Option Explicit

Private Const CONFIG_SHEET_NAME As String = "Config"
Private targetWb As Workbook

' フォーム初期化時(チェック状態の復元のみ実行)
Private Sub UserForm_Initialize()
  With Me.lstModules
    .ColumnCount = 2
    .ColumnWidths = "200 pt;100 pt"
  End With
  
  ' 設定シートからチェックボックスの状態のみ読み込み
  Call LoadSettingsFromSheet
End Sub

' ファイル選択ボタン処理
Private Sub btnSelectFile_Click()
  Dim filePicker As FileDialog
  Dim lastPath As String
  Dim initialFolder As String
  
  Set filePicker = Application.FileDialog(msoFileDialogFilePicker)
  
  ' 設定シートから前回ファイルパスを取得
  lastPath = GetConfigValue("LastFilePath", "")
  
  With filePicker
    .Title = "Excelファイルを選択してください"
    .Filters.Clear
    .Filters.Add "Excel ファイル", "*.xlsm; *.xls; *.xlam; *.xlsb"
    .AllowMultiSelect = False
    
    ' 初期フォルダ/ファイルの判定
    If lastPath <> "" Then
      If Dir(lastPath) <> "" Then
        ' 前回ファイルが存在する場合はデフォルト指定
        .InitialFileName = lastPath
      Else
        ' 存在しない場合は親フォルダを指定
        initialFolder = GetParentFolderPath(lastPath)
        If initialFolder <> "" Then
          .InitialFileName = initialFolder & "\"
        End If
      End If
    End If
    
    If .Show = -1 Then
      Me.txtFilePath.Text = .SelectedItems(1)
      Call LoadWorkbook(.SelectedItems(1))
    End If
  End With
End Sub

' チェックボックス変更時(シート保存とリスト再描画)
Private Sub chkDocument_Click()
  Call SaveSettingsToSheet
  Call UpdateModuleList
End Sub

Private Sub chkStdModule_Click()
  Call SaveSettingsToSheet
  Call UpdateModuleList
End Sub

Private Sub chkClassModule_Click()
  Call SaveSettingsToSheet
  Call UpdateModuleList
End Sub

Private Sub chkForm_Click()
  Call SaveSettingsToSheet
  Call UpdateModuleList
End Sub

' 対象ファイルを開く処理
Private Sub LoadWorkbook(ByVal filePath As String)
  If filePath = "" Then Exit Sub
  
  Application.ScreenUpdating = False
  
  ' 既に開いている対象ブックがあれば閉じる
  If Not targetWb Is Nothing Then
    On Error Resume Next
    targetWb.Close SaveChanges:=False
    On Error GoTo 0
  End If
  
  ' ファイルを読み取り専用で開く
  On Error Resume Next
  Set targetWb = Workbooks.Open(Filename:=filePath, ReadOnly:=True)
  If Err.Number <> 0 Then
    Application.ScreenUpdating = True
    MsgBox "ファイルを開けませんでした。" & vbCrLf & Err.Description, vbCritical
    Exit Sub
  End If
  On Error GoTo 0
  
  ' 対象ブックを最小化し、自ブック(ThisWorkbook)をアクティブにする
  On Error Resume Next
  If targetWb.Windows.Count > 0 Then
    targetWb.Windows(1).WindowState = xlMinimized
  End If
  ThisWorkbook.Activate
  On Error GoTo 0
  
  Application.ScreenUpdating = True
  
  Call UpdateModuleList
End Sub

' リストボックスの表示更新処理
Private Sub UpdateModuleList()
  Dim vbComp As Object
  Dim showFlag As Boolean
  Dim typeNameStr As String
  
  Me.lstModules.Clear
  
  If targetWb Is Nothing Then Exit Sub
  
  On Error Resume Next
  For Each vbComp In targetWb.VBProject.VBComponents
    showFlag = False
    typeNameStr = ""
    
    Select Case vbComp.Type
      Case 1 ' vbext_ct_StdModule
        If Me.chkStdModule.Value Then
          showFlag = True
          typeNameStr = "標準モジュール"
        End If
      Case 2 ' vbext_ct_ClassModule
        If Me.chkClassModule.Value Then
          showFlag = True
          typeNameStr = "クラスモジュール"
        End If
      Case 3 ' vbext_ct_MSForm
        If Me.chkForm.Value Then
          showFlag = True
          typeNameStr = "ユーザーフォーム"
        End If
      Case 100 ' vbext_ct_Document
        If Me.chkDocument.Value Then
          showFlag = True
          typeNameStr = "ブック/シート"
        End If
    End Select
    
    If showFlag Then
      With Me.lstModules
        .AddItem vbComp.Name
        .List(.ListCount - 1, 1) = typeNameStr
      End With
    End If
  Next vbComp
  
  If Err.Number <> 0 Then
    MsgBox "VBAプロジェクトへのアクセスが拒否されました。" & vbCrLf & _
        "マクロのセキュリティで『VBA プロジェクト オブジェクト モデルへのアクセスを信頼する』を有効にしてください。", vbExclamation
  End If
  On Error GoTo 0
End Sub

' エクスポート実行処理
Private Sub btnExport_Click()
  Dim folderPicker As FileDialog
  Dim exportPath As String
  Dim lastFolder As String
  Dim i As Long
  Dim compName As String
  Dim vbComp As Object
  Dim ext As String
  Dim exportedCount As Long
  
  If Me.lstModules.ListCount = 0 Then
    MsgBox "対象となるモジュールがリストにありません。", vbExclamation
    Exit Sub
  End If
  
  Set folderPicker = Application.FileDialog(msoFileDialogFolderPicker)
  
  ' 前回出力したフォルダを取得して初期指定
  lastFolder = GetConfigValue("LastExportFolder", "")
  If lastFolder <> "" Then
    If Dir(lastFolder, vbDirectory) <> "" Then
      folderPicker.InitialFileName = lastFolder & "\"
    End If
  End If
  
  With folderPicker
    .Title = "エクスポート先のフォルダを選択してください"
    If .Show = -1 Then
      exportPath = .SelectedItems(1)
    Else
      Exit Sub
    End If
  End With
  
  exportedCount = 0
  
  For i = 0 To Me.lstModules.ListCount - 1
    If Me.lstModules.Selected(i) Then
      compName = Me.lstModules.List(i, 0)
      Set vbComp = targetWb.VBProject.VBComponents(compName)
      
      Select Case vbComp.Type
        Case 1:  ext = ".bas"
        Case 2:  ext = ".cls"
        Case 3:  ext = ".frm"
        Case 100: ext = ".cls"
        Case Else: ext = ".txt"
      End Select
      
      vbComp.Export exportPath & "\" & compName & ext
      exportedCount = exportedCount + 1
    End If
  Next i
  
  If exportedCount > 0 Then
    ' エクスポート成功時に最新設定を保存
    Call SaveConfigValue("LastFilePath", Me.txtFilePath.Text)
    Call SaveConfigValue("LastExportFolder", exportPath)
    Call SaveSettingsToSheet
    
    MsgBox exportedCount & " 件のモジュールを出力しました。", vbInformation
  Else
    MsgBox "リストボックスでエクスポート対象が選択されていません。", vbExclamation
  End If
End Sub

' フォームクローズ処理
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If Not targetWb Is Nothing Then
    On Error Resume Next
    targetWb.Close SaveChanges:=False
    On Error GoTo 0
  End If
End Sub

' --- 設定シート関連処理 ---

' 設定シートからチェックボックスの状態のみ読み込む
Private Sub LoadSettingsFromSheet()
  Me.chkDocument.Value = CBool(GetConfigValue("chkDocument", "True"))
  Me.chkStdModule.Value = CBool(GetConfigValue("chkStdModule", "True"))
  Me.chkClassModule.Value = CBool(GetConfigValue("chkClassModule", "True"))
  Me.chkForm.Value = CBool(GetConfigValue("chkForm", "True"))
End Sub

' フォームの選択状態を設定シートに保存する
Private Sub SaveSettingsToSheet()
  Call SaveConfigValue("chkDocument", CStr(Me.chkDocument.Value))
  Call SaveConfigValue("chkStdModule", CStr(Me.chkStdModule.Value))
  Call SaveConfigValue("chkClassModule", CStr(Me.chkClassModule.Value))
  Call SaveConfigValue("chkForm", CStr(Me.chkForm.Value))
End Sub

' 設定値を取得(A列キー名、B列値)
Private Function GetConfigValue(ByVal keyName As String, Optional ByVal defaultValue As String = "") As String
  Dim ws As Worksheet
  Dim foundCell As Range
  
  Set ws = GetOrCreateConfigSheet
  Set foundCell = ws.Columns("A").Find(What:=keyName, LookIn:=xlValues, LookAt:=xlWhole)
  
  If Not foundCell Is Nothing Then
    GetConfigValue = CStr(foundCell.Offset(0, 1).Value)
  Else
    GetConfigValue = defaultValue
  End If
End Function

' 設定値を保存(A列キー名、B列値)
Private Sub SaveConfigValue(ByVal keyName As String, ByVal val As String)
  Dim ws As Worksheet
  Dim foundCell As Range
  Dim lastRow As Long
  
  Set ws = GetOrCreateConfigSheet
  Set foundCell = ws.Columns("A").Find(What:=keyName, LookIn:=xlValues, LookAt:=xlWhole)
  
  If Not foundCell Is Nothing Then
    foundCell.Offset(0, 1).Value = val
  Else
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If ws.Cells(1, "A").Value = "" And lastRow = 1 Then
      ws.Cells(1, "A").Value = keyName
      ws.Cells(1, "B").Value = val
    Else
      ws.Cells(lastRow + 1, "A").Value = keyName
      ws.Cells(lastRow + 1, "B").Value = val
    End If
  End If
End Sub

' Configシートを取得(存在しなければ自動生成)
Private Function GetOrCreateConfigSheet() As Worksheet
  Dim ws As Worksheet
  
  On Error Resume Next
  Set ws = ThisWorkbook.Worksheets(CONFIG_SHEET_NAME)
  On Error GoTo 0
  
  If ws Is Nothing Then
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = CONFIG_SHEET_NAME
  End If
  
  Set GetOrCreateConfigSheet = ws
End Function

' パス文字列から親フォルダパスを取得するヘルパー関数
Private Function GetParentFolderPath(ByVal filePath As String) As String
  Dim lastSlashPos As Long
  lastSlashPos = InStrRev(filePath, "\")
  
  If lastSlashPos > 0 Then
    GetParentFolderPath = Left(filePath, lastSlashPos - 1)
  Else
    GetParentFolderPath = ""
  End If
End Function


フォームモジュールコードのポイント解説

画面ちらつきと前面保持の制御(LoadWorkbook)
対象ブックを開く際、ReadOnly:=True で安全に開いた後、対象ブックのウィンドウを最小化(xlMinimized)し、ツール側のブック(ThisWorkbook)をアクティブにすることで、操作画面が隠れない工夫を行っています。

メモリ上での高速フィルター描画(UpdateModuleList)
チェックボックスのON/OFF時にはファイルを再読込せず、すでにメモリ上に保持している targetWb.VBProject.VBComponents から該当するタイプのモジュールを瞬時に抽出し、リストボックス(2列表示)を再作成します。

拡張子の自動判定エクスポート(btnExport_Click)
VBComponent.Type の値(1: 標準モジュール、2: クラス、3: フォーム、100: Document)を判断し、対応する拡張子(.bas / .cls / .frm)を付与して Export メソッドを実行します。

設定シート(Config)によるデータ非破壊管理
レジストリを使用せず、ブック内の Config シートにKeyValue形式(A列:キー、B列:値)で前回のファイルパスや選択状態を保存します。
シートが存在しない場合は自動生成されるため、導入時の手作業を低減しています。


VBA Extensibility ライブラリの参照設定
VBAで vbext_ct_StdModule や vbext_ct_Document などの定数(Enum名)をそのままコード上で使うには、VBA Extensibility ライブラリの参照設定を追加します。
VBE(Visual Basic Editor)にライブラリを追加することで、定数名がそのまま利用可能になり、IntelliSense(自動補完)も効くようになります。

VBEのメニューバーから [ツール] > [参照設定] を選択します。
一覧から Microsoft Visual Basic for Applications Extensibility 5.3 を探してチェックを入れます。
[OK] をクリックします。
これで、数値ではなく定数名でコードを記述できるようになります。


標準モジュールのVBA

フォームを呼び出すための記述を標準モジュールへ配置します。

Option Explicit

Public Sub ShowModuleExporter()
  frmModuleExporter.Show vbModeless
End Sub

標準モジュールコードのポイント解説

モードレス表示 (vbModeless)
フォームを vbModeless で開くことにより、フォームを表示したままでもExcelシート側の操作や他の作業を行えるようにしています。


ThisWorkbookのVBA

本ツール(Excelブック)を開いた際、手動でマクロを実行する手間を省き、すぐにユーザーフォームが起動するよう ThisWorkbook モジュールへ自動起動処理を記述します。

Option Explicit

Private Sub Workbook_Open()
  Call ShowModuleExporter
End Sub


サンプル ダウンロード



同じテーマ「マクロVBAサンプル集」の記事

条件付き書式で変更された書式を取得する
セル結合/解除でセル値を退避/回復
セル結合なんて絶対に許さないんだからね
セルの数式をネスト色分けしてコメント表示
セル結合して表を見やすくする(非推奨)
シートを削除:不定数のシート名に対応
セル番地でバラバラに指定されたセルの削除
シート内に散在する複数表の縦結合
スピル範囲の自動色付け(強調表示)
ヘッダーに合わせて列をソートして値貼り付けするスマートな方法
VBA モジュールエクスポートツール|モジュールを選別して一括出力


新着記事NEW ・・・新着記事一覧を見る

ListBox・ComboBoxをマウスホイール対応させる|ユーザーフォーム入門(2026-08-09)
VBA モジュールエクスポートツール|モジュールを選別して一括出力|VBAサンプル集(2026-08-06)
「SUMIFSで動くのにXLOOKUPでエラー?」型不一致の関数別挙動|エクセル関数応用(2026-08-03)
生成AIが暴いた「VBAオワコン説」の盲点|問われるのは言語ではなく評価軸|エクセル雑感(2026-07-04)
【ITとは何か】Excel・VBAを学ぶ前に知っておきたい「4つの本質」|エクセル雑感(2026-06-24)
2つのシート名を交換するVBAをGeminiに作らせてみた。|VBA技術解説(2026-05-22)
ヘッダーに合わせて列をソートして値貼り付けするスマートな方法|VBAサンプル集(2026-05-20)
4大分岐関数の使い分け(IF/IFS/SWITCH/CHOOSE)|エクセル入門(2026-05-19)
Excel主要関数 習得難易度 10段階(文字列・日付除く)|エクセル雑感(2026-04-27)
Excelのシート5分類|エクセル雑感(2026-03-27)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロとは?VBAとは?VBAでできること|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.メッセージボックス(MsgBox関数)|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ