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 的局部变量,而不是使用之前 运行 中设置的值的宏。