概要
Microsoft Officeの各ソフトにはリボンというツールバーがあります.これに自作のタブを追加したりマクロを登録したりするとき,個人であれば設定から1つずつ追加すればよいです.
しかし,常に表示される必要はない機能も多くあり「必要なときに1クリックでタブを追加してほしい」というときもあります.
この記事では「"アドイン名.xlam"を開いたときにリボンにタブを追加する方法」を説明します.
バージョン
動作確認した環境は以下の通りです.
- OS
- Windows 11 Home
- バージョン
23H2
- Excel
- Microsoft 365
- バージョン
2402 ビルド 16.0.17328.20124
(64 ビット)
初期設定手順
以下のような流れで行います.
- 事前準備(開発タブの表示)
- アドインファイル(アドイン名.xlam)を用意
- アドインを"開く"
- 内部ファイルを書き換え
- アドインを"閉じる"
- 起動テスト
事前準備(開発タブの表示)
すでに開発タブを表示している方は次へ進んでください.
これはExcelのオプションから「リボンのユーザー設定」にある「開発」にチェックを入れるだけでよいです.
アドインファイル(アドイン名.xlam)を用意
Excelのアドインファイルを用意しましょう.
新しく空白のブックを開きます.
既存のブックも使えますがシートが見えなくなります
新しくブックを作成する場合
VBE 起動
開発タブから「Visual Basic」をクリックしてVBEを開きます.
こんなのが出てくるはずです↓
もし左の「プロジェクト」や「プロパティ」などが見つからない場合は上のメニューの 「表示」>「プロジェクトエクスプローラー」 や 「表示」>「プロパティウィンドウ」 から表示させることが出来ます.
ThisWorkbookのIsAddinをTrueに変更
VBEを開いたら,「プロジェクト - VBEProject」から「ThisWorkbook」を見つけてクリック,プロパティを表示し,そこから「IsAddin」という設定を探して(はじめはFalseになっているはずなので)Trueに変更します(図では縦長にならないように横に並べています).
「VBAProject (Book 1)しか見えない」という場合は,アイコンの左にある ちっちゃいプラスマーク($+$)から下位のファイルを見ることが出来ます .
うまくいっていれば,IsAddinをTrueにすると後ろにあるExcelのシートが見えなくなります.
ブックをアドインとして保存
それができたらVBE側で「ファイル」>「????の上書き保存」で保存します.
新しくブックを作成した場合は保存場所がないのでこのタイミングで保存場所を確認させられます.好きな場所に好きな名前で保存してよいです.保存場所はあまり関係ありませんが クラウドへの保存はお勧めしません 1.
Excelの仕様上,ファイルの種類を変更すると保存先が
C:\Users\****\AppData\Roaming\Microsoft\AddIns
のような場所に移動してしまいます.
面倒ですが 好きな場所まで移動して保存するようにしましょう.
既存のブックで作業していた場合
ブックを開いた状態で,「名前を付けて保存」を選択し,ファイルの種類を「Excelアドイン (.xlam)」にして保存するだけでよいです.
1つ前のノートの通り,ファイルの種類を変えるとフォルダが移動するので注意してください.
ここまででうまくできているか確認
アドインファイルを用意出来たら動作確認のため,一度ブックを閉じ,再度開きます.
既に名前を付けて保存していても「変更内容を保存しますか?」と確認されることがありますが,気にせず(保存せず)閉じて問題ありません.
シートが表示されず,Excelのウィンドウが開いたらここまでは問題ありません.
ここからファイル自体を変更するのでいちどウィンドウは閉じておきましょう.
アドインを"開く"
ここからリボンの準備を行います.
ファイル名の変更
用意したアドインファイル(Book1.xlam とします)の拡張子を(警告は無視して)zipに変更します.
こんな感じ→
もし,拡張子が表示されていない場合にはエクスプローラーの「表示」>「ファイル名拡張子」などから拡張子を表示させてください.
ZIPファイルの展開
Book1.zipを適当な場所に展開(解凍)しておきましょう.
中身にはフォルダ3つとファイル1つが入っています.
内部ファイルを書き換え
具体的に書き換える必要があるのは2か所です.
-
_rels
内の.rels
- アドイン用フォルダ
myaddin
内のcustomUI.xml
(←フォルダもファイルも新しく作る)
このうち,.rels
はアドインを初めて用意するときだけ書き換える必要があるものです.
また,アドインフォルダ名myaddin
はある程度自由に決定できます(mysoshake
やabcdefg
など).
(既存のフォルダと同じ名前だとその中にcustomUI.xml
を作ることになるのでやめたほうがいいです)
.relsの書き換え
.rels
ファイルは右クリックしてメモ帳で開きましょう.
最初に開くと改行が入っておらず読みにくいですが,下のような内容だと思います.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
</Relationships>
一番下の</Relationships>
の真上の行に以下のコードを追加します.
<Relationship
Id="rIdMysoShake"
Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility"
Target="/mysoshake/customUI.xml"
/>
Idは英数字なら自由に決めて問題ありませんが,1文字目が数字だとうまく動かないかもしれません
Targetのフォルダ名(上ではmysoshake
)は後で作るフォルダ名と同じでないといけません.覚えておきましょう.
↓こんな感じになります(改行の代わりにスペースを入れても動作します2).
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
<Relationship Id="rIdMysoShake" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/mysoshake/customUI.xml" />
</Relationships>
customUI.xml の作成
まずはBook1フォルダに戻り,そこに新しく(先ほど決めた名前の)フォルダを作ります.
そのなかに,新しくテキストファイルを作り,名前と拡張子を変更してcustomUI.xml
とします.
→
これもまたメモ帳で開きそのなかにリボンの設定を書いていけばよいです.
ホームタブを消すcustomUI.xml
ここでは試しに「ホーム」タブを非表示にするように設定します.
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab idMso="TabHome" visible="false" />
</tabs>
</ribbon>
</customUI>
入力が出来たら.rels
やcustomUI.xml
は保存して閉じておきます.
アドインを"閉じる"
ここからファイルたちをxlamファイルに戻します.
ファイルたちを圧縮してzipファイルにする
Book1フォルダのすべてのファイルを選んで圧縮しましょう.
(ZIPファイルはデスクトップに出来ることがあります)
圧縮するとき, Book1フォルダを圧縮するとうまく動作しません .
かならず複数選択した状態で圧縮するようにしてください.
アドインファイルに変換する
起動テスト
ここまでうまくできていれば,起動した際に「ホーム」タブが消えるはずです.
↓マクロを有効にするとタブがなくなります
すべての Excelファイルを閉じてから開きなおせばタブは元に戻ります.
本題
ここからは,リボンにタブやボタン,チェックボックスを追加してVBAマクロと連携します.
customUI.xmlで独自のタブを追加する
次のような記述で何もないタブを追加できます.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="TabMysoShake" label="独自に作られたタブ">
</tab>
</tabs>
</ribbon>
</customUI>
入力が終わったら保存して閉じ,先ほどのように圧縮してアドインファイルに変換しましょう.
起動してみるとしたの用にタブが追加されます.
タブのidは(もともとあるタブや自分が追加したタブなど)他のタブと被るとうまく動作しません.ユニークな名前にしておきましょう.
タブは何も指定しない場合は一番後ろに追加されます.例えば「ホームの後ろに独自タブを配置したい」というときは
<tab id="TabMysoShake" label="独自に作られたタブ" insertAfterMso="TabHome">
というようにinsertAfterMso="タブ名"
と書けばよいです.
既存のタブの名前は公式のドキュメント (直接リンク)にあります.
上のノートで紹介しているドキュメントを見ればボタンの追加方法やマクロとの連携方法がすべて書いてあります.
いくつかの例を紹介しておきます.
タブにボタンを追加する
何の機能もないボタンを追加してみましょう.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="TabMysoShake" label="独自に作られたタブ" insertAfterMso="TabHome">
<button id="mysoButton" label="独自のボタン"/>
</tab>
</tabs>
</ribbon>
</customUI>
ボタンなどのリボンに配置されるものは,何かのグループに分類しなければなりません(見た目が崩れないように).そのため,<tab></tab>
の中に直接ボタンを追加しようとしてもエラーとなり, アドインファイルに変換してもタブが追加されず,何も起こりません. customUIではミスがあっても警告などは出ないので覚えておきましょう .
ボタンにマクロを結びつける
今はボタンをクリックしても何も起きません.
そのため,customUI.xml内でどのマクロを呼ぶのかを指定しなければなりません.
まずは呼び出されるマクロを作りましょう.
OnActionを作る
「開発」>「VisualBasic」 を開いて,新しい「標準モジュール」を作りましょう.
カスタムUIから呼ばれる場合,プロシージャは次の形式で書きます.
Public Sub MysoOnAction(control As IRibbonControl)
'何かの処理 ↓例えば
If control.Id = "mysoButton" Then
Call MsgBox("mysoButtonが押されました")
End If
End Sub
値が入るテキストボックスやチェックボックス,またはコールバック(マクロ側でcustomUIの中身を変化させる方法)を使うときは引数が増えることはありますが,通常は1つだけ引数をとります.
ここで,上書き保存が終了したらExcelを終了し,再び「zipに変換→展開」という作業を行いましょう.
これをしないで先ほどのファイルを書き換えていると今作ったVBAのソースも消えてしまいます.
customUI.xmlでOnActionを呼ぶように設定する
次にcustomUI.xml側の設定です.ボタンの部分にOnActionの設定が増えています.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="TabMysoShake" label="独自に作られたタブ" insertAfterMso="TabHome">
<group id="mysoGroup" label="独自グループ">
<button id="mysoButton" label="独自のボタン" onAction="MysoOnAction"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
動作チェック
これで再度アドインファイルに変換して起動.動作チェックをすると次のようになります.
まとめ
以上のようにしていくことで次々とマクロを登録できます.
コールバックやそのほかの機能(msoImageやkeytipなど)も使いこなせるととても便利になるようですのでぜひ活用していきましょう.
(2024年10月18日)ちょっとした追記
今回はExcelで追加をしましたが,Word(マクロ有効文書 docm)などでも拡張子をzipにかえてあげると同じように処理ができるみたいです(未確認).
参考になるサイト
- [MS-CUSTOMUI]: Custom UI XML Markup Specification
- 3.4.1.3 CustomUI Part
- IRibbonControl オブジェクト (Office)
- Excel のリボンUIを業務アプリとして使う
- Excel VBA 第2回 リボンとアドイン作成