「Over riding Default controls in Word using Custom UI editor and VBA」で回答したコードです。
“「ファイルを開く」コマンドを実行したときに本来の機能ではなくマクロを実行したい”という質問なのですが、この処理を実現するためにはcommand要素のonAction属性を使います。
[標準モジュール]
1 2 3 | Private Sub office_FileOpen(control As IRibbonControl, ByRef cancelDefault) If MsgBox( "Do you really open file...?" , vbYesNo) = vbYes Then cancelDefault = False End Sub |
[リボンXML]
1 2 3 4 5 6 7 8 9 10 11 12 13 | <? xml version = "1.0" encoding = "utf-8" ?> < commands > < command idMso = "FileOpen" onAction = "office_FileOpen" /> </ commands > < ribbon startFromScratch = "true" > < qat > < sharedControls > < button idMso = "FileOpen" screentip = "This is Happy" supertip = "Click here for a happy message" /> </ sharedControls > </ qat > </ ribbon > </ customUI > |
下記ページも参考になるかと思います。
「既存の機能の代わりにマクロを実行する」
//www.ka-net.org/ribbon/ri22.html
現在90個程の項目を持った集計システムを旧式のプルダウンメニューからリボンインターフェースに換装している最中で、このサイトには大変お世話になってます。90個とも成ると、通常のボタンでは賄えず、Split Button を併用しています。通常のボタンをジャンルとし、Split Button を各項目にする事で、操作性の改善を目論んでいます。この様な例は少ないとは思いますが、Split Button を紹介されては如何でしょう。
> あくしず様
当サイトにご訪問いただき、ありがとうございます。
たしかに大量の項目をまとめるのにsplitButton要素は便利ですね。
早速記事を書きました。
・[リボン・カスタマイズ]splitButton要素で大量にある項目を使いやすくまとめる。
http://www.ka-net.org/blog/?p=2806
以前頂いた、ボタンを動的に変化させる方法で、マクロ内部のトップに有るサブプロシジャーから始めて、リボンの1個のボタンをグレーアウトさせる事が出来ました。しかし、複数のボタンでは、暗礁に乗り上げてしまいました。多くても10項目程度ですが、プルダウンメニューを使っている既存のシステムが幾つも有り、リボンに換装したいと思っています。
> あくしず様
先日付けましたコメント( http://www.ka-net.org/blog/?p=2674#comment-1060 )通り、具体的なコードが分からないと何とも言えないのですが、menu要素の子要素であろうとなかろうと、有効・無効を動的に設定する場合はgetEnabled属性を使います。
コントロールが複数ある場合には、例えば下記のように(リボンXMLのxmlns属性の値は文字化けしてしまうので意図的に「h ttp」に変更してあります)適当な変数を配列で用意して適宜切り替えるとか、コントロールの有効・無効を、Excelであれば非表示のシート上のセルに記録しておく、Wordであればドキュメント変数に入れておく、あるいはレジストリーに保存する(SaveSetting)、外部のテキストやini・XMLファイル等に書き出しておく、といった方法が考えられますので、このあたりは状況に応じて使い分けるのが良いだろうと思います。
・リボンXML:
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
customUI
onLoad
=
"Ribbon_onLoad"
xmlns
=
"h ttp://schemas.microsoft.com/office/2006/01/customui"
>
<
ribbon
>
<
tabs
>
<
tab
id
=
"tabSample"
label
=
"Sample Tab"
>
<
group
id
=
"grpSample"
label
=
"Sample Group"
>
<
menu
id
=
"mnuSample"
label
=
"Sample Menu"
size
=
"large"
itemSize
=
"normal"
imageMso
=
"HappyFace"
>
<
button
id
=
"btn1"
label
=
"Button1"
imageMso
=
"HappyFace"
getEnabled
=
"button_getEnabled"
tag
=
"1"
/>
<
button
id
=
"btn2"
label
=
"Button2"
imageMso
=
"HappyFace"
getEnabled
=
"button_getEnabled"
tag
=
"2"
/>
<
button
id
=
"btn3"
label
=
"Button3"
imageMso
=
"HappyFace"
getEnabled
=
"button_getEnabled"
tag
=
"3"
/>
<
button
id
=
"btn4"
label
=
"Button4"
imageMso
=
"HappyFace"
getEnabled
=
"button_getEnabled"
tag
=
"4"
/>
<
button
id
=
"btn5"
label
=
"Button5"
imageMso
=
"HappyFace"
getEnabled
=
"button_getEnabled"
tag
=
"5"
/>
</
menu
>
<
button
id
=
"btnSample1"
label
=
"Sample Button1"
imageMso
=
"HappyFace"
size
=
"large"
onAction
=
"button_onAction"
/>
<
button
id
=
"btnSample2"
label
=
"Sample Button2"
imageMso
=
"HappyFace"
size
=
"large"
onAction
=
"button_onAction"
/>
</
group
>
</
tab
>
</
tabs
>
</
ribbon
>
</
customUI
>
・VBAコード:
Option
Explicit
Private
myRibbon
As
Office.IRibbonUI
Private
flg(1
To
5)
As
Boolean
Public
Sub
Ribbon_onLoad(ribbon
As
IRibbonUI)
Dim
i
As
Long
Set
myRibbon = ribbon
For
i = LBound(flg)
To
UBound(flg): flg(i) =
True
:
Next
End
Sub
Public
Sub
button_getEnabled(control
As
IRibbonControl,
ByRef
returnedVal)
returnedVal = flg(
CLng
(control.Tag))
End
Sub
Public
Sub
button_onAction(control
As
IRibbonControl)
Select
Case
control.ID
Case
"btnSample1"
'"btn3"だけ無効に設定
flg(3) =
False
myRibbon.InvalidateControl
"btn3"
'"btn3"だけ更新
Case
"btnSample2"
'"btn1" - "btn5"を設定
flg(1) =
True
flg(2) =
False
flg(3) =
True
flg(4) =
False
flg(5) =
True
myRibbon.Invalidate
'リボン全体を更新
End
Select
End
Sub
有難う御座います。getEnabledやInvalidateControlは何度も穴の空く程見ていたのですが、単純にN倍化する事ばかり考えていたので、行き詰っていました。
いっそ、IDとON/OFFのパラメーターを持ったクラスモジュールを作ろうかとも考えていた所でした。
昨日頂いたコードを試して見ました。正常に動作しましたが、flgのIndexの元になっているcontrol.Tagとは何物でしょうか?
前作がプルダウンメニューのため、Ribbon IF のリニューアル版もグレーアウトが必須と思い込んでいましたが、初期状態では10個のボタンの内9個がグレーアウトで、カラフルな Ribbon IFに直す意味がなくなる事に気が付き、MessageBoxでガイドする事にしました。大変有難う御座いました。
とりあえずは解決されたようで何よりです。
> control.Tagとは何物でしょうか?
対象コントロールのtag属性の値です。
“btn1″でいうと「1」になります。
頂いたソースコードを見ていて、今一つ繋がりに納得できない所が有ったのですが、ByRefの事に気が付いて、ようやく理解できました。今の開発が終わったらグレイアウト版も作って、どちらが良い感触か試して見たいと思っています。
現在開発中のシステムのインターフェースは、エンドユーザーの声でカラフルなリボンとメッセージボックスの組み合わせに決まりましたが、比較検討用のグレーアウトのインターフェースも今日完成しました。以前頂いたコードをメニューから通常のボタンに代えた物です。此処まで漕ぎ着けられたのは、きぬあさ様の御かげです。有難う御座いました。
頂いたグレーアウトのコードも大分理解できるようになったので、ボタンの配色とグレーアウト動作のチェックを兼ねたテストベンチを、インターフェース換装予定の4種類と新規開発の1品種についてこの数日に作成し、私の為に書いていただいたグレーアウトのコードは多くの人にとっても非常に有効なコードで有る事を痛感いたしました。私への返信だけではもったいなく、正式のトピックスに再掲されてはいかがでしょう。コールバックの解説なども加えれば、より多くの人にとって貴重な資料と成ると思います。
Gray Out付きRibbon UI の3個目が完成しました。既存のシステムをできる限り新しいUIに換装したかったので、大変助かりました。Ribbon onLoad とGray Out の記述を保存したシートからコピペするようにしたら、Gray Out付きRibbon UIに換装するのが楽になりました。換装したい物は大量に有りますが、マクロのコードは、同系列の物は内蔵アップデータで移植できるので、XMLのインポートと共に時間を見計らってやって行こうと思っています。
> あくしず様
システム移行の件でお役に立てたようで何よりです。
旧システムをそのまま移行して「アドイン」タブから利用する、という方法もありますが、新しいUIリボンに合わせた形に換装した方が、使い勝手としては良くなりますね。
getEnabled関連の新しい記事に関しては、落ち着き次第記事にしようかと思います。