自定义功能区/打开工作簿的动态控制列表

问题描述 投票:0回答:2

我正在尝试创建一个动态功能区控件,显示打开的工作簿列表。

我受到代码的启发,显示工作簿的工作表列表,这是有效的。

多次尝试后,我的控件打开一个仍为空白的列表。

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
excel vba list dynamic ribbonx
2个回答
0
投票

激活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

0
投票

最后,我做了两本练习册。

第一个不起作用,编辑了与功能区无关的不必要的代码,但它仍然不起作用。

第二个,通过复制功能区中的部分Xmsl代码,以及与工作簿1相同的VBA代码,在第二个工作簿中,它可以正常工作。

所以我猜它来自 XLSM 代码,但我不确定发生了什么

我想发布两本工作簿,但我在 stackoverflow 网站上没有看到该选项。

我将两本工作簿放在保管箱中。

https://www.dropbox.com/sh/ienihcrlzqw1cda/AADmKcIXGDUjFJhL0-vTessAa?dl=0

© www.soinside.com 2019 - 2024. All rights reserved.