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
menu要素の中にdynamicMenu要素を入れるので、ワンクッション置く形にはなりますが、一応目的は達成できるのではないかと思います。
この記事へのコメントはありません。