標準モジュールなどの一括エクスポート方法
このページでは標準モジュールの一括エクスポートについて紹介しています。
インポートについては「標準モジュール等の一括インポート」をご参照ください。
作成したマクロを他のブックでも使う方法
VBAを利用していると標準モジュールやフォームやクラスを作成していくことになりますが、作成したマクロを他のブックでも使いたいことがあります。汎用的に使うのであれば個人用マクロブック(personal.xlsb)に書くことも一つの方法ですが、そこまでではない、という場合もあります。
そういう場合はVBA画面を開き、コピー元のブックから標準モジュール等をエクスポートして、利用するブックでインポートすることでマクロの転用が可能です。
手作業ではエクスポートは1度に1ファイルしか出来ない
VBAのコードを書いた標準モジュールなどの他のブックに転用する際にエクスポートやインポートを行いますが、その作業で面倒なことがあります。
それはエクスポートとインポートがそれぞれ1ファイルずつしか行えないことです。
コピー元のブックが持つマクロが標準モジュール1ファイルだけ、などであればいいのですが、その他にも別の標準モジュールやフォームやクラスなどが複数あった場合は全てをエクスポートやインポートするのはかなり面倒です。
ここがVBAがプログラミング言語として弱い部分の1つです。一般的なプログラミング言語であればソースコードはテキストファイルとして扱うことが出来るため他のプログラムへの転用はファイルをコピーするだけで行えます。ところがVBAのソースコードはブックに紐づいているためテキストファイルをコピーするようには他のブックへ転用できません。
また、VBAはソースコードを独立して扱うことが出来ないためバージョン管理を行う場合にはいちいちエクスポートを1ファイルずつ行うという手間がかかります。これが本当に手間です。
その問題を解消するために、VBAの標準モジュールやクラスやフォームを一括してエクスポートするマクロで対応します。以下のマクロは個人用マクロブックpersonal.xlsbと通常のブックのどちらにも対応しています。
事前設定
VBAで一括エクスポートを行う前に、事前にExcelの設定を変更する必要があります。
エクスポートとインポートを可能にする
開発タブ→コード→マクロのセキュリティを開きます。
または、ファイルタブ→オプション→セキュリティセンター→セキュリティセンターの設定ボタン→マクロの設定、でもいいです。そこで「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する(V)」にチェックを付けます。このチェックを付けることで、VBAでの標準モジュールなどのエクスポートやインポートが可能になります。
あとは各ダイアログのOKボタンを押していきます。
これでエクスポートとインポートが可能になります。
VBComponentの参照設定
VBA画面のツールメニュー→参照設定で、「Microsoft Visual Basic for Application Extensibilly 5.3」にチェックをつけてOKを押します。
これによりVBComponentクラスとVBComponentsクラスの利用が可能になります。
VBComponentクラスはVBAProjectの標準モジュールやフォームやクラスの各ファイルの操作を行うことができるクラスです。
VBComponentsコレクションクラスは、そのブックに含まれる標準モジュールやフォームやクラスの全ファイルの管理を行うクラスです。
一括エクスポートのソースコード
以下のマクロは、対象ブックに含まれる標準モジュールなどを全てエクスポートするマクロです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
Sub ExportAll() Dim module As VBComponent '// モジュール Dim moduleList As VBComponents '// VBAプロジェクトの全モジュール Dim extension '// モジュールの拡張子 Dim sPath '// 処理対象ブックのパス Dim sFilePath '// エクスポートファイルパス Dim TargetBook '// 処理対象ブックオブジェクト '// ブックが開かれていない場合は個人用マクロブック(personal.xlsb)を対象とする If (Workbooks.Count = 1) Then Set TargetBook = ThisWorkbook '// ブックが開かれている場合は表示しているブックを対象とする Else Set TargetBook = ActiveWorkbook End If sPath = TargetBook.Path '// 処理対象ブックのモジュール一覧を取得 Set moduleList = TargetBook.VBProject.VBComponents '// VBAプロジェクトに含まれる全てのモジュールをループ For Each module In moduleList '// クラス If (module.Type = vbext_ct_ClassModule) Then extension = "cls" '// フォーム ElseIf (module.Type = vbext_ct_MSForm) Then '// .frxも一緒にエクスポートされる extension = "frm" '// 標準モジュール ElseIf (module.Type = vbext_ct_StdModule) Then extension = "bas" '// その他 Else '// エクスポート対象外のため次ループへ GoTo CONTINUE End If '// エクスポート実施 sFilePath = sPath & "\" & module.Name & "." & extension Call module.Export(sFilePath) '// 出力先確認用ログ出力 Debug.Print sFilePath CONTINUE: Next End Sub |
ソースコードの説明
ブックが開いていない場合はpersonal.xlsbをエクスポートする
このソースコードでは一つ特殊仕様を入れています。10行目から15行目がその部分です。
10行目と11行目では、ブックが1つも開いていない場合はアクティブのブックは存在しないため、個人用マクロブック(personal.xlsb)を処理対象としています。それとは逆に、13行目と14行目では、ブックが開いている場合はアクティブブックを処理対象としています。
私自身は一般のブックよりもpersonal.xlsbをエクスポートする方が多いため、そのときはブックを全部閉じてこのマクロを実行しています。
なお、個人用マクロブックをエクスポートする場合には注意が必要です。後述しています。
拡張子はcls、frm+frx、basの3種類
エクスポート対象ファイルの拡張子はcls、frm+frx、basの3種類です。
フォームのfrmファイルをエクスポートすると、一緒にfrxファイルもエクスポートされます。
Excelブックもモジュールではありますが、ソースコードではないためエクスポート対象にはしていません。
37行目の部分です。
エクスポート先はブックと同じフォルダ
42行目でエクスポートを行います。
エクスポート先はブックと同じフォルダです。
ファイル名はVBAのままで拡張子にはクラス(cls)、フォーム(frm, frx)、標準モジュール(bas)を付与しています。
ファイルのタイムスタンプはエクスポート実施日時になります。
個人用マクロブック(personal.xlsb)エクスポート時の注意
個人用マクロブックをエクスポートすると、XLSTARTフォルダに標準モジュール等が出力されます。なお、XLSTARTフォルダは以下にあります。
C:\Users\ユーザー名\AppData\Roaming\Microsoft\Excel\XLSTART
それ自体は問題ないのですが、XLSTARTフォルダにあるファイルは、Excel起動時に全てExcelブック形式で開いてしまいます。
100個標準モジュールをエクスポートしていたらそれら全てが開かれます。
もしそれが面倒であれば個人用マクロブックのエクスポート後はXLSTARTフォルダから移動するか、9行目から17行目を以下のような感じに変更して個人用マクロブックの場合のエクスポート先を別のものにしておきましょう。
19行目のパス取得を個人用マクロブック用の12行目と、それ以外の16行目に分けています。
9 10 11 12 13 14 15 16 17 18 19 |
'// ブックが開かれていない場合は個人用マクロブック(personal.xlsb)を対象とする If (Workbooks.Count = 1) Then Set TargetBook = ThisWorkbook sPath = "C:\work" '// ブックが開かれている場合は表示しているブックを対象とする Else Set TargetBook = ActiveWorkbook sPath = TargetBook.Path End If '// sPath = TargetBook.Path |
自分用の新規ブックのテンプレート置き場として使う分にはXLSTARTフォルダはとても有効ですので、是非活用してください。