VBA для предотвращения запуска события изменения, если другое событие изменения срабатывает - PullRequest
3 голосов
/ 28 марта 2012

это может быть невозможно решить в VBA, но я хотел бы увидеть, что вы, эксперты, должны сказать по этому поводу.

У меня есть текстовое поле в пользовательской форме, которое вызывает макрос в TextBox1_Change ()type sub.

Если пользователь вводит «ABC» в текстовое поле, макрос запускается 3 раза: один раз для «A», один раз для «AB» и один раз для «ABC».Этот макрос на самом деле довольно тяжелый, поэтому я хотел бы, чтобы он запускался только тогда, когда пользователь фактически закончил печатать, а не между отдельными нажатиями клавиш.

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

Итак, у меня возникла идея заставить событие изменения ждать и посмотреть, не произойдет ли другое изменение.событие запускается, скажем, через 1 секунду после первого.Если это произойдет, первое событие изменения прерывается.

Теперь это будет работать, и я думаю, что я знаю, как его кодировать, за исключением того, что я не знаю, как дать пользователю возможность продолжать печатать дажекогда запускается первое событие изменения.

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

Ребята, вы видите мою проблему здесь?Как бы вы пошли об этом?Есть ли шанс, что я смогу достичь желаемых результатов?

Любая помощь очень ценится, спасибо, ребята!

1 Ответ

4 голосов
/ 28 марта 2012

Я проверил следующее, и оно работает (при условии, что я правильно понимаю, что вы пытаетесь сделать).

В модуле кода напишите это:

Public aRunIsScheduled As Boolean
Public nextRunTime As Variant

Sub MyMacro()
    'Flag macro as having been run, no longer scheduled.
    aRunIsScheduled = False

    'Place your macro code here.
    'I'll just use some dummy code:
    MsgBox "MyMacro is running!"

End Sub

В вашем модуле листа:

Private Sub CommandButton1_Click()

    If aRunIsScheduled Then
        ' Cancel the previously scheduled run.
        Application.OnTime EarliestTime:=nextRunTime, _
            Procedure:="MyMacro", Schedule:=False
        aRunIsScheduled = False
    End If

    ' Schedule a new run 3 seconds from now:
    nextRunTime = Now + TimeValue("00:00:03")
    Application.OnTime EarliestTime:=nextRunTime, _
            Procedure:="MyMacro", Schedule:=True
    aRunIsScheduled = True

End Sub

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

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