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

















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