Excel 未启用功能区宏

Excel Ribbon Macro not enabled

我们在许多 Excel 工作簿上都有自定义功能区。有时我们会收到来自 Excel 的错误消息,提示“_getEnabled”宏已禁用(见图)。对于使用宏来控制启用的 属性.
的每个功能区控件,都会出现此消息

功能区中的xml是(删除了一些名称):

<button id="name_btn" size="large" image="imagename" label="somelabel" getEnabled="VBA_####.######_getEnabled" onAction="VBA_####.######_onAction"/>

而 VBA 是:

Sub ######_getEnabled(control As IRibbonControl, ByRef returnedVal)
    returnedVal = CheckPermissions("SomeName")
End Sub

还有其他人看到过这个错误吗?当另一个工作簿是活动工作簿但 Excel 似乎正在尝试刷新包含代码的工作簿的功能区控件时,会出现错误消息。如前所述,这种情况偶尔会发生,我们还没有看到任何可识别的模式。

如果您在 VBA 中的一个回调(GetImage、GelLabel、GetEnabled 等)中设置断点,并且当代码中断时,您可以复制该行为并激活另一个工作簿。最后,当您继续 运行 代码(例如按 F5)时,将发生错误。

您可以使用功能区 .Invalidate 方法强制刷新功能区(如果您之前保存了功能区对象)。您可以通过定义 onLoad 回调来保存功能区对象:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="InitRibbon">

VBA中的这个:

Private moduleLevelRibbonObject As IRibbonUI

Public Sub InitRibbon(ribbon As IRibbonUI)
    Set moduleLevelRibbonObject = ribbon
End Sub

调用 moduleLevelRibbonObject.Invalidate 将刷新功能区(如果状态没有丢失 - 但那是另一个话题)。

我找到的快速修复。只需添加如下内容:

If Not ThisWorkbook Is ActiveWorkbook Then ThisWorkbook.Activate

您的所有回调,以便当回调 returns 给调用者时,正确的工作簿处于活动状态并且下一个回调被正确调用。最好在方法末尾 End Sub/Function 之前添加该行。示例:

Public Sub GetPressed(ctrl As IRibbonControl, ByRef isChecked As Variant)
    Select Case ctrl.ID
    Case "AdminMode"
        isChecked = IsAdminModeOn()
    Case Else
        Debug.Print "Toggle <" & ctrl.ID & "> does not have a return " _
            & "boolean for GetPressed!"
    End Select
    If Not ThisWorkbook Is ActiveWorkbook Then ThisWorkbook.Activate
End Sub