Предотвратить многократное нажатие кнопки команды во время итерации - PullRequest
1 голос
/ 08 февраля 2020

Я создаю макрос Excel, который будет запускаться при нажатии командной кнопки (VBA 7.1) и не позволит пользователю нажимать несколько раз во время выполнения, однако каждый трюк, который я обнаружил в Интернете с этой целью, не имеет работал: даже когда он заблокирован, отключен и фокусируется на другом объекте, пользователь все равно может заставить сабвуфер запускаться несколько раз, прежде чем первый завершится.

Мой текущий код выглядит следующим образом (run_slow_macro открывает документ Word для внесения изменений, затем сохраняет его и может занять около 30 секунд.)

Private Sub CommandButton1_Click()

    If CommandButton1.Enabled = False Then
        MsgBox ("STOP CLICKING")
    End If

    Me.Frame1.SetFocus
    CommandButton1.Enabled = False
    CommandButton1.Locked = True
    CommandButton1.Caption = "WAIT"

    Call run_slow_macro

    CommandButton1.Caption = "CommandButton1"
    CommandButton1.Enabled = True
    CommandButton1.Locked = False


End Sub

Когда я нажимаю кнопка блокируется и становится отключенной, а заголовок изменяется, как и ожидалось. Однако последующие щелчки не приводят к появлению окна сообщения «STOP CLICKING», но все же приводят к тому, что документ Word открывается несколько раз, редактируется, а затем закрывается.

Командная кнопка не разблокируется / не активируется до тех пор, пока после все выполнения не будут завершены, и никогда не появится сообщение «STOP CLICKING».

Я очень смущен, поскольку к тому, как он выполняет «Call run_slow_macro» каждый раз, но, кажется, пропускает все до и после этой строки, когда выполняется первое выполнение.

У меня очень мало опыта работы с VBA, и я не смог найти каких-либо решений в Интернете (приведенный выше код является кульминацией самой распространенной рекомендации, которую я видел), поэтому я ценю любые советы, которые можно предложить .

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Это должно отключить выполнение макроса до его завершения. Прочитайте комментарии к коду.

Убедитесь, что я использую переменную, определенную как HasStarted в run_slow_macro, чтобы сообщить командной кнопке, что она должна выйти, пока макрос не завершен.

Option Explicit

' This variable should be declared at the top of the module
Private HasStarted As Boolean

Private Sub CommandButton1_Click()

    If HasStarted = True Then Exit Sub

    Me.Frame1.SetFocus
    CommandButton1.Enabled = False
    CommandButton1.Locked = True
    CommandButton1.Caption = "WAIT"

    Call run_slow_macro

    CommandButton1.Caption = "CommandButton1"
    CommandButton1.Enabled = True
    CommandButton1.Locked = False

End Sub

Public Sub run_slow_macro()

    HasStarted = True

    ' Do something

    HasStarted = False

End Sub

Дайте мне знать, если это работает

0 голосов
/ 08 февраля 2020

Посмотрите на следующее. Я думаю, что у вас есть ваш ответ.

Заморозить редактирование Excel, пока работает VBA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...