リボン関連

[リボン・カスタマイズ]splitButton要素の内容を動的に変更する。

3年ほど前に書いた記事「menu内にあるbuttonの数を増やす」にコメントをいただきました。

増やしたのはdynamicMenuの子であって
Menuの子じゃないですよね。
splitButton内のmenuの子を増やす方法を探していたので
タイトルと違う内容だったのが残念です

たしかに取り扱っている内容はdynamicMenu要素なんですが、getContent属性のコールバックでmenu要素を動的に読み込んで、menu要素の子要素であるbutton要素を増やしていく、といったことを行っているのが上記記事です。

カスタマイズしたリボンを動的に変更する場合によく使うのがgetVisible属性getEnabled属性、そしてdynamicMenu要素の属性であるgetContent属性です。

単純に要素を表示したり非表示にしたり、有効・無効を切り替えたりする程度であればgetVisible属性やgetEnabled属性のコールバックだけで十分に処理することができますが、それ以上にカスタマイズを行いたい場合は、通常getContent属性のコールバックで処理することになります。

今回いただいたコメント、splitButton要素の子要素についても、menu要素の子要素の表示・非表示、有効・無効を切り替える程度で対応できないのであれば、下記のようにmenu要素の子要素としてdynamicMenu要素を設定することで、動的に子要素を変更することができるようになります。

[リボン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">
          <splitButton id="slbSample" size="large">
            <button id="btnSample" label="Button増加" imageMso="PlusSign" onAction="btnSample_onAction" />
            <menu id="mnuSample" itemSize="large">
              <dynamicMenu id="dmuSample" label="Sample Menu" imageMso="HappyFace" getContent="dmuSample_getContent" />
            </menu>
          </splitButton>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

[標準モジュール]

Option Explicit

Private myRibbon As Office.IRibbonUI
Private d As Object

Private Sub rbnSample_onLoad(ribbon As IRibbonUI)
  Dim elmButton As Object
  Dim elmMenu As Object
  
  Set myRibbon = ribbon
  
  'XML初期設定
  Set d = CreateObject("Msxml2.DOMDocument")
  Set elmMenu = d.createElement("menu")
  elmMenu.setAttribute "xmlns", "http://schemas.microsoft.com/office/2006/01/customui"
  elmMenu.setAttribute "itemSize", "large"
  Set elmButton = d.createElement("button")
  elmButton.setAttribute "id", "btnChild1"
  elmButton.setAttribute "label", "Child Button1"
  elmButton.setAttribute "imageMso", "MicrosoftExcel"
  elmButton.setAttribute "onAction", "btnChild_onAction"
  elmMenu.appendChild elmButton
  d.appendChild elmMenu
End Sub

Private Sub btnSample_onAction(control As IRibbonControl)
'button要素増加
  Dim num As Long
  Dim n As Object
  
  num = d.getElementsByTagName("button").Length
  Set n = d.createNode(1, "button", d.DocumentElement.NamespaceURI)
  With d.DocumentElement.appendChild(n)
    .setAttribute "id", "btnChild" & num + 1
    .setAttribute "label", "Child Button" & num + 1
    .setAttribute "imageMso", "MicrosoftExcel"
    .setAttribute "onAction", "btnChild_onAction"
  End With
  myRibbon.InvalidateControl "dmuSample"
End Sub

Private Sub btnChild_onAction(control As IRibbonControl)
  MsgBox control.ID, vbInformation + vbSystemModal
End Sub

Private Sub dmuSample_getContent(control As IRibbonControl, ByRef returnedVal)
  returnedVal = d.XML
End Sub

dynamicMenu_getContent_01

menu要素の中にdynamicMenu要素を入れるので、ワンクッション置く形にはなりますが、一応目的は達成できるのではないかと思います。

ファイルをブックに埋め込むExcelマクロ前のページ

JavaのGUIDを取得するVBAマクロ次のページ

関連記事

  1. Office関連

    Office 2016のコントロールIDリストが公開されました。

    昨年の秋にリリースされたOffice 2016。そのコントロールI…

  2. リボン関連

    Office Ribbon Editorはウィルス?

    私のHP「Office Ribbon Editorの紹介」でも紹介して…

  3. Office関連

    Office XP Developer Toolsでリボン対応のCOMアドインを作成する。

    「Visual Basic 6でリボン対応のアドインを作成する」ではV…

  4. リボン関連

    続・Office Ribbon Editorがダウンロード出来ない?

    「Office Ribbon Editorがダウンロード出来ない?」で…

  5. Office関連

    YouTube動画挿入アドイン for PowerPoint

    前回の記事でPowerPoint 2013でYouTubeの動画が挿入…

  6. リボン関連

    複数のtoggleButton要素の中から1つだけしかオンにできないようにする(2)

    「複数のtoggleButton要素の中から1つだけしかオンにできない…

コメント

  1. この記事へのコメントはありません。

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

Time limit is exhausted. Please reload CAPTCHA.

Translate

Chinese (Simplified)Chinese (Traditional)EnglishFrenchGermanJapaneseKoreanRussianSpanish

最近の記事

アーカイブ

PAGE TOP