Время ожидания приложения - PullRequest
1 голос
/ 12 апреля 2020

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

Этот бит в порядке и работает

Dim i As Integer
Dim Response As Integer
Sheets("Sheet3").Range("Z1").Value = "01:00:00" 'will place 1hr wait time in Sheet3 Z1
t = CStr(Range("Z1"))
Application.Wait (Now + TimeValue(t))

У меня затем есть CommandButton2 в моей пользовательской форме, которая сбрасывает время ожидания с 1 часа ожидания до 2 секунд. В теории это должно затем возобновить код с того места, где он остановился. Время ожидания находится между IE открытием и загрузкой и FOR EACH l oop, работающим , поэтому после его возобновления действие FOR EACH l oop код.

Sheets("Sheet3").Range("Z1").Value = "00:00:02" `Reset time to 2 sec from 1hr

МОЯ ПРОБЛЕМА

Я не могу нажать кнопку 2, когда время ожидания истекло. Есть ли способ, которым я мог бы сделать это так, чтобы, когда код времени ожидания работал, button2 все еще был включен для использования?

BACKGROUND

Пользователь нажимает кнопку command1 и запускается код , IE откроется и перейдет на правильную страницу. СЕЙЧАС код ждет . Так как это дает пользователю время выбирать из нескольких вариантов (слишком много, чтобы вставить код). После этого пользователь нажимает вторую кнопку команды, которая сбрасывает код до 2se c, и они могут извлечь свою информацию. Теоретически это должно продолжаться, однако я не могу нажать на вторую кнопку, пока выполняется код ожидания. Есть ли обходной путь?

Я пытался разделить код на подпрограммы, но у меня было несколько сообщений об ошибках, и я отказался от этого метода. Я посмотрел на doEvent l oop, но я ограничен в кодировании и не был уверен, как он будет работать, и если он продолжит код ИЛИ , начните с самого начала . Начиная с самого начала, я не хочу этого делать.

Заранее спасибо.

ПОСЛЕ РЕДАКТИРОВАНИЯ Это код сейчас, не уверен на 100%, если это правильно, теперь он позволяет мне изменять значение Z1 с помощью кнопки 2, но FOR L OOP не работает

До

1hr wait time

После нажатия кнопки 2

2sec wait time

'#################### APPLICATION WAIT ################
Dim i As Integer
Dim Response As Integer
Sheets("Sheet3").Range("Z1").Value = "01:00:00" 'will place the 1hr wait time in Sheet3 Z1
t = CStr(Range("Z1"))
'Application.Wait (Now + TimeValue(t)) 'commented out or it freezes excel
WaitUntil = Now + TimeValue(t)
Do While Now <= WaitUntil
    DoEvents
Loop
'#################### APPLICATION WAIT ################

    'FOR LOOP
    For Each element In elements
      DoEvents
    ```

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Application.Wait() приостанавливает работу всего приложения, а не только вашего кода. Вы должны быть в состоянии достичь ожидаемого результата, используя al oop с DoEvents:

...
WaitUntil = Now + TimeValue(t)
Do While Now <= WaitUntil
    DoEvents
Loop
...

EDIT: DoEvents l oop не работает, потому что вы установили значение t только один раз, поэтому, когда ваша кнопка2 изменяет значение Z1 на 00:00:02, значение t все еще равно 01:00:00. Чтобы это исправить, вы можете сбросить значение t внутри l oop:

...
WaitUntil = Now + TimeValue(t)
Do While Now <= WaitUntil
    DoEvents
    If t <> CStr(Range("Z1")) Then 'If value of Z1 changed, update t
        t = CStr(Range("Z1"))
        WaitUntil = Now + TimeValue(t)
    End If
Loop
...
0 голосов
/ 12 апреля 2020

Мне удалось решить проблему, если кому-то это понадобится в будущем, это обходной путь. Также большое спасибо Кириллу Ткаченко за то, что он поставил меня на правильный путь

Я сделал это с DoWhile L oop. Эта часть кода переместилась между браузером (IE) полностью загруженным и перед FOR EACH L OOP, затем этот код срабатывает.

КОД

  • Устанавливает время ожидания 1 час в Z1, затем запускается команда DoWhile l oop.

  • При нажатии на кнопку 2 Время изменяется на 3se c, и лист пересчитывает
    столбец Z.

  • Тогда если оператор вступает в действие, и, как утверждает DoWhile, время должно быть больше 3se c, а Z1 теперь равно 2se c, GOto запускается следующим и переходит к метке I
    , созданной, чтобы сообщить коду, что здесь следует начинать. Это как раз перед тем, как FOR
    EACH l oop

'#################### APPLICATION WAIT ################
Dim i As Integer
Dim Response As Integer
Sheets("Sheet3").Range("Z1").Value = "01:00:00" 'will place the 1hr wait time in Sheet3 Z1
t = CStr(Range("Z1"))
    WaitUntil = Now + TimeValue(t)

Do While Now > "00:00:03"
Sheets("Sheet3").Columns("Z").Calculate

If Sheets("Sheet3").Range("Z1").Value = "00:00:02" Then
        GoTo StartForLoop_Restart ' use GOTo command and label to reinitiate the sub
End If
DoEvents
Loop
'#################### APPLICATION WAIT ################


'Restart the code HERE, this is the key part
StartForLoop_Restart:

    'FOR LOOP
    For Each element In elements
      DoEvents

Это то, что я вставил в Button2

 Sheets("Sheet3").Range("Z1").Value = "00:00:02"
 Sheets("Sheet3").Columns("Z").Calculate

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

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