数年前に書いた記事に下記コメントをいただきました。
Excelにて、リボン、ボタンではなく、リボン内の特定の「グループ」について表示/非表示をトグルボタンのクリック操作で行う場合のXMLコードを教えて下さい。
グループに限らず、リボン上の各要素の表示・非表示を動的に切り替えたい場合はgetVisible属性を使います。
また、表示状態をトグルボタンで設定したいとのことなので、toggleButton要素のgetPressed属性でボタンの押下状態を設定し、onAction属性でボタンをクリックした際の処理を設定します。
リボンXML
<?xml version="1.0" encoding="utf-8"?> <customUI onLoad="rbnSample_onLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="tabSample" label="Sample Tab"> <group id="grpSample1" label="Group 1" getVisible="grpSample_getVisible"> <button id="btnDummy1" label="Button 1" imageMso="HappyFace" size="large" /> <button id="btnDummy2" label="Button 2" imageMso="HappyFace" size="large" /> <button id="btnDummy3" label="Button 3" imageMso="HappyFace" size="large" /> <button id="btnDummy4" label="Button 4" imageMso="HappyFace" size="large" /> </group> <group id="grpSample2" label="Group 2"> <toggleButton id="tglSample" label="表示・非表示切替" imageMso="HappyFace" size="large" supertip="グループの表示・非表示を切り替えます。" onAction="tglSample_onAction" getPressed="tglSample_getPressed" /> </group> </tab> </tabs> </ribbon> </customUI>
VBAコード(標準モジュール)
Option Explicit Private myRibbon As Office.IRibbonUI Private flg As Boolean Public Sub rbnSample_onLoad(ribbon As IRibbonUI) Set myRibbon = ribbon flg = True End Sub Public Sub grpSample_getVisible(control As IRibbonControl, ByRef returnedVal) returnedVal = flg End Sub Public Sub tglSample_onAction(control As IRibbonControl, pressed As Boolean) flg = pressed myRibbon.InvalidateControl "grpSample1" End Sub Public Sub tglSample_getPressed(control As IRibbonControl, ByRef returnedVal) returnedVal = flg End Sub
上記コードでは、トグルボタンが押下されている状態の時にはグループが表示され、解除されている状態のときは非表示になります。
きぬあさ様
早速ご対応下さりありがとうございます!!
これから実際にやってみます。
また不明点が発生しましたら質問させて頂きます。
そのせつはどうぞよろしくお願い致します。
きぬあさ様
無事にやりたいことができました。
ありがとうございます♪
さて、追加の質問をさせて下さい。
複数の「グループ」の表示/非表示をリボンからではなく、
アドインのユーザフォームのコントロール(チェックボックス等)から行う方法を
ご教示下さい。これによりExcelクローズ時の状態をファイル等に保存しておいて
次回のExcel起動時のデフォルトにしたいと思っています。
どうぞよろしくお願い致します。
> spacedragon さん
初心者備忘録管理人のきぬあさです。
myRibbonをPublicにしておけば、ユーザフォームからでもInvalidateControlメソッドを呼び出せますので、問題は“設定をどのタイミングでどこに保存し、どこから読み込むか?”になるかと思います。
シート、レジストリ、外部ファイル、ブック内のカスタムXML、ファイルのプロパティ、様々な保存場所が考えられますが、一例としてシートに設定値を保存するthom氏のブログ記事をご紹介します。
・VBA マクロの設定をどこに保存するか
https://thom.hateblo.jp/entry/2015/06/19/052753
・VBA マクロで利用する設定値をシートに保存し、文字列でアクセスするテクニック
https://thom.hateblo.jp/entry/2018/06/16/035609
・VBA マクロの設定をシートに保存する場合のテクニック
https://thom.hateblo.jp/entry/2015/06/21/021207
きぬあさ様
ありがとうございます♪
シートに設定値を保存するのは現在のアプリに実装ずみなのでOKです。
問題はユーザフォーム上のチェックボックスによってトグルで
特定のグループの表示/非表示を動的に切り替えたいです。
そのときのInvalidateControl周りの記述方法が分かりません。
UIのonLoadでPublic変数のリボンをセットしたあとに、
チェックボックスの記述はどうなるのでしょうか?
お手数ですがご教示頂けますと幸いです
どうぞよろしくお願い致します。
> spacedragon さん
初心者備忘録管理人のきぬあさです。
簡単なサンプルを書いてみましたので、ご参考にしていただければ幸いです。
・[リボン・カスタマイズ]グループの表示・非表示をユーザーフォームのチェックボックスで切り替える。
https://www.ka-net.org/blog/?p=11294