※ 2015/2/18 コードに一部誤りがあったので修正しました。
リボンをカスタマイズして、ホームやアドインといった既存のタブではない、カスタムタブを共有して複数のファイルで使いたい、という質問をいただきました。
そういえば、今までHPやブログでタブを共有する方法を取り上げたことが無かったので、今回改めてExcelを例に紹介することにします。
リボンのカスタムタブを共有する方法ですが、まずは基盤となるファイル(ホスト)を用意します。
・ホストファイルのリボンXML
<?xml version="1.0" encoding="utf-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:nsShared="rbnShared"> <ribbon> <tabs> <tab idQ="nsShared:tabShared" label="Shared Tab"> <group idQ="nsShared:grpShared" label="Shared Group" /> </tab> </tabs> </ribbon> </customUI>
Custom UI Editor等でファイルをカスタマイズしたら、アドイン(xlam)として保存し、Excelで読み込みます(Excelのオプション → アドイン → Excel アドインの設定)。
この時点では上図のようにタブ(Shared Tab)とグループ(Shared Group)だけしか表示されません。
次に基盤の上に乗るファイル(ゲスト)を用意します。
・ゲストファイル1のリボンXML
<?xml version="1.0" encoding="utf-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:nsShared="rbnShared"> <ribbon> <tabs> <tab idQ="nsShared:tabShared"> <group idQ="nsShared:grpShared"> <button id="btnSample1" label="Sample Button 1" imageMso="HappyFace" size="large" onAction="btnSample1_onAction" /> </group> </tab> </tabs> </ribbon> </customUI>
・ゲストファイル1の標準モジュール
Option Explicit Public Sub btnSample1_onAction(control As IRibbonControl) MsgBox control.ID, vbInformation + vbSystemModal End Sub
用意ができたらホストファイルと同じようにアドインとして保存し、Excelで読み込むと・・・
何も表示されていなかったホストファイルのグループ(Shared Group)にゲストファイルのボタン(Sample Button 1)が表示され、クリック時のコールバック(btnSample1_onAction)も動作することが確認できました。
さらに、別のゲストファイルを追加することもできます。
・ゲストファイル2のリボンXML
<?xml version="1.0" encoding="utf-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:nsShared="rbnShared"> <ribbon> <tabs> <tab idQ="nsShared:tabShared"> <group idQ="nsShared:grpShared"> <button id="btnSample2" label="Sample Button 2" imageMso="SadFace" size="large" onAction="btnSample2_onAction" /> </group> </tab> </tabs> </ribbon> </customUI>
・ゲストファイル2の標準モジュール
Option Explicit Public Sub btnSample2_onAction(control As IRibbonControl) MsgBox control.ID, vbCritical + vbSystemModal End Sub
このファイルも同様にアドインとして読み込むと・・・
もう一つボタン(Sample Button 2)が追加されました。
上記のように、名前空間を設定し、idQ属性で指定することで、リボンのタブを共有することができます。
設定が若干ややこしいかもしれませんが、慣れればすぐに設定できますので、カスタムタブの共有化を考えている方は是非お試しください。
お世話になります。
本ブログで紹介されているコードにおいて、VBEの参照設定で、ゲストファイルがホストファイルを参照するようにすると、ゲストファイルを開くとホストファイルのカスタムタブが自動で読み込まれます。
(ただし、ホストファイルのアドインのチェックボックスは選択されていない状態となっている。利用できるアドインで選択されているのは、ゲストファイルのみとなっている)
ゲストファイルを閉じるとホストファイルのカスタムタブも自動的に閉じたいのですが、どのようにすればできるでしょうか?
実際の使用用途として、
ホストファイルは共用で使えるマクロ集を、ゲストファイルはその機能に特化したマクロをそれぞれアドイン化しており、ゲストファイルからホストファイルのマクロを呼び出せるように参照設定しています。
ゲストファイルを閉じてもホストファイルのカスタムタブが残ったままになり、すっきりしないので、質問させて頂いた次第です。
(Excel 2013を使用していますが、残ってしまったホストファイルのカスタムタブは、Excelの閉じる、開くを繰り返すと消えます)
よろしくお願い致します。
> まひとさん
初心者備忘録管理人のきぬあさです。
ご質問いただきましたカスタムタブの共有の件につきまして、私の方では未確認なのですが、下記のように動的にアドインファイルを読み込むようにしてみてはいかがでしょうか。
ただ、私の経験上、カスタムタブの共有化は管理が煩雑になり、トラブルの元になることが多いです。
可能であれば、コンテキスト タブ( https://dekiru.net/article/12810/ )等を活用してアドインファイルをまとめてしまうか、ホームタブ等の既存タブを利用した方が良いだろうと思います。
ご回答ありがとうございます。返信遅くなりすみません。
ご提示されたコードだけだとうまく行きませんでした。
ホストアドインを参照設定したゲストアドインを開くと、ホストアドインはInstalled=Falseとなっているのが原因かと思います。
ただ、強制的にホストアドインをInstalled=Trueとし、その後Installed=Falseとすることで、Excelを閉じて再起動した際にはホストアドインのカスタムタブは表示されなくなり、目的の半分は達成できました。Excelを終了するまでは、ゲストアドインを閉じても、ホストアドインのカスタムタブは残ったままです。
本当は、ゲストアドインを閉じた時点でホストアドインのカスタムタブも閉じたいのですが、ホストアドインを参照している複数ブックを開いていると、どの時点でInstalled=Falseにするのか、というのも難しいかと思われるため、一旦解決とさせて頂きます。
ありがとうございました。