Office関連

[リボン・カスタマイズ]ボタンやメニューの有効・無効を切り替える。

[リボン・カスタマイズ]splitButton要素で大量にある項目を使いやすくまとめる。」で下記コメントをいただきました。

旧式のコマンドバー式のプルダウンメニューでは、無効なメニューを非表示(グレイアウト)にする事が良く有りますが、リボンに換装するために、「ボタンのイメージを切り替える・組込アイコン」を参考に試していますが、より良い方法は有りませんか?

メニューやボタンの有効・無効を設定する場合はenabled属性、動的に設定する場合はgetEnabled属性を使います。
下記のコードでは「有効」ボタンが有効、「無効」ボタンが無効、「切替」ボタンを押すことで「動的」ボタンの有効・無効を切り替えることができます。

リボン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="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コード:

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属性のコールバックでイメージの切り替えも行っていますが、状況に応じて使い分けるのが良いと思います。

[Office用アプリ]JavaScript API for Officeのポスター前のページ

Google Noseで表示される香りをまとめてみました。次のページ

関連記事

  1. Office関連

    【2018年9月版】Microsoft Office関連の公式リンクまとめ

    Ignite 2018やOffice 2019のリリースがあり、Off…

  2. Office関連

    指定したスライドにユーザー設定レイアウトを適用するPowerPointマクロ

    PowerPointにはオリジナルのレイアウト(ユーザー設定レイアウト…

  3. Office関連

    Computer Vision APIを使って画像から文字列を取得するVBAマクロ

    前々回の記事で、Fiddlerを使ってMicrosoft Cognit…

  4. Office関連

    UIAutomationClient参照時にDLL読み込みエラーが発生した時の対処法

    マクロでダイアログやボタンの操作を行う時に便利なUI Automati…

  5. Office関連

    PDFを分割するVBAマクロ

    「VBA PDF 分割」といったキーワード検索でのアクセスがありました…

コメント

    • あくしず
    • 2013年 3月 13日

    色々試してみましたが、ボタンの原型を留めてグレーアウトに出来るので、コマンドバーのプルダウンメニューより見栄えが良いと感じました。望んだ物より良い物を頂き、大変感謝しています。

    • あくしず
    • 2013年 6月 23日

    RibbonUIのXMLの見栄えとGrayOutのチェック用にテストベンチを作って見ました。チェック後は、対象のシステムへ Ribbon Controlの記述を入れたモジュールを移植するだけで、OnLOoadからGrayOut動作まで賄えるので、RibbonUIが容易に作れるように成りました。味を占めて1ボタンでもこのモジュールを使ってます。

    • 2016年 3月 22日

    いきなりのコメント失礼いたします。

    今回オリジナルのボタンの有効、無効の切り替えを行っていますが、
    既存(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

        • 2016年 3月 23日

        きぬあさ様

        ご回答いただきありがとうございます。

        今回の目的が、ウイルス感染を未然に防止するため、プレビューを表示させないため閲覧ウィンドウを非活性にしプレビューを表示させないことを想定しています。

        提示して頂いた、特定のコントロールを無効にする場合の方法も検討しましたが、
        ・当方の環境に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/

    • 2016年 3月 24日

    きぬあさ様

    >キーやエントリが存在しない場合は自分で追加する必要があります。
    自分で追加をすることで非活性にすることを確認いたしました。

    >> 今回の目的が、ウイルス感染を未然に防止するため、プレビューを表示させないため閲覧ウィンドウを非活性にしプレビューを表示させないことを想定しています。
    >であれば、やはりグループポリシーやレジストリの変更で閲覧ウィンドウを無効にした方が制御しやすいのではないかと思います。

    ポリシーでの制御を上司に提案しましたが、アンインストール時にポリシーの削除が必要であることまた、作成物を配布する環境が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アドインは配布の問題もありますし、正直に言えば、ポリシーによる制御の方が圧倒的に容易だとは思うのですが・・・、とりあえずご参考までに。

        • 2016年 3月 24日

        きぬあさ様

        当方の記載に問題があり誤解釈をさせていた模様です・・・申し訳ございません。

        >トグルボタンを有効にする方法
        ですが、有効無効というよりは、オンオフをオンの状態にするイメージです。

        例)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のコマンド ライン スイッチを活用されることをお薦めいたします。

            • 2016年 3月 28日

            きぬあさ様

            XMLのイメージにて

            でできるのかと想定していましたが違うのですね。

            提示して頂いたサンプルをもとにC#、visualStudioにて作成を行ってみます。
            Application.ActiveExplorer.CommandBarsの参照がないと怒られてしまいまだ完成できておりませんが…

            >VBAにしろVSTOにしろ、開発・配布・管理の点で手間が掛かりますので、できればポリシー(レジストリ)で完全に閲覧ウィンドウを無効にしてしまうか、Outlookのコマンド ライン スイッチを活用されることをお薦めいたします。

            現状案として考えておりますが、今回のXML側のみでの作成も案として提示する模様です…どう転ぶかわかりませんが、作成自体は必須とのことでした。

  1. きぬあさ様
    こんばんは♪
    貴殿のご活躍にいつも感謝しております。
    ありがとうございます。

    さて、下記質問があります。

    <質問>
    Excelにて、リボン、ボタンではなく、リボン内の特定の「グループ」について
    表示/非表示をトグルボタンのクリック操作で行う場合のXMLコードを
    教えて下さい。

    お時間ございましたらご教示頂きたく、よろしくお願い致します。

    • > spacedragon さん

      初心者備忘録管理人のきぬあさです。
      ご質問いただいた件につきまして、別途記事を書きましたので、そちらをご参照いただければと思います。

      ・[リボン・カスタマイズ]グループの表示・非表示をトグルボタンで切り替える
      https://www.ka-net.org/blog/?p=11216

  1. この記事へのトラックバックはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

PAGE TOP