Страницы: 1
RSS
Макрос автоматической отправки писем при открытии книги
 
Всем привет!
Есть код, отправки писем через оутлук, спасибо The Prist,
Option Explicit
Код
Sub Send_Mail_Mass()
    Dim objOutlookApp As Object, objMail As Object
    Dim lr As Long, lLastR As Long

    Application.ScreenUpdating = False
    On Error Resume Next
    Set objOutlookApp = CreateObject("Outlook.Application")
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    objOutlookApp.Session.Logon

    lLastR = Cells(Rows.Count, 1).End(xlUp).Row 'определяем последнюю заполненную ячейку в столбце А
    'цикл от второй строки(начало данных с адресами) до последней ячейки таблицы
    For lr = 2 To lLastR
        Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
        'создаем сообщение
        With objMail
            .to = Cells(lr, 1).Value 'адрес получателя
            .Subject = Cells(lr, 2).Value 'тема сообщения
            .Body = Cells(lr, 3).Value 'текст сообщения
            .Attachments.Add Cells(lr, 4).Value
            .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
        End With
    Next lr

    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub
есть ещё один код, обновления запроса в книге
Код
Sub Макрос1()
' Макрос1 Макрос
    ActiveWorkbook.RefreshAll
End Sub

пытаюсь организовать следующую схему запуска макросов:

1. открывается книга
2. запускается Макрос1 (обновление запросов)
3. и только после обновления запроса , запускается Send_Mail_Mass (отправка писем)
4. после книга сохраняется и закрывается

пробовал вот этот код
Код
Private Sub Workbook_Open()' 
"Сюда вставляю коды"
End Sub
но не выходит.
 
Ну у меня на код написан на листе "эта книга", и корректно отрабатывает. Попробуйте туда прописать.
А далее через функцию Call запускать другие макросы поочерёдно.
Изменено: Ametist69 - 10.09.2019 11:06:06
 
Ametist69, ок спасибо попробую
 
Цитата
Ametist69 написал:
у меня на код написан на листе "эта книга",
Это не лист. Это модуль ))
Цитата
adamm написал:
пытаюсь организовать следующую схему запуска макросов
в модуль книги:
Код
Private Sub Workbook_Open()
    Call Макрос1
    Call Send_Mail_Mass
End Sub
А процедуры Макрос1 и Send_Mail_Mass держите в стандартном (общем) модуле.
 
Почитал про call, но мои попытки не дали результата, что получилось:
создал модуль в нем разместил макросы
Код
Sub Макрос1()

' Макрос1 Макрос
    ActiveWorkbook.RefreshAll
End Sub


Sub Send_Mail_Mass()
    Dim objOutlookApp As Object, objMail As Object
    Dim lr As Long, lLastR As Long

    Application.ScreenUpdating = False
    On Error Resume Next
    Set objOutlookApp = CreateObject("Outlook.Application")
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    objOutlookApp.Session.Logon

    lLastR = Cells(Rows.Count, 1).End(xlUp).Row 'определяем последнюю заполненную ячейку в столбце А
    'цикл от второй строки(начало данных с адресами) до последней ячейки таблицы
    For lr = 2 To lLastR
        Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
        'создаем сообщение
        With objMail
            .to = Cells(lr, 1).Value 'адрес получателя
            .Subject = Cells(lr, 2).Value 'тема сообщения
            .Body = Cells(lr, 3).Value 'текст сообщения
            .Attachments.Add Cells(lr, 4).Value
            .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
        End With
    Next lr

    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub

в другом модуле прописал следующее:
Код
Sub MacroMain()
Call Макрос1
Call Send_Mail_Mass
End Sub
выдавало ошибку, после книга вооще закрылась. Так же прописывал код и на листе "ЭтаКнига", выдает ошибку. Возможно это происходит из-за того, что обновление запроса тянется до 30 сек, и в это время отрабатывает код отправки письма?
 
Цитата
adamm написал:
Так же прописывал код и на листе "ЭтаКнига
Да не лист это, а модуль. Давайте уже придерживаться правильных формулировок.
Про запрос Вы раньше ничего не говорили. Что за запрос? Попробуйте без него вариант из #4.
 
Про запрос я писал
Цитата
adamm написал:
2. запускается Макрос1 (обновление запросов)

по совету Ametist69, поместил код в "ЭтаКнига" все работает:
Код
Private Sub Workbook_Open()
Dim objOutlookApp As Object, objMail As Object
    Dim lr As Long, lLastR As Long

    Application.ScreenUpdating = False
    On Error Resume Next
    Set objOutlookApp = CreateObject("Outlook.Application")
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    objOutlookApp.Session.Logon

    lLastR = Cells(Rows.Count, 1).End(xlUp).Row 'определяем последнюю заполненную ячейку в столбце А
    'цикл от второй строки(начало данных с адресами) до последней ячейки таблицы
    For lr = 2 To lLastR
        Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
        'создаем сообщение
        With objMail
            .to = Cells(lr, 1).Value 'адрес получателя
            .Subject = Cells(lr, 2).Value 'тема сообщения
            .Body = Cells(lr, 3).Value 'текст сообщения
            .Attachments.Add Cells(lr, 4).Value
            .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
        End With
    Next lr

    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub


но не получается выполнить последовательно работу двух макросов с функцией call
то есть, при открытии книги, сначала отрабатывает Макрос 1, потом макрос отправки писем

суть вопроса: есть таблица, которая обновляется через запрос в power qwerty, после её обновления автоматом должны улететь письма
Изменено: adamm - 10.09.2019 13:04:12
 
Цитата
adamm написал: поместил код в "ЭтаКнига" все работает
Это не совсем правильно: модуль книги предназначен в основном для событийных процедур.

Цитата
adamm написал: при открытии книги, сначала отрабатывает Макрос 1, потом макрос отправки писем
Вы вариант из #4 пробовали?
 
Разобрался ,поместил все в модуль "ЭтаКнига"
Код
Private Sub Workbook_Open()

Call Макрос1
Call Send_Mail_Mass


End Sub
Sub Send_Mail_Mass()
Dim objOutlookApp As Object, objMail As Object
    Dim lr As Long, lLastR As Long

    Application.ScreenUpdating = False
    On Error Resume Next
    Set objOutlookApp = CreateObject("Outlook.Application")
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    objOutlookApp.Session.Logon

    lLastR = Cells(Rows.Count, 1).End(xlUp).Row 'определяем последнюю заполненную ячейку в столбце А
    'цикл от второй строки(начало данных с адресами) до последней ячейки таблицы
    For lr = 2 To lLastR
        Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
        'создаем сообщение
        With objMail
            .to = Cells(lr, 1).Value 'адрес получателя
            .Subject = Cells(lr, 2).Value 'тема сообщения
            .Body = Cells(lr, 3).Value 'текст сообщения
            .Attachments.Add Cells(lr, 4).Value
            .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
        End With
    Next lr

    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub
Sub Макрос1()

' Макрос1 Макрос

    ActiveWorkbook.RefreshAll
End Sub
но опять,НО макрос отправки писем срабатывает, раньше, чем обновляется запрос, помню была функция задержки, поищу в гугле

Юрий М, извените пропустил вашу подсказку из #4, но почти так и сделал, осталось притормозить макрос отпарки писем
Изменено: adamm - 10.09.2019 13:24:58
 
Цитата
adamm написал:
макрос отправки писем срабатывает, раньше
RefreshAll вроде бы не имеет аргументов и может обновляться в фоне, что делает невозможным нормально отследить его полное завершение. Поищите по форуму по ключевым словам "дождаться обновления" -  может подцепите чего нужного.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
adamm, можно так. название запроса(Запрос — Запрос2) смотреть в Данные->подключения->имя
Код
Private Sub Workbook_Open()
Application.DisplayAlerts = False
' Макрос1 Макрос
With ThisWorkbook.Connections("Запрос — Запрос2").OLEDBConnection
    .BackgroundQuery = False
    .Refresh
End With
Call Send_Mail_Mass
Application.DisplayAlerts = True
End Sub
 
Дмитрий(The_Prist) Щербаков, спасибо за совет получилось так, вроде работает
Код
Private Sub Workbook_Open()

Call Макрос1

Application.CalculateUntilAsyncQueriesDone
Call Send_Mail_Mass


End Su
artyrH, попробую ваш способ, отпишусь, спасибо
 
artyrH, ругается,  run-time error 9
 
adamm, не работает. извиняюсь. на активации листа, по моему, работает. а с книгой, не знаю почему, нет
Страницы: 1
Наверх