Excel VBAでモジュールをエクスポートするコード
このページのコードの、より使いやすいバージョンがMoonDoldoさんのサイトの http://gyahahaha.s51.coreserver.jp/DoldoWorkz/?Excel%E3%83%9E%E3%82%AF%E3%83%AD/VBA%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88 にあります。
Excelのワークブックをソースコード管理システムで管理しやすくする
私はExcel+VBAで作ったアプリケーションをソースコード管理システムに格納して管理することがあります。Excelのワークブックはバイナリ・ファイルなのでバージョン間の差分を見るのが難しく、どのようにすればうまく管理できるのか悩んでいました。
Subversionで管理するなら、Excelのワークシートの差分はTortoiseSVNで表示することができます。VBAのコードの差分は次のようにすれば管理できることに気がつきました。
コードの入ったテキストファイルを調べることで、コードにいつどのような変更をしたのかがわかるようになります。そこで、コミットの直前に毎回モジュールをテキストファイルにエクスポートすることにしました。次の手順でエクスポートできます。
- ExcelのVisual Basic Editor(VBE)を表示する。
- プロジェクトエクスプローラーでモジュール名を右クリックし、[ファイルのエクスポート]をクリックする。
- 「ファイルのエクスポート」ダイアログが表示されるので、ファイル名を入力し、[保存]をクリックする。
これを毎回手作業でやっていたのですが、面倒になったので、モジュールをファイルにエクスポートするコードを作りました。参考までに日記に記載します。
モジュールをエクスポートするコード
Option Explicit Public Sub ExportModules() '現在のワークブックのモジュールをエクスポートする Dim targetModule As VBComponent Dim outputPath As String Dim fileExt As String outputPath = ActiveWorkbook.Path For Each targetModule In ActiveWorkbook.VBProject.VBComponents fileExt = GetExtFromModuleType(targetModule.Type) If fileExt <> "" Then ExportModuleWithExt targetModule, outputPath, fileExt Debug.Print "Save " & targetModule.Name End If Next End Sub Private Function GetExtFromModuleType(aType As Integer) As String '指定されたモジュール・タイプに対応する拡張子を返す Select Case aType Case vbext_ct_StdModule GetExtFromModuleType = "bas" Case vbext_ct_ClassModule, vbext_ct_Document GetExtFromModuleType = "cls" Case vbext_ct_MSForm GetExtFromModuleType = "frm" End Select End Function Private Sub ExportModuleWithExt(aModule As VBComponent, Path As String, Ext As String) '指定されたモジュールをエクスポートする Dim filePath As String filePath = Path & "\" & aModule.Name & "." & Ext aModule.Export filePath End Sub
ExportModulesプロシージャを実行すると、モジュールを格納したファイルを、現在のワークブックと同じ場所に出力します。出力するモジュールは以下の種類のものです。
- 標準モジュール
- クラスモジュール
- ワークシートのクラスモジュール
出力されるファイルの名前は、オブジェクト名+拡張子になります。拡張子は標準モジュールの場合は“bas”、クラスモジュールの場合は“cls”になります。
出力時には、出力したオブジェクトの名前を「Save オブジェクト名」の形でイミディエイト・ウィンドウに表示します。
コード中で使っている以下の名前は「Microsoft Visual Basic for Application Extensibility 5.3」で宣言されています。
- VBComponent
- vbext_ct_StdModule
- vbext_ct_ClassModule
- vbext_ct_Document
モジュールをエクスポートするコードをExcelに組み込む
次の手順でExcelに組み込んで使います。
1. Excel VBEの[ツール]-[参照設定]で「Microsoft Visual Basic for Application Extensibility 5.3」にチェックを入れます。
2. [挿入]-[標準モジュール]で新しい標準モジュールを作成し、上記のコードをコピー&ペーストで記入します。
3. モジュールを適当な名前(自分の場合はModuleExporter)で保存します。
4. 以下のどれかの方法でExportModulesプロシージャを実行します。
4-1 イミディエイトウィンドウで“ExportModules”と入力し、Enterキーを入力します。
4-2 “Public Sub ExportModules()”と書かれている行にカーソルを合わせ、F5キーを押します。または、F5キーの代わりに[実行]-[Sub/ユーザーフォームの実行]をクリックするか、「Sub/ユーザーフォームの実行]ボタンをクリックします。
これで何度でも手軽にモジュールをエクスポートできるようになりました。
<追記 2010/02/18>
もしマクロが実行できないときは、次のようにしてください(コメントで教えていただきました。ありがとうございました)
- [ツール]-[マクロ]-[セキュリティ]をクリック
- [信頼のおける発行元]タブの[Visual Basicプロジェクトへのアクセスを信頼する]チェックボックスをオンにする
<追記 2010/02/23>
Office2007で「実行時エラー 1004 プログラミングによる Visual Basic プロジェクトへのアクセスは信頼性に欠けます」と出て止まってしまう場合には、次のようにしてください(コメントで教えていただきました。ありがとうございました)