VBA モジュールエクスポートツール|モジュールを選別して一括出力
VBA開発や保守運用を行っていると、既存のブックから特定種類のモジュール(標準モジュールやクラス、フォームなど)のみを選別して一括エクスポートしたい場面が多々あります。
全てのモジュールを一括でエクスポートするだけなら短いコードで済みますが、必要なモジュールだけを選別してエクスポートするとなると、VBE(Visual
Basic Editor)の標準機能では1つずつ手動で行う必要があり、作業が非常に煩雑です。
機能概要
事前設定
[ファイル] > [オプション] > [トラスト センター](セキュリティ センター)
を開きます。


設定保存用シート(Configシート)
アドイン化やブックの移動・配布が容易になり、環境が変わっても同一の設定環境を保持できます。

データ構造
| A列(キー名) | B列(設定値の例) | 説明 |
| chkDocument | True / False | 「ブック/シート」チェックボックスの状態 |
| chkStdModule | True / False | 「標準モジュール」チェックボックスの状態 |
| chkClassModule | True / False | 「クラスモジュール」チェックボックスの状態 |
| chkForm | True / False | 「ユーザーフォーム」チェックボックスの状態 |
| LastFilePath | C:\Users\...\Target.xlsm | 前回選択した対象ファイルのフルパス |
| LastExportFolder | C:\Users\...\Export | 前回エクスポート先に指定したフォルダパス |
フォームの概要
フォーム上に配置するコントロールの一覧は以下の通りです。
| コントロール種別 | オブジェクト名 (Name) | 役割 / 設定内容 |
| TextBox | txtFilePath | 選択した対象Excelファイルのパスを表示 |
| CommandButton | btnSelectFile | ファイル選択ダイアログを開く |
| CheckBox | chkDocument | ブック/シートモジュールの表示切替 |
| CheckBox | chkStdModule | 標準モジュールの表示切替 |
| CheckBox | chkClassModule | クラスモジュールの表示切替 |
| CheckBox | chkForm | ユーザーフォームの表示切替 |
| ListBox | lstModules | モジュール一覧を表示(MultiSelect プロパティを 1 - fmMultiSelectMulti に設定) |
| CommandButton | btnExport | 選択したモジュールのエクスポート処理を実行 |
フォームモジュールのVBA
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
フォームモジュールコードのポイント解説
シートが存在しない場合は自動生成されるため、導入時の手作業を低減しています。
VBE(Visual Basic Editor)にライブラリを追加することで、定数名がそのまま利用可能になり、IntelliSense(自動補完)も効くようになります。
一覧から Microsoft Visual Basic for Applications Extensibility 5.3 を探してチェックを入れます。
[OK] をクリックします。
これで、数値ではなく定数名でコードを記述できるようになります。
標準モジュールのVBA
Option Explicit
Public Sub ShowModuleExporter()
frmModuleExporter.Show vbModeless
End Sub
標準モジュールコードのポイント解説
ThisWorkbookのVBA
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入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- 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.
