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
我们在许多 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