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のワークブックをソースコード管理システムで管理しやすくする

私はExcelVBAで作ったアプリケーションをソースコード管理システムに格納して管理することがあります。Excelのワークブックはバイナリ・ファイルなのでバージョン間の差分を見るのが難しく、どのようにすればうまく管理できるのか悩んでいました。

Subversionで管理するなら、Excelのワークシートの差分はTortoiseSVNで表示することができます。VBAのコードの差分は次のようにすれば管理できることに気がつきました。

  1. VBAのコードをテキストファイルに出力する。
  2. Excelのワークブックと一緒にテキストファイルもリポジトリに入れる。

コードの入ったテキストファイルを調べることで、コードにいつどのような変更をしたのかがわかるようになります。そこで、コミットの直前に毎回モジュールをテキストファイルにエクスポートすることにしました。次の手順でエクスポートできます。

  1. ExcelVisual Basic Editor(VBE)を表示する。
  2. プロジェクトエクスプローラーでモジュール名を右クリックし、[ファイルのエクスポート]をクリックする。
  3. 「ファイルのエクスポート」ダイアログが表示されるので、ファイル名を入力し、[保存]をクリックする。

これを毎回手作業でやっていたのですが、面倒になったので、モジュールをファイルにエクスポートするコードを作りました。参考までに日記に記載します。

モジュールをエクスポートするコード

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>

もしマクロが実行できないときは、次のようにしてください(コメントで教えていただきました。ありがとうございました)

  1. [ツール]-[マクロ]-[セキュリティ]をクリック
  2. [信頼のおける発行元]タブの[Visual Basicプロジェクトへのアクセスを信頼する]チェックボックスをオンにする

<追記 2010/02/23>

Office2007で「実行時エラー 1004 プログラミングによる Visual Basic プロジェクトへのアクセスは信頼性に欠けます」と出て止まってしまう場合には、次のようにしてください(コメントで教えていただきました。ありがとうございました)

  1. Office 2007 を起動して [Office ボタン] をクリック
  2. [Excelのオプション] をクリック
  3. [セキュリティ センター] をクリック
  4. [セキュリティ センターの設定] をクリック
  5. [マクロの設定] をクリック
  6. [VBA プロジェクト オブジェクト モデルへのアクセスを信頼する] チェック ボックスをオンにする