Продолжение подсчета между подразделениями

#excel #vba

#excel #vba

Вопрос:

Я запускаю свой основной подраздел, который я хочу приостанавливать каждые 5 циклов на 10 секунд. Похоже, что мой код работает, но проблема, с которой я сталкиваюсь, заключается в том, что мои переменные подсчета (а именно j, i и n) сбрасывают свои значения после запуска подзаголовка pause.

Существует ли эффективный способ передачи текущих подсчетов после запуска подраздела, который находится внутри подраздела?

 Sub DataPopulation()
Dim count As Integer
Dim n As Integer
Dim i As Integer
Dim Total As Long
Dim j As Integer
i = 6
n = 7
Total = Cells(Rows.count, "A").End(xlUp).Row

For j = 7 To Total
If j Mod 5 = 0 Then
    Call Application.OnTime(Now   TimeValue("00:00:10"), "DataPopulation")
    Exit Sub
End If
Range("B" amp; i amp; ":" amp; "FO" amp; i).Select
Selection.AutoFill Destination:=Range("B" amp; i amp; ":" amp; "FO"     amp;n    ),Type:=xlFillDefault
n = n   1
i = i   1
Next j

End Sub
 

Комментарии:

1. вы можете использовать static для объявления переменных, которые «запоминают» их предыдущие значения

2. @Jochen — я пробовал Static n как целое число, Static i как целое число, Static Total как целое число, Static j как целое число, объявленное в начале подраздела DataPopulation, но, похоже, это все равно имеет тот же эффект

3. вам нужно немного изменить логику вашей программы. Смотрите мой ответ ниже.

Ответ №1:

Попробуйте следующее. Если у вас есть вопрос, просто спросите.

 Sub DataPopulation()
Static I As Integer
Dim Total As Long
Dim j As Integer

Total = Cells(Rows.count, "A").End(xlUp).Row
If I = 0 Or I >= Total Then I = 6


For j = 1 To 10
    If I >= Total Then Exit Sub
    Range("B" amp; I amp; ":" amp; "FO" amp; I).AutoFill Destination:=Range("B" amp; I amp; ":" amp; "FO" amp; I   1), Type:=xlFillDefault
    I = I   1
Next j
Call Application.OnTime(Now   TimeValue("00:00:10"), "DataPopulation")
End Sub
 

Комментарии:

1. Этот код, похоже, ничего не делает. Возможно, я выполняю его неправильно, но код, похоже, не вносит никаких изменений на листе

2. Код автоматически заполняет строки от ‘B’ до ‘FO’, начиная со строки 6, 10 раз в одну строку, приостанавливается на 10 секунд, следующие 10 строк

3. «рабочий код» — это тот же автофайл, который вы использовали в исходном коде

Ответ №2:

Попробуйте использовать Application.Wait function вместо Application.OnTime .

Ваш код будет выглядеть следующим образом:

 Sub DataPopulation()
Dim count As Integer
Dim n As Integer
Dim i As Integer
Dim Total As Long
Dim j As Integer
i = 6
n = 7
Total = Cells(Rows.count, "A").End(xlUp).Row

For j = 7 To Total
If j Mod 5 = 0 Then
    Application.Wait(Now   TimeValue("00:00:10")
    Exit Sub
End If
Range("B" amp; i amp; ":" amp; "FO" amp; i).Select
Selection.AutoFill Destination:=Range("B" amp; i amp; ":" amp; "FO"     amp;n    ),Type:=xlFillDefault
n = n   1
i = i   1
Next j

End Sub
 

Комментарии:

1. Поскольку я использую это с Bloomberg, существует известная проблема, связанная с тем, что запросы данных не выполняются с помощью приложения. Подождите, насколько я знаю

2. Приложение. ожидание останавливает все в Excel.