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

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

внутри поставь счетчик, проверяй остаток деления на 5, если 0 - то Sleep (SLEEP_INTERVAL)
...
Рейтинг: 0 / 0
22.08.2012, 12:10
    #37925999
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
Можно как-то так:
Код: 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
22.08.2012, 12:13
    #37926011
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
Shocker.Pro
Код: vbnet
1.
2.
3.
4.
Dim d As Date
d = DateAdd("s",5,Now)
Do While Now < d
Loop

сорри, в своем коде указал минуты, а не секудны
...
Рейтинг: 0 / 0
22.08.2012, 12:45
    #37926086
zanderman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
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
22.08.2012, 12:56
    #37926113
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
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
22.08.2012, 12:59
    #37926122
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
DoEvents можно добавить по желанию клиента, я лишь общий принцип написал
Antonariyто Sleep 5000 самый расово верный вариант.а почему бы не application.OnTime тогда?
...
Рейтинг: 0 / 0
22.08.2012, 13:15
    #37926159
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
Shocker.ProDoEvents можно добавить по желанию клиента, я лишь общий принцип написалА DoEvents дописать лень из принципа? Автор, задающий вопрос навроде "как сделать паузу" скорее всего "принцип" просто скопипастит. А потом задаст вопрос "почему скрипт грузит проц на 50%?".
Shocker.Proа почему бы не application.OnTime тогда?Потому что достоверно неизвестно, что скрипт работает в офисе.
...
Рейтинг: 0 / 0
22.08.2012, 13:16
    #37926164
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
AntonariyПотому что достоверно неизвестно, что скрипт работает в офисе.А где еще бывает VBA кроме офиса?
...
Рейтинг: 0 / 0
22.08.2012, 13:21
    #37926168
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
Shocker.ProAntonariyПотому что достоверно неизвестно, что скрипт работает в офисе.А где еще бывает VBA кроме офиса?В кореле, автокаде. У меня даже standalone.
А вообще я не заметил "VBA" в названии топика.
...
Рейтинг: 0 / 0
22.08.2012, 13:25
    #37926178
zanderman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пауза между итерациями в цикле. VBA
Antonariy,

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

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


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