はじめに
「よく使うマクロをボタン一つで実行したい」「毎回開発タブから探すのが面倒」と感じたことはありませんか。
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」と調べてダウンロード・インストールしてください。
使い方の流れは以下の通りです。
- Custom UI Editorで対象の
.xlsmファイルを開く - メニューから「Insert」→「Office 2010 Custom UI Part」を選択
- 右側のエディタ画面にXMLを記述する
- 保存して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編集も難しくありません。日常的に使うマクロがあれば、ぜひリボンボタン化して作業効率を上げてみてください。


コメント