Как отключить ленту во время работы кода VBA - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужно отменить нажатие кнопки на пользовательской ленте, если код уже запущен.

Проблема: хотя я могу отключить кнопку, щелчки по-прежнему «регистрируются» и, даже если они отключены, соответствующий код запускается один раз для каждого нажатия кнопки.

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

Я могу себе представить, что первый щелчок запускается, как и ожидалось, второй щелчок (который выполняется во время выполнения кода, соответствующего первому щелчку) помещается в очередь до завершения первого щелчка. В то время globalEnabled снова имеет значение True, поэтому проверки неэффективны.

Полагаю, я мог бы скрыть пользовательскую вкладку ленты (или заменить ее фиктивной вкладкой) - но действительно ли это необходимо?

Есть ли элегантный способ отменить нажатие кнопки?


Редактировать:

Я мог бы добавить кучу doEvents к коду, но слишком сильно тормозит.

Редактировать2:

Если я отображаю окно сообщения во время выполнения кода, то почему-то кажется, что все работает как положено ...

На самом деле ... если я отображаю окно сообщения, то мне даже не нужна логика раннего выхода - так странно!

1 Ответ

0 голосов
/ 15 ноября 2018

Это работает, главное было добавить 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
...