「[リボン・カスタマイズ]splitButton要素で大量にある項目を使いやすくまとめる。」で下記コメントをいただきました。
旧式のコマンドバー式のプルダウンメニューでは、無効なメニューを非表示(グレイアウト)にする事が良く有りますが、リボンに換装するために、「ボタンのイメージを切り替える・組込アイコン」を参考に試していますが、より良い方法は有りませんか?
メニューやボタンの有効・無効を設定する場合はenabled属性、動的に設定する場合はgetEnabled属性を使います。
下記のコードでは「有効」ボタンが有効、「無効」ボタンが無効、「切替」ボタンを押すことで「動的」ボタンの有効・無効を切り替えることができます。
リボンXML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <? xml version = "1.0" encoding = "utf-8" ?> < ribbon > < tabs > < tab id = "tabSample" label = "Sample Tab" > < group id = "grpSample" label = "Sample Group" > < button id = "btnSample1" label = "有効" imageMso = "HappyFace" size = "large" enabled = "true" /> < button id = "btnSample2" label = "無効" imageMso = "SadFace" size = "large" enabled = "false" /> < button id = "btnSample3" label = "動的" size = "large" getImage = "btnSample_getImage" getEnabled = "btnSample_getEnabled" /> < button id = "btnSample4" label = "切替" imageMso = "HappyFace" size = "large" supertip = "「動的」ボタンの有効・無効を切り替えます。" onAction = "btnSample_onAction" /> </ group > </ tab > </ tabs > </ ribbon > </ customUI > |
VBAコード:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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 btnSample_getEnabled(control As IRibbonControl, ByRef returnedVal) returnedVal = flg End Sub Public Sub btnSample_getImage(control As IRibbonControl, ByRef returnedVal) Select Case flg Case True : returnedVal = "HappyFace" Case False : returnedVal = "SadFace" End Select End Sub Public Sub btnSample_onAction(control As IRibbonControl) flg = Not flg myRibbon.InvalidateControl "btnSample3" End Sub |
上記コードではボタンの有効・無効に合わせてgetImage属性のコールバックでイメージの切り替えも行っていますが、状況に応じて使い分けるのが良いと思います。
色々試してみましたが、ボタンの原型を留めてグレーアウトに出来るので、コマンドバーのプルダウンメニューより見栄えが良いと感じました。望んだ物より良い物を頂き、大変感謝しています。
RibbonUIのXMLの見栄えとGrayOutのチェック用にテストベンチを作って見ました。チェック後は、対象のシステムへ Ribbon Controlの記述を入れたモジュールを移植するだけで、OnLOoadからGrayOut動作まで賄えるので、RibbonUIが容易に作れるように成りました。味を占めて1ボタンでもこのモジュールを使ってます。
いきなりのコメント失礼いたします。
今回オリジナルのボタンの有効、無効の切り替えを行っていますが、
既存(Microsoftでデフォルトで作成されるリボンのボタン)の有効、無効の設定などはできるものなのでしょうか?
Outlookにて既存のボタンを無効化させようと調査し、閲覧ウィンドウにenabled=”false”を設定しようとしておりますがうまくできておりません。
よろしければご教示いただければ幸いです。
環境はoutlook2010で行っております
> 猫さん
初心者備忘録管理人のきぬあさです。
ご質問いただきましたリボンの各コントロールの有効・無効設定の件についてですが、下記のようにcommand要素のenabled属性(動的に設定する場合はgetEnabled属性)を指定することで設定可能なのですが、
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
customUI
xmlns
=
"http://schemas.microsoft.com/office/2006/01/customui"
>
<
commands
>
<
command
idMso
=
"MenuPreviewPane"
enabled
=
"false"
/>
</
commands
>
</
customUI
>
Outlookの場合はWordやExcelと違ってファイル単位で設定することはできず、 http://www.ka-net.org/blog/?p=5517 で紹介しているようにCOMアドインを開発することになりますので、動的なコントロールの切り替えを行わないのであれば、下記ページで紹介しているようにレジストリを編集して、「DisabledCmdBarItemsList」キーに無効にするコントロールのPolicy IDを設定するのが良いだろうと思います。
・特定のコントロールを無効にする(Office 2007,2010)
http://www.ka-net.org/office/of35.html
Policy IDは、下記リンク先からDLできるコントロールIDリストに記載されていますので、無効にしたいコントロールのIDを調べる( http://www.ka-net.org/blog/?p=4438 )→コントロールIDリストからPolicy IDを調べる、といった手順で取得できます。
(Outlook 2010の場合、閲覧ウィンドウ(MenuPreviewPane)のPolicy IDは「18768」でした。)
https://docs.com/kinuasa/7561/office-id
きぬあさ様
ご回答いただきありがとうございます。
今回の目的が、ウイルス感染を未然に防止するため、プレビューを表示させないため閲覧ウィンドウを非活性にしプレビューを表示させないことを想定しています。
提示して頂いた、特定のコントロールを無効にする場合の方法も検討しましたが、
・当方の環境にDisabledCmdBarItemsListがサイトに記入されているパスに存在しない、
・プレビューを最初から表示しない設定(オフ)にする必要がある。
の理由によりXMLからの制御を考えております。
トグルボタンの初期設定の方法などこの後も調査が必要ですが、
躓いてる状況から脱出できました。
再三になりますがお礼申し上げます。
また、追加の情報を調べて頂きお手数をおかけしたことお詫び申し上げます。
> 猫さん
初心者備忘録管理人のきぬあさです。
> ・当方の環境にDisabledCmdBarItemsListがサイトに記入されているパスに存在しない
キーやエントリが存在しない場合は自分で追加する必要があります。
> 今回の目的が、ウイルス感染を未然に防止するため、プレビューを表示させないため閲覧ウィンドウを非活性にしプレビューを表示させないことを想定しています。
であれば、やはりグループポリシーやレジストリの変更で閲覧ウィンドウを無効にした方が制御しやすいのではないかと思います。
HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\(Outlookバージョン)\Outlook\Options\DisableReadingPane (REG_DWORD,値:1)
http://answers.microsoft.com/thread/9f179163-68a7-48e6-bb8f-20cfe1afe1b8
http://www.slipstick.com/outlook/rules/disable-outlooks-reading-pane/
きぬあさ様
>キーやエントリが存在しない場合は自分で追加する必要があります。
自分で追加をすることで非活性にすることを確認いたしました。
>> 今回の目的が、ウイルス感染を未然に防止するため、プレビューを表示させないため閲覧ウィンドウを非活性にしプレビューを表示させないことを想定しています。
>であれば、やはりグループポリシーやレジストリの変更で閲覧ウィンドウを無効にした方が制御しやすいのではないかと思います。
ポリシーでの制御を上司に提案しましたが、アンインストール時にポリシーの削除が必要であることまた、作成物を配布する環境が2010のみではないことを考えXMLでの制御で進めたいとのことでした…
再三お手数をおかけして申し訳ございませんが、トグルボタンを有効にする方法をご存じであればご教示いただきたいです…
> 猫さん
初心者備忘録管理人のきぬあさです。
> トグルボタンを有効にする方法
上でも書いた通り、コントロール(toggleButton含む)の有効・無効の設定は「enabled」属性で行います。
動的に有効・無効を切り替える場合には「getEnabled」属性を使います。
たとえばExcelで「太字」と独自のコントロールの有効・無効を動的に切り替えたい場合には下記のようになります。
・リボンXML
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
customUI
onLoad
=
"rbnSample_onLoad"
xmlns
=
"http://schemas.microsoft.com/office/2006/01/customui"
>
<
commands
>
<!-- 既存コントロールの場合 -->
<
command
idMso
=
"Bold"
getEnabled
=
"command_getEnabled"
/>
</
commands
>
<
ribbon
>
<
tabs
>
<
tab
id
=
"tabSample"
label
=
"Sample Tab"
>
<
group
id
=
"grpSample"
label
=
"Sample Group"
>
<!-- 独自のコントロールの場合・btnSample1のonActionで有効・無効切替 -->
<
button
id
=
"btnSample1"
label
=
"Sample Button1"
size
=
"large"
imageMso
=
"HappyFace"
onAction
=
"btnSample_onAction"
/>
<
button
id
=
"btnSample2"
label
=
"Sample Button2"
size
=
"large"
imageMso
=
"HappyFace"
getEnabled
=
"btnSample_getEnabled"
/>
</
group
>
</
tab
>
</
tabs
>
</
ribbon
>
</
customUI
>
・標準モジュール
Option
Explicit
Private
myRibbon
As
Office.IRibbonUI
Private
flgCtrl
As
Boolean
Private
flgBtn
As
Boolean
Public
Sub
rbnSample_onLoad(ribbon
As
IRibbonUI)
Set
myRibbon = ribbon
flgCtrl =
False
'既存コントロール用表示フラグ
flgBtn =
True
'独自コントロール用表示フラグ
End
Sub
Public
Sub
command_getEnabled(control
As
IRibbonControl,
ByRef
returnedVal)
returnedVal = flgCtrl
End
Sub
Public
Sub
btnSample_onAction(control
As
IRibbonControl)
'有効・無効切替
flgCtrl =
Not
flgCtrl
flgBtn =
Not
flgBtn
myRibbon.Invalidate
'切替反映
End
Sub
Public
Sub
btnSample_getEnabled(control
As
IRibbonControl,
ByRef
returnedVal)
returnedVal = flgBtn
End
Sub
ただしOutlookの場合は、 https://msdn.microsoft.com/ja-jp/library/cc668191.aspx にも記載がある通り、VSTO(COM)アドインの開発が必要となるため、上記コードをそのまま使うことはできません。
C#なりVB.NETなり、開発言語に合わせてコードを書きかえる必要があります。
(といっても、enabled属性やgetEnabled属性を使う事には変わりありません。)
Visual Studioを使わずOutlook用のCOMアドインを開発することもできますが、保守性や開発のしやすさ等を考慮すると、Visual Studioで開発することをお薦めいたします。
(Visual Studio Professional + Microsoft Office Developer Tools)
VSTOアドインは配布の問題もありますし、正直に言えば、ポリシーによる制御の方が圧倒的に容易だとは思うのですが・・・、とりあえずご参考までに。
きぬあさ様
当方の記載に問題があり誤解釈をさせていた模様です・・・申し訳ございません。
>トグルボタンを有効にする方法
ですが、有効無効というよりは、オンオフをオンの状態にするイメージです。
例)Excelにて最初から「太字」がオンになっている状態で開始される。
例)Excelを新規作成した時にブックの表示が標準ではなく、改ページレイアウトで開始される
このようなイメージの中で閲覧ウィンドウのオフが指定されている状態で開始できることを考えております。
> 猫さん
初心者備忘録管理人のきぬあさです。
> このようなイメージの中で閲覧ウィンドウのオフが指定されている状態で開始できることを考えております。
なるほど。
ようやく分かりました。
たとえばマクロで閲覧ウィンドウをオフにする(閲覧ウィンドウ「オフ」コントロール(ReadingPaneOff)をオン状態にする)場合は下記のようなコードで処理することができます。
Public
Sub
Sample()
With
Application.ActiveExplorer
If
.IsPaneVisible(olPreview) =
True
Then
.ShowPane olPreview,
False
End
With
End
Sub
Public
Sub
Sample2()
With
Application.ActiveExplorer.CommandBars
If
.GetPressedMso(
"ReadingPaneOff"
) =
False
Then
.ExecuteMso
"ReadingPaneOff"
End
If
End
With
End
Sub
上記のようなコードをアプリケーション開始時(customUI要素のonLoad属性のコールバック)で実行すれば、閲覧ウィンドウをオフにした状態で起動することができるのではないかと思います。
(私の方では未検証です。)
customUI要素を使う場合は、XMLでリボンをカスタマイズする必要があるので、この場合もやはりCOMアドインの開発が必要になってしまいます。
VBAでApplicationオブジェクトのStartupイベントを使う方法も有りますが、コードを実行するタイミングを調整する必要がありそうです。
そのため、最も簡単だと思われるのは、OUTLOOK.EXEに「/nopreview」オプションを付けて起動することだと思います。
( https://support.office.com/ja-jp/article/079164cd-4ef5-4178-b235-441737deb3a6 参照)
あるいは、 http://answers.microsoft.com/thread/9f179163-68a7-48e6-bb8f-20cfe1afe1b8 でも書いていますが、アプリケーション終了時にレジストリ編集することで、次回起動時に閲覧ウィンドウをオフにする方法も有ります(DisableReadingPaneエントリの制御)。
'ThisOutlookSession
Private
Sub
Application_Quit()
Dim
reg_entry
As
String
reg_entry = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & _
Format(Val(Application.Version),
"00.0"
) & _
"\Outlook\Options\DisableReadingPane"
CreateObject(
"WScript.Shell"
).RegWrite reg_entry, 1,
"REG_DWORD"
End
Sub
上記の通り、アプリケーション開始時に閲覧ウィンドウをオフにする方法はいくつかありますが、XMLによるカスタマイズだけではコントロールのオン・オフの制御ができないため、何らかの処理(コード)を実行する必要があります。
VBAにしろVSTOにしろ、開発・配布・管理の点で手間が掛かりますので、できればポリシー(レジストリ)で完全に閲覧ウィンドウを無効にしてしまうか、Outlookのコマンド ライン スイッチを活用されることをお薦めいたします。
きぬあさ様
XMLのイメージにて
でできるのかと想定していましたが違うのですね。
提示して頂いたサンプルをもとにC#、visualStudioにて作成を行ってみます。
Application.ActiveExplorer.CommandBarsの参照がないと怒られてしまいまだ完成できておりませんが…
>VBAにしろVSTOにしろ、開発・配布・管理の点で手間が掛かりますので、できればポリシー(レジストリ)で完全に閲覧ウィンドウを無効にしてしまうか、Outlookのコマンド ライン スイッチを活用されることをお薦めいたします。
現状案として考えておりますが、今回のXML側のみでの作成も案として提示する模様です…どう転ぶかわかりませんが、作成自体は必須とのことでした。
きぬあさ様
こんばんは♪
貴殿のご活躍にいつも感謝しております。
ありがとうございます。
さて、下記質問があります。
<質問>
Excelにて、リボン、ボタンではなく、リボン内の特定の「グループ」について
表示/非表示をトグルボタンのクリック操作で行う場合のXMLコードを
教えて下さい。
お時間ございましたらご教示頂きたく、よろしくお願い致します。
> spacedragon さん
初心者備忘録管理人のきぬあさです。
ご質問いただいた件につきまして、別途記事を書きましたので、そちらをご参照いただければと思います。
・[リボン・カスタマイズ]グループの表示・非表示をトグルボタンで切り替える
https://www.ka-net.org/blog/?p=11216