#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.