none
word リボンのデザインタブの透かしボタンなどを押下した際のイベント取得 RRS feed

  • 質問

  • リボンのデザインタブの透かしボタンなどを押下した際のイベントをVBAで取得する方法はございますでしょうか?

    イベントハンドラを探し出す方法等ございましたら、ご教示頂けますでしょうか。

    2018年3月19日 4:02

回答

  • こんにちは。

    > 若しくは、デザインタブの「透かし」ボタンを活性、非活性の制御ができれば良いのですが。。。

    リボンにある各機能(コントロール)はXMLをカスタマイズすることで、ある程度制御可能です。
    例えば、「透かし」ギャラリーの有効・無効を動的に切り替えたい場合は、command要素のgetEnabled属性のコールバックで処理することができます。

    リボンのカスタマイズについては、ここでは深く説明しませんが、「Custom UI Editor」を使うと楽に設定可能です。

    ※下記コードはWord 2016環境で検証を行っています。

    ・リボンXML
    <?xml version="1.0" encoding="utf-8"?>
    <customUI onLoad="Ribbon_onLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
      <commands>
        <command idMso="WatermarkGallery" getEnabled="Watermark_getEnabled" />
      </commands>
      <ribbon>
        <tabs>
          <tab idMso="TabWordDesign">
            <group id="grpCtrlWatermark" label="透かし切替" insertAfterMso="GroupPageBackground">
              <button id="btnCtrlWatermark" label="透かし切替" screentip="透かし切替" supertip="「透かし」の有効・無効を切り替えます。" size="large" imageMso="CustomWatermarkGallery" onAction="btnCtrlWatermark_onAction" />
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>

    ・標準モジュール
    Option Explicit
    
    Private myRibbon As Office.IRibbonUI
    Private flgWatermark As Boolean
    
    Public Sub Ribbon_onLoad(ribbon As IRibbonUI)
      Set myRibbon = ribbon
      flgWatermark = False
    End Sub
    
    Public Sub Watermark_getEnabled(control As IRibbonControl, ByRef returnedVal)
      returnedVal = flgWatermark
    End Sub
    
    Public Sub btnCtrlWatermark_onAction(control As IRibbonControl)
      If InputBox("「透かし」の有効・無効を切り替えるためのパスワードを入力してください。", "パスワード入力") = "pass" Then
        flgWatermark = Not flgWatermark
        myRibbon.InvalidateControlMso "WatermarkGallery"
      End If
    End Sub

    また、上記のようにマクロで制限を掛けたとしても、完璧に機能の実行を防ぐことは難しいため、運用で何とかできるのであれば、そちらでカバーすることも考えてみてはいかがでしょうか。
    • 回答としてマーク しーぷ 2018年3月22日 9:49
    2018年3月20日 1:13

すべての返信

  • こんにちは。

    押下時のイベントで、具体的にどのような処理を実行されたいのでしょうか?

    一部機能でしたら、下記記事で紹介している「コマンドバーのイベントを使用する方法」や「リボンをカスタマイズする方法」で対応できるかと思います。

    ・既存の機能の代わりにマクロを実行する方法をまとめてみました。 | 初心者備忘録
    https://www.ka-net.org/blog/?p=3099

    「透かし」等のgallery要素もイベントフックで無理やり検知できるとは思いますが、あまりオススメできるものではありません。
    2018年3月19日 6:44
  • ご返信頂きありがとうございます。

    具体的には、

    デザインタブの「透かし」ボタンを押下した際、自作したフォームを呼び出し、PWを入力させ、OKならば、透かしの設定画面を表示させ、NGならば設定画面を表示させないというような処理をしようとしています。

    若しくは、デザインタブの「透かし」ボタンを活性、非活性の制御ができれば良いのですが。。。

    2018年3月19日 8:35
  • こんにちは。

    > 若しくは、デザインタブの「透かし」ボタンを活性、非活性の制御ができれば良いのですが。。。

    リボンにある各機能(コントロール)はXMLをカスタマイズすることで、ある程度制御可能です。
    例えば、「透かし」ギャラリーの有効・無効を動的に切り替えたい場合は、command要素のgetEnabled属性のコールバックで処理することができます。

    リボンのカスタマイズについては、ここでは深く説明しませんが、「Custom UI Editor」を使うと楽に設定可能です。

    ※下記コードはWord 2016環境で検証を行っています。

    ・リボンXML
    <?xml version="1.0" encoding="utf-8"?>
    <customUI onLoad="Ribbon_onLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
      <commands>
        <command idMso="WatermarkGallery" getEnabled="Watermark_getEnabled" />
      </commands>
      <ribbon>
        <tabs>
          <tab idMso="TabWordDesign">
            <group id="grpCtrlWatermark" label="透かし切替" insertAfterMso="GroupPageBackground">
              <button id="btnCtrlWatermark" label="透かし切替" screentip="透かし切替" supertip="「透かし」の有効・無効を切り替えます。" size="large" imageMso="CustomWatermarkGallery" onAction="btnCtrlWatermark_onAction" />
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>

    ・標準モジュール
    Option Explicit
    
    Private myRibbon As Office.IRibbonUI
    Private flgWatermark As Boolean
    
    Public Sub Ribbon_onLoad(ribbon As IRibbonUI)
      Set myRibbon = ribbon
      flgWatermark = False
    End Sub
    
    Public Sub Watermark_getEnabled(control As IRibbonControl, ByRef returnedVal)
      returnedVal = flgWatermark
    End Sub
    
    Public Sub btnCtrlWatermark_onAction(control As IRibbonControl)
      If InputBox("「透かし」の有効・無効を切り替えるためのパスワードを入力してください。", "パスワード入力") = "pass" Then
        flgWatermark = Not flgWatermark
        myRibbon.InvalidateControlMso "WatermarkGallery"
      End If
    End Sub

    また、上記のようにマクロで制限を掛けたとしても、完璧に機能の実行を防ぐことは難しいため、運用で何とかできるのであれば、そちらでカバーすることも考えてみてはいかがでしょうか。
    • 回答としてマーク しーぷ 2018年3月22日 9:49
    2018年3月20日 1:13
  • ご回答頂きありがとうございました。

    こちらの制限と運用でカバーすることにしました。

    2018年3月22日 9:50