【ExcelVBA・マクロ】Excelリボンをカスタマイズする方法|CustomUI XMLとVBAコールバックで独自タブ・ボタンを追加する【エクセル効率化】

ExcelVBA

はじめに

「よく使うマクロをボタン一つで実行したい」「毎回開発タブから探すのが面倒」と感じたことはありませんか。

Excelには、リボンに独自のタブやボタンを追加できるCustomUI XMLという仕組みがあります。この記事では、CustomUI XMLとVBAのコールバック関数を使って、Excelのリボンに独自タブとボタンを追加し、ワンクリックでマクロを実行できるようにする方法を解説します。ExcelアドインやVBAを日常的に使う方はぜひ試してみてください。

スポンサーリンク
スポンサーリンク

リボンカスタマイズの仕組み(CustomUI XMLとは)

Excelファイル(.xlsmや.xlam)は、実体はZIP形式のフォルダ構造になっています。この中にcustomUI14.xmlという設定ファイルを追加すると、Excel起動時にそのXMLが読み込まれ、指定したタブ・グループ・ボタンがリボンに表示されます。

ボタンがクリックされたときに実行されるVBAプロシージャ(コールバック)をXML側で指定しておくことで、リボンのボタンとマクロを紐付けることができます。VBAのコードだけでは完結せず、XML編集用のツールが必要になる点が特徴です。

事前準備:Custom UI Editorのインストール

customUI14.xmlは手動でZIPを編集しても作成できますが、専用ツールのCustom UI Editor for Microsoft Office(無料)を使うと簡単です。検索エンジンで「Custom UI Editor for Office」と調べてダウンロード・インストールしてください。

使い方の流れは以下の通りです。

  1. Custom UI Editorで対象の.xlsmファイルを開く
  2. メニューから「Insert」→「Office 2010 Custom UI Part」を選択
  3. 右側のエディタ画面にXMLを記述する
  4. 保存してExcelファイルを開き直す

customUI14.xmlを作成する

以下は、「マクロ実行」という独自タブに、ボタンを1つ配置するサンプルです。

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="RibbonOnLoad">
  <ribbon>
    <tabs>
      <tab id="tabMyMacro" label="マクロ実行">
        <group id="grpMain" label="よく使う処理">
          <button id="btnRunReport"
                  label="集計マクロ実行"
                  size="large"
                  imageMso="ReviewAcceptChange"
                  onAction="OnClickRunReport" />
          <button id="btnClearData"
                  label="データクリア"
                  size="large"
                  imageMso="Delete"
                  onAction="OnClickClearData" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
  • imageMsoにはOffice標準アイコンの名前を指定します(アイコン名はCustom UI Editor上でプレビューしながら選べます)
  • onActionに指定した名前が、VBA側で用意するコールバックプロシージャ名になります
  • onLoadはリボン読み込み時に呼ばれるプロシージャで、後述のRibbon UIオブジェクトの取得に使います

VBA側でコールバックプロシージャを書く

標準モジュールに、XMLで指定した名前と一致するプロシージャを用意します。引数controlは省略できないので必ず記述してください。

Option Explicit

' リボンのUIオブジェクトを保持しておく変数
Public g_Ribbon As IRibbonUI

' onLoadで指定したコールバック(Ribbon UIの参照を取得する)
Sub RibbonOnLoad(ribbon As IRibbonUI)
    Set g_Ribbon = ribbon
End Sub

' 「集計マクロ実行」ボタンが押されたときの処理
Sub OnClickRunReport(control As IRibbonControl)
    Call CreateSalesReport
    MsgBox "集計が完了しました。", vbInformation
End Sub

' 「データクリア」ボタンが押されたときの処理
Sub OnClickClearData(control As IRibbonControl)
    Dim ans As VbMsgBoxResult
    ans = MsgBox("入力データをクリアします。よろしいですか?", vbYesNo + vbQuestion)
    If ans = vbYes Then
        Call ClearInputRange
    End If
End Sub

' 実際の集計処理(例)
Private Sub CreateSalesReport()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("集計")
    ws.Range("B2").Value = Application.WorksheetFunction.Sum(ThisWorkbook.Worksheets("入力").Range("B:B"))
End Sub

' データクリア処理(例)
Private Sub ClearInputRange()
    ThisWorkbook.Worksheets("入力").Range("A2:C1000").ClearContents
End Sub

IRibbonUI型を使う場合、参照設定は不要です。control As IRibbonControlもExcelが標準で認識する組み込み型なので、そのまま使えます。

ボタンの表示状態(有効/無効、ラベルの切り替えなど)を動的に変えたい場合は、g_Ribbon.InvalidateControl "btnRunReport"を呼び出したうえで、XML側にgetEnabledコールバックを追加します。

<button id="btnRunReport" label="集計マクロ実行" size="large"
        imageMso="ReviewAcceptChange"
        onAction="OnClickRunReport"
        getEnabled="GetEnabledRunReport" />
Sub GetEnabledRunReport(control As IRibbonControl, ByRef returnedVal)
    ' 「入力」シートにデータがあるときだけボタンを有効にする例
    returnedVal = (ThisWorkbook.Worksheets("入力").Range("A2").Value <> "")
End Sub

動作確認とよくあるエラー

ファイルを保存して開き直すと、リボンに新しいタブが表示されます。表示されない、あるいはボタンを押してもエラーになる場合は、以下を確認してください。

  • XMLの構文エラー:タグの閉じ忘れやスペルミスがあると、Excel起動時に警告が出てリボンが読み込まれません。Custom UI Editorの「Validate」機能でチェックできます
  • コールバック名の不一致onActionに書いた名前とVBAのプロシージャ名(大文字小文字を含む)が一致しているか確認します
  • 保存形式:マクロを保持するため、必ず.xlsmまたは.xlam形式で保存します
  • セキュリティ設定:マクロが無効化されているとコールバックが動作しません。信頼できる発行元として登録するか、マクロを有効にして開きます

なお、この方法はマクロ有効ブック単位でリボンを追加するものです。全ブック共通でボタンを使いたい場合は、アドイン(.xlam)にCustomUI14.xmlを組み込むと便利です。

まとめ

CustomUI XMLとVBAコールバックを組み合わせることで、Excelのリボンに独自タブ・ボタンを追加し、よく使うマクロをワンクリックで実行できるようになります。Custom UI Editorを使えばXML編集も難しくありません。日常的に使うマクロがあれば、ぜひリボンボタン化して作業効率を上げてみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました