VBA 代码为 运行 时如何禁用功能区
How to disable ribbon while VBA code is running
如果代码已经 运行,我需要取消自定义功能区上的按钮点击。
问题:虽然我可以禁用按钮,但点击次数仍然是 'registered',即使禁用,每次按钮点击都会运行一次相应的代码。
Public Sub OnActionButton(control As IRibbonControl)
' The following approach fails to prevent code from running
If Not globalEnabled Then Exit Sub
' The following approach fails to prevent code from running
Dim goodToGo as Boolean
GetEnabled control, goodToGo
If Not goodToGo Then Exit Sub
' *********************************************************
' Code Below Here Should NOT Run If Button Was Clicked
' While globalEnabled = False (i.e. code already running)
' *********************************************************
' Disable the Ribbon
globalEnabled = False
RibbonInvalidate
Select Case control.id
Case "btnID"
' doSomething
End Select
' Re-enable the ribbon
globalEnabled = True
RibbonInvalidate
End Sub
编辑:为了它的价值,这就是我禁用按钮的方式:
Public Sub GetEnabled(control As IRibbonControl, ByRef enabled)
' Called by RibbonInvalidate
Select Case control.id
Case "btnID"
enabled = globalEnabled
End Select
End Sub
我可以想象第一次点击按预期运行,第二次点击(第一次点击对应的代码是运行时进行的)是'queued'直到第一次点击完成.那时 globalEnabled 再次为 True,因此检查无效。
我想我可以隐藏自定义功能区选项卡(或用虚拟选项卡替换它)——但这真的有必要吗?
有取消按钮按下的优雅方法吗?
编辑:
我可以在代码中添加一堆 doEvents,但速度太慢了。
编辑2:
如果我在代码执行期间显示一个消息框,那么出于某种原因,事情似乎按预期工作...
事实上...如果我显示消息框,那么我什至不需要提前退出逻辑 - 太奇怪了!
这行得通,主要是在末尾添加 doEvents(或消息框)。
Public Sub OnActionButton(control As IRibbonControl)
' Disable the Ribbon
globalEnabled = False
RibbonInvalidate
Select Case control.id
Case "btnID"
' doSomething
End Select
' Re-enable the ribbon
doEvents ' <-- Adding this fixed the issue for me
' msgbox "finished" ' <-- also works, but pretty annoying ;-)
globalEnabled = True
RibbonInvalidate
End Sub
我来晚了,但是您是否将 GlobalEnabled 声明为全局变量?因为根据我的理解和测试(在类似的问题上),如果它没有明确声明为全局,每次单击功能区按钮时,都会创建一个 GlobalEnabled 的局部变量,而不是使用之前 运行 中设置的值的宏。
如果代码已经 运行,我需要取消自定义功能区上的按钮点击。
问题:虽然我可以禁用按钮,但点击次数仍然是 'registered',即使禁用,每次按钮点击都会运行一次相应的代码。
Public Sub OnActionButton(control As IRibbonControl)
' The following approach fails to prevent code from running
If Not globalEnabled Then Exit Sub
' The following approach fails to prevent code from running
Dim goodToGo as Boolean
GetEnabled control, goodToGo
If Not goodToGo Then Exit Sub
' *********************************************************
' Code Below Here Should NOT Run If Button Was Clicked
' While globalEnabled = False (i.e. code already running)
' *********************************************************
' Disable the Ribbon
globalEnabled = False
RibbonInvalidate
Select Case control.id
Case "btnID"
' doSomething
End Select
' Re-enable the ribbon
globalEnabled = True
RibbonInvalidate
End Sub
编辑:为了它的价值,这就是我禁用按钮的方式:
Public Sub GetEnabled(control As IRibbonControl, ByRef enabled)
' Called by RibbonInvalidate
Select Case control.id
Case "btnID"
enabled = globalEnabled
End Select
End Sub
我可以想象第一次点击按预期运行,第二次点击(第一次点击对应的代码是运行时进行的)是'queued'直到第一次点击完成.那时 globalEnabled 再次为 True,因此检查无效。
我想我可以隐藏自定义功能区选项卡(或用虚拟选项卡替换它)——但这真的有必要吗?
有取消按钮按下的优雅方法吗?
编辑:
我可以在代码中添加一堆 doEvents,但速度太慢了。
编辑2:
如果我在代码执行期间显示一个消息框,那么出于某种原因,事情似乎按预期工作...
事实上...如果我显示消息框,那么我什至不需要提前退出逻辑 - 太奇怪了!
这行得通,主要是在末尾添加 doEvents(或消息框)。
Public Sub OnActionButton(control As IRibbonControl)
' Disable the Ribbon
globalEnabled = False
RibbonInvalidate
Select Case control.id
Case "btnID"
' doSomething
End Select
' Re-enable the ribbon
doEvents ' <-- Adding this fixed the issue for me
' msgbox "finished" ' <-- also works, but pretty annoying ;-)
globalEnabled = True
RibbonInvalidate
End Sub
我来晚了,但是您是否将 GlobalEnabled 声明为全局变量?因为根据我的理解和测试(在类似的问题上),如果它没有明确声明为全局,每次单击功能区按钮时,都会创建一个 GlobalEnabled 的局部变量,而不是使用之前 运行 中设置的值的宏。