我正在尝试创建一个动态功能区控件,显示打开的工作簿列表。
我受到代码的启发,显示工作簿的工作表列表,这是有效的。
多次尝试后,我的控件打开一个仍为空白的列表。
Xml 代码。
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="customTab" label="FecXtools" insertBeforeMso="TabHome">
<group id="Navig" label="Navig">
<dynamicMenu id="ListeDynamiqueWb"
label="Liste Classeurs"
getContent="CreationMenuDynamiqueWb"
invalidateContentOnDrop="true"
size="normal"
imageMso="ChartShowData"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
VBA代码
Option Explicit
'Callback for ListeDynamique getContent
'Procédure pour construire le menu dynamique
Public Sub CreationMenuDynamiqueWB(ctl As IRibbonControl, ByRef content)
'ouverture de la balise menu
content = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
'liste les classeurs ouverts
content = content & Liste_WB(ActiveWorkbook)
'fermeture de la balise
content = content & "</menu>"
End Sub
Private Function Liste_WB(wb As Workbook) As String
Dim strTemp As String
'Dim wb As Workbook
' Insertion d'un titre de menu
strTemp = "<menuSeparator id=""Classeurs"" title=""Classeurs""/>"
' ajoute un bouton dans le menu pour chaque feuille du classeur
For Each wb In Application.Workbooks
strTemp = strTemp & _
"<button " & _
CreationAttribut("id", "Bt" & wb.Name) & " " & _
CreationAttribut("label", wb.Name) & " " & _
CreationAttribut("tag", wb.Name) & " " & _
CreationAttribut("onAction", "ActivationWB") & "/>"
Next
Liste_WB = strTemp
End Function
Sub activateWB(control As IRibbonControl)
wb(control.Tag).activate
End Sub
激活WB()
要激活从动态菜单中选择的工作簿,请使用 Workbook 对象的 Activate 方法...
Sub activateWB(control As IRibbonControl)
Workbooks(control.Tag).Activate
End Sub
包含CreationAttribut()
如果您还没有这样做,请确保包含 CreationAttribut()...
Function CreationAttribut(strAttribut As String, Donnee As String) As String
CreationAttribut = strAttribut & "=" & Chr(34) & Donnee & Chr(34)
End Function
Liste_WB()
首先,无需将活动工作簿传递给
Liste_WB
。所以我们可以去掉签名中的参数。其次,您错误地拼写了分配给按钮的宏。应该是activateWB
,而不是activationWB
。
Private Function Liste_WB() As String
Dim strTemp As String
Dim wb As Workbook
' Insertion d'un titre de menu
strTemp = "<menuSeparator id=""Classeurs"" title=""Classeurs""/>"
' ajoute un bouton dans le menu pour chaque feuille du classeur
For Each wb In Application.Workbooks
strTemp = strTemp & _
"<button " & _
CreationAttribut("id", "Bt" & wb.Name) & " " & _
CreationAttribut("label", wb.Name) & " " & _
CreationAttribut("tag", wb.Name) & " " & _
CreationAttribut("onAction", "activateWB") & "/>"
Next
Liste_WB = strTemp
End Function
如果您想从菜单中排除运行代码的工作簿,请尝试以下操作...
Private Function Liste_WB() As String
Dim strTemp As String
Dim wb As Workbook
' Insertion d'un titre de menu
strTemp = "<menuSeparator id=""Classeurs"" title=""Classeurs""/>"
' ajoute un bouton dans le menu pour chaque feuille du classeur
For Each wb In Application.Workbooks
If wb.Name <> ThisWorkbook.Name Then
strTemp = strTemp & _
"<button " & _
CreationAttribut("id", "Bt" & wb.Name) & " " & _
CreationAttribut("label", wb.Name) & " " & _
CreationAttribut("tag", wb.Name) & " " & _
CreationAttribut("onAction", "activateWB") & "/>"
End If
Next
Liste_WB = strTemp
End Function
CreationMenuDynamiqueWB()的 VBA 回调
调用
Liste_WB()
而不传递参数...
'Callback for ListeDynamique getContent
'Procédure pour construire le menu dynamique
Public Sub CreationMenuDynamiqueWB(ctl As IRibbonControl, ByRef content)
'ouverture de la balise menu
content = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
'liste les classeurs ouverts
content = content & Liste_WB()
'fermeture de la balise
content = content & "</menu>"
End Sub
最后,我做了两本练习册。
第一个不起作用,编辑了与功能区无关的不必要的代码,但它仍然不起作用。
第二个,通过复制功能区中的部分Xmsl代码,以及与工作簿1相同的VBA代码,在第二个工作簿中,它可以正常工作。
所以我猜它来自 XLSM 代码,但我不确定发生了什么
我想发布两本工作簿,但我在 stackoverflow 网站上没有看到该选项。
我将两本工作簿放在保管箱中。
https://www.dropbox.com/sh/ienihcrlzqw1cda/AADmKcIXGDUjFJhL0-vTessAa?dl=0