リボン関連

[リボン・カスタマイズ]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要素を入れるので、ワンクッション置く形にはなりますが、一応目的は達成できるのではないかと思います。

関連記事

  1. リボン関連

    PowerShellからリボンUIを呼ぶ方法

    下記記事で簡易的なUIとして手軽なHTAを使いました。…

  2. Office関連

    [リボン・カスタマイズ]ユーザー名により表示するメニューを切り替える。

    今回はリボンをカスタマイズして、ファイルを開いたユーザー名によって表示…

  3. Office関連

    [リボン・カスタマイズ]グループの表示・非表示をトグルボタンで切り替える。

    数年前に書いた記事に下記コメントをいただきました。Excelに…

  4. Office関連

    Office 2016で“ヤツ”を召喚してみた。

    4月1日にMicrosoft Office公式アカウント、MSOffi…

  5. Office関連

    [VBA]CommandBars(“○○”).Controls.Addでメニ…

    Officeのユーザインタフェースがリボンに変わってから、下記のように…

  6. Office関連

    A1セルを選択してから保存するExcelアドイン

    @yu_tang_さんのツイートで面白いものがありました。…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP