リボン関連

[リボン・カスタマイズ]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. Office関連

    Google TTSで文字列を読み上げるExcelアドイン

    前回の記事で書いたGoogle TTSで文字列を読み上げるマクロ(言語…

  2. Office関連

    Custom UI Editorの最新版がGitHubで公開されました。

    下記記事等で紹介している、リボンUIをカスタマイズするためのツール「C…

  3. Office関連

    [リボン・カスタマイズ]splitButton要素で大量にある項目を使いやすくまとめる。

    「既存の機能の代わりにマクロを実行する」でコメント(下記)をいただきま…

  4. Office関連

    Office 2013のコントロールIDリストが更新されました。

    「コントロールID 一覧(Office 2013)」でも紹介しているO…

  5. Office関連

    シート見出しの右クリックメニューから「コードの表示」を消す方法

    いつもお世話になっている「インストラクターのネタ帳」の管理人である伊藤…

  6. Word

    リボンからプリンタを選択して簡単に印刷できるようにする(Word)

    今回はdynamicMenu要素のgetContent属性のコールバッ…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP