powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пауза между итерациями в цикле. VBA
21 сообщений из 21, страница 1 из 1
Пауза между итерациями в цикле. VBA
    #37925979
zanderman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть скрипт, который отправляет письма по почте
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Sub SendMail()
    
    If MsgBox("Send?", vbOKCancel, "?") = vbCancel Then Exit Sub
    Dim iMsg As CDO.Message
    Set iMsg = New CDO.Message
    iMsg.Configuration.Fields(cdoSendUsingMethod) = 2
    iMsg.Configuration.Fields(cdoSMTPServer) = ""
    iMsg.Configuration.Fields(cdoSMTPServerPort) = 25
    iMsg.Configuration.Fields(cdoSMTPAuthenticate) = 0
    iMsg.Configuration.Fields.Update
    iMsg.Subject = "" & Date - 1 & " " & Range("Text_field")
    iMsg.From = "Report@danone.com"
    For Each c In Range("GSM")
        If IsEmpty(c) Then Exit For
        iMsg.To = c
        iMsg.TextBody = "Bla bla bla"
            iMsg.Send
           
    Next c
  
    Set iMsg = Nothing
    
    Columns("L:L").ColumnWidth = 0#
    MsgBox "Mail sent"
End Sub



Подскажите, как сделать в цикле таймаут, чтобы письма уходили пачками на скажем 5 адресов через каждый 5 секунд.
Всего адресатов около 30-40.
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37925993
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
Dim d As Date
d = DateAdd("m",5,Now)
Do While Now < d
Loop
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37925996
QValD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zanderman,

внутри поставь счетчик, проверяй остаток деления на 5, если 0 - то Sleep (SLEEP_INTERVAL)
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37925999
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно как-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
nCounter = 0
For ...
...
    nCounter = nCounter + 1
    If nCounter Mod 5 = 0 THen
        nCounter = 0
        nTimer = Timer
        While Timer < nTimer + 5
            DoEvents
        Wend
    End If
Next
...
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926011
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Код: vbnet
1.
2.
3.
4.
Dim d As Date
d = DateAdd("s",5,Now)
Do While Now < d
Loop

сорри, в своем коде указал минуты, а не секудны
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926086
zanderman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMМожно как-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
nCounter = 0
For ...
...
    nCounter = nCounter + 1
    If nCounter Mod 5 = 0 THen
        nCounter = 0
        nTimer = Timer
        While Timer < nTimer + 5
            DoEvents
        Wend
    End If
Next
...



Что то такой вариант не отрабатываен

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Sub SendMail()
    
    If MsgBox("Send?", vbOKCancel, "?") = vbCancel Then Exit Sub
    Dim iMsg As CDO.Message
    Set iMsg = New CDO.Message
    iMsg.Configuration.Fields(cdoSendUsingMethod) = 2
    iMsg.Configuration.Fields(cdoSMTPServer) = ""
    iMsg.Configuration.Fields(cdoSMTPServerPort) = 25
    iMsg.Configuration.Fields(cdoSMTPAuthenticate) = 0
    iMsg.Configuration.Fields.Update
    iMsg.Subject = "" & Date - 1 & " " & Range("Text_field")
    iMsg.From = ""
    nCounter = 0
    For Each c In Range("GSM")
        If IsEmpty(c) Then Exit For
        iMsg.To = c
        iMsg.TextBody = "Bla bla bla" 
            iMsg.Send
        nCounter = nCounter + 1
        If nCounter Mod 2 = 0 Then
        nCounter = 0
        nTimer = Timer
        While Timer < nTimer + 5
            DoEvents
        Wend
    End If
    Next c
        Set iMsg = Nothing
       Columns("L:L").ColumnWidth = 0#
    MsgBox "Mail sent"
End Sub
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926113
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShocker.Pro
Код: vbnet
1.
2.
3.
4.
Dim d As Date
d = DateAdd("s",5,Now)
Do While Now < d
Loop

сорри, в своем коде указал минуты, а не секудныДичь! Анафема! Целых пять секунд жарить проц пустым циклом! Даже DoEvents нету.

Если у скрипта нет интерфейса, то Sleep 5000 самый расово верный вариант.
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926122
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoEvents можно добавить по желанию клиента, я лишь общий принцип написал
Antonariyто Sleep 5000 самый расово верный вариант.а почему бы не application.OnTime тогда?
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926159
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProDoEvents можно добавить по желанию клиента, я лишь общий принцип написалА DoEvents дописать лень из принципа? Автор, задающий вопрос навроде "как сделать паузу" скорее всего "принцип" просто скопипастит. А потом задаст вопрос "почему скрипт грузит проц на 50%?".
Shocker.Proа почему бы не application.OnTime тогда?Потому что достоверно неизвестно, что скрипт работает в офисе.
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926164
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПотому что достоверно неизвестно, что скрипт работает в офисе.А где еще бывает VBA кроме офиса?
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926168
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyПотому что достоверно неизвестно, что скрипт работает в офисе.А где еще бывает VBA кроме офиса?В кореле, автокаде. У меня даже standalone.
А вообще я не заметил "VBA" в названии топика.
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926178
zanderman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Скрипт работает в Office.
Это уж точно)
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926190
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProА где еще бывает VBA кроме офиса?Да хоть в своём приложении - при наличии VBA SDK (и лицензии).
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926210
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что, не во всех VBA есть Application.OnTime?
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926221
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИ что, не во всех VBA есть Application.OnTime? Application это объект офиса, а не VBA. Что в этом смешного?
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926225
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто день сегодня веселый. Я, пожалуй, покину дискуссию )
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926379
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoEvents - фтопку. Кривой костыль. Достаточно посмотреть на потребление процессора.
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926473
QValD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я победил? :D
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926810
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл такое решение, и процессор отдыхает

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Declare Function WaitMessage Lib "user32.dll" () As Long

Public Sub SleepVB(Seconds)
  ' ожидание Seconds секунд
  Dim Start
  Start = Timer   ' текущее время в секундах
  Do While Timer < Start + Seconds
    ' обеспечивает параллельное выполнение других процессов
    WaitMessage ' ждем сообщения
    DoEvents ' обрабатываем
  Loop
End Sub

Sub T()
    SleepVB 5
    MsgBox "END"
End Sub
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926911
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WaitMessage - хорошо! Без него цикл с DoEvents крутится ~миллион раз, с ним ~100 раз.
Только бы не запустить такую паузу между 23:59:55 и 0:00:00
...
Рейтинг: 0 / 0
Пауза между итерациями в цикле. VBA
    #37926924
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КазанскийТолько бы не запустить такую паузу между 23:59:55 и 0:00:00 По этому поводу Shocker.Pro выдал пример...
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пауза между итерациями в цикле. VBA
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]