【发布时间】:2018-09-28 10:52:07
【问题描述】:
我正在编写一个使用 SAP 的 BusinessObjects Analysis 插件的 Excel 工作簿。每当工作簿打开时,都会触发变量选择提示,并允许用户输入值,然后用于从后端选择数据并在 Excel 中以表格格式显示(Excel 中 SAP BW 查询的表示形式)。我面临的问题是以下...
每当提示选择完成并且正在处理选择时,如果您单击工作表选项卡发送垃圾邮件,则会触发Worksheet.Activate 事件。问题是Worksheet.Activate 处理程序试图使本身尚未设置的功能区对象无效。我想防止这种情况发生,并且我希望仅在已设置功能区后才使功能区无效。问题是在更改工作表时必须使功能区无效,以便它加载功能区中每个工作表唯一的特定按钮。在激活工作表时不失效不是一种选择。最好在我们的自定义功能区加载之前消除更改工作表的可能性。
这是我尝试过但没有成功的方法:
-
我尝试在提示出现后立即禁用与
Application.Interactive = False的交互模式,并在执行AOCust_OnLoad(ribbon As IRibbonUI)功能区onLoad回调并设置功能区时重新启用它。 我尝试在提示出现后立即使用
Application.EnableEvents = False禁用所有事件,并在执行功能区onLoad回调并设置功能区时重新启用它们。-
我尝试将以下内容添加到
Worksheet.Activate回调中,但它永远不会退出可能预期的无限循环,因为功能区 onLoad 不是系统事件,因此永远不会触发。while ribbon is Nothing 'waiting for ribbon onload to fire and set the value DoEvents wend
第二种情况令人惊讶的是,当事件被禁用时,Worksheet.Activate 事件是如何被触发的。
您知道如何解决此问题,以便用户在设置功能区之前无法更改工作表吗?
如果您希望我在此描述中添加代码 sn-ps,请告诉我。
谢谢
编辑 - 添加代码
在 ThisWorkbook 中的 Microsoft Excel 对象中
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If EnableEvents = True Then
Debug.Print "invalidate"
Call AOCust_Callbacks.AOCust_InvalidateRibbon
End If
End Sub
在“Custom_Ribbon”模块中
'Callback for Selections data onAction
Sub PROMPT(control As IRibbonControl)
EnableEvents = False
'more prompt-related code
End Sub
在模块“AOCust_Callbacks”中
Public EnableEvents As Boolean
'Callback for Ribbon OnLoad
Sub AOCust_OnLoad(ribbon As IRibbonUI)
Debug.Print "setting the ribbon"
'Start Highlighting for Workbook
StartHighlighting
Set AOCustRibbon = ribbon
Debug.Print "the ribbon is now set"
EnableEvents = True
End Sub
当我在提示选择完成并且选择仍在处理时立即单击工作表选项卡时,我不再遇到由于 if 语句而尝试使功能区无效时未设置变量的问题,但问题是没有执行加载功能区功能。
【问题讨论】:
-
我没有在您的代码中看到您设置
Application.EnableEvents = False的位置。拥有一个全局变量EnableEvents不是一回事。 -
是的,我知道。在发布 sn-ps 之前,我已经删除了该代码。
标签: vba excel business-objects