MSOffice2007でマクロを一括エクスポートするアドインを作成&リボンのカスタマイズ

マクロを一括エクスポートするマクロ

2007になってもマクロの一括エクスポート機能が搭載された気配はない。
割とニーズのある機能だと思うので、誰かが作ってるはず。
ってことで検索……
一番目にここがヒット。
ブック内のVBAプロジェクトに各モジュールのコレクションが保持されていて、
それぞれのモジュールオブジェクトのExportメソッドを呼んでやればいいらしい。


コードはこんな感じ。仕様は適当。

Sub ModuleExport()
    ' VBA モジュールの書き出し
    ' 指定フォルダ以下にブック名と同名のフォルダを作成してその中にエクスポート
    
    Dim Project, objxl As Object
    Dim DirName As String
    Dim Path As String
    
    ' ダイアログで保存フォルダを選択
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "VBAモジュールを書き出すフォルダを選択して下さい"
        If .Show = True Then
            Path = .SelectedItems(1) & "\"
        Else
            Exit Sub
        End If
    End With

    DirName = Path & Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) & "\"

    ' アクティブブックの全モジュールをエクスポート
    For Each Project In ActiveWorkbook.VBProject.VBComponents
        If (Project.CodeModule.CountOfLines > 0) Then
            If (Dir(DirName, vbDirectory) = "") Then MkDir DirName
            Project.Export DirName & Project.Name & ".bas"
        End If
    Next

End Sub

アドイン化してリボンを作成

このままでは使いづらいのでアドイン化&リボンを作成する。
Excel 2007 アドインでリボンメニューを作成する方法: ある SE のつぶやき
[Office]リボンのカスタマイズ・好きな場所にカスタムタブを挿入する ( ソフトウェア ) - 初心者備忘録 - Yahoo!ブログ
上記のサイトを参考に。
まずはhttp://openxmldeveloper.org/articles/CustomUIeditor.aspxからCustom UI Editorをダウンロード。
さっきのコードを適当に.xlam形式で保存してCustom UI Editorで開く。
最初の画面は真っ白。[Sample]-[Custom Tab]を選択するとテンプレートが挿入される。

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="false">
    <tabs>
      <tab id="customTab" label="Custom Tab">
        <group id="customGroup" label="Custom Group">
          <button id="customButton" label="Custom Button" imageMso="HappyFace" size="large" onAction="Callback" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

tab、group id、buttonの各タグにあるlabelプロパティが表示される文字列になる。
また、onActionプロパティには、ボタン押下時に呼ばれるサブルーチン名を設定する。
さきほどのサブルーチンを呼び出すように変更すると、以下のようになる

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="false">
    <tabs>
      <tab id="customTab" label="Module Export">
        <group id="customGroup" label="Module Export">
          <button id="customButton" label="Module Export" imageMso="HappyFace" size="large" onAction="ModuleExport" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

Custom UI Editorの出番はここまで。保存して終了する。

onActionに指定したサブルーチンはIRibbonControlを引数として取る必要があるらしいので、
さっき作成したサブルーチンを

Sub ModuleExport(control As IRibbonControl)

と変更してやる。
アドインを読み込むように設定すると、一番右に作成したリボンが追加される。