リボン関連

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

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

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

  2. Office関連

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

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

  3. Office関連

    右クリックから図形の配置 for Office 2013

    HPの掲示板に"右クリックから「配置」を実行できないか?"という質問が…

  4. Office関連

    リボンのタブを選択するVBAマクロ

    マクロでリボンのタブを選択する方法として、ActivateTabやAc…

  5. Office関連

    OfficeのコマンドID(コントロールID)リストがGitHubで公開されました。

    前回の記事でも触れていますが、メインストリームサポート期間内のOffi…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

Translate

最近の記事

アーカイブ

PAGE TOP