Страницы: 1
RSS
Корректировка макроса для рассылки писем (Outlook)
 
Коллеги, добрый день,

Имеется умная таблица с базой данных, и эта таблица предназначена для массовой рассылки писем в Outlook.

То есть, имеется информация:
1. Кому отправить письмо;
2. Кого поставить в копию;
3. Как назвать тему письма,
4. Прочие нюансы.

С помощью нехитрых манипуляций с ВПР на том же листе есть формочка, которая подтягивает необходимые данные по индикатору "a" (латинская раскладка) из первого столбца (в примере это наглядно видно).

Далее; на текущий момент имеется такой вот код:

Скрытый текст

Что хотел сделать:

1. Проставить индикаторы (далее - галочки) по тем строкам в умной таблице, по которым необходимо отправить письма;
2. Запустить этот макрос, который создает письма и заполняет информацию в каждое созданное письмо из этой ранее упомянутой формы; создав первое письмо и вставив туда информацию, верхний индикатор стирается; далее создается следующее письмо.
3. Посчитать количество созданных писем.

В чем проблема:

Письма создаются, информация вставляется, количество созданных писем соответствует количеству галочек в таблице, но все письма одинаковые, т.е. информация заполняется лишь по самой первой галочке. Все остальное вроде работает нормально.

Подскажите, пожалуйста, как устранить дефект? (Также буду очень благодарен за любые замечания по структуре кода и любым полезным советам по данному вопросу, может быть я пытаюсь почесать правое ухо левой рукой и уже есть способы автоматически отправлять письма попроще).

Пример в приложении.

Спасибо.
Изменено: Framed - 16.11.2018 15:34:52
 
У Вас все переменные объявляются сразу после With и потом в теле цикла используются не значения ячеек (которые исправно обновляются) а значения переменных, которые задаются один раз перед началом цикла.
Вообще не вижу смысла формировать выходную форму. Я бы использовал конструкцию типа:
Код
...
SM.To = Cell.offset(,1)
SM.CC = Cell.offset(,2) 
...
Изменено: Wiss - 16.11.2018 15:40:30
Я не волшебник, я только учусь.
 
Wiss, спасибо за ответ.

Я попробовал, с помощью offset хорошо.
Правда, есть нюансы. По поводу формы: я не знаю, как без ВПР и условия вставить текст так, чтобы учитывались все нюансы. Это, наверное, отдельную тему надо создавать.

Дело в том, что текст планирую менять не только в зависимости от имени отправителя. Да, он в целом будет стандартный, но по определенным критериям в одних письмах будет указываться, ну допустим, курс евро на первое число месяца, а в других нет. С помощью формы, впр и ЕСЛИ в Экселе у меня легко получается это учесть, а вот как сделать так, чтобы VBA это понял при создании писем я пока не знаю.

Но в любом случае, спасибо за помощь, буду работать над этим дальше.
 
Цитата
Framed написал: как сделать так, чтобы VBA это понял при создании писем
Допустим сделайте заливку ячейки. И сделайте проверку, например, если заливки нет - используем, иначе - нет:
Код
    If ActiveCell.Interior.ColorIndex = xlColorIndexNone Then
        ' use it!
    Else
        ' DON'T USE IT!!!
    End If
ActiveCell замените на соотв. объект Range. Else - приведён в качестве примера - можно убрать. Вместо заливки можно использовать, например, зачёркнутый шрифт и т.п.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Framed, бяда. Комп завис и съел моё ответное сообщение (( Общис смысл был в том, что я не настаиваю на своей правоте. Каждый пишет так, как ему удобнее. На всякий случай, если из моего предыдущего сообщения не было понятно, поясняю, что нижеприведённый код нормально формирует письма на основе данных из Вашей формочки.
Код
Sub Checking()
Dim OutlookApp As Object, SM As Object, r As Long, Cell As Range, Cnt As Integer
Dim Address As Variant, CC As Variant, Topic As Variant, Text As Variant
Cnt = 0
Application.EnableEvents = False
Application.Calculation = xlCalculationAutomatic

    With ThisWorkbook.Worksheets("Лист1")
'        Address = Range("M3").Value
'        CC = Range("M4").Value
'        Topic = Range("M5").Value
'        Text = Range("M6").Value
        r = .Cells(Rows.Count, 2).End(xlUp).Row
        If r > 1 Then
            For Each Cell In .Range("B2:B" & r)
                    If Cell.Value = "a" Then
                    
                        Address = Range("M3").Value
                        CC = Range("M4").Value
                        Topic = Range("M5").Value
                        Text = Range("M6").Value
                    
                        Set OutlookApp = CreateObject("Outlook.Application")
                        Set SM = OutlookApp.CreateItem(olMailItem)
                        'SM.SentOnBehalfOfName = "mail@example.ru" 'Поле "От", если нужен другой отправитель
                        SM.To = Address
                        SM.CC = CC
                        SM.Subject = Topic
                        On Error Resume Next
                        SM.Body = Text
                '       SM.Attachments.Add ("C:\Test.xls") 'Адрес вложения
                        SM.Display
                        Set SM = Nothing
                        Set OutlookApp = Nothing
                        Cnt = Cnt + 1
                        Cell.ClearContents
                        DoEvents
                    End If
            Next Cell
        End If
    End With
End Sub
Я не волшебник, я только учусь.
 
Wiss, нет, Вы правы; так или иначе, способ с отступами когда-нибудь понадобится, а я про него и не догадался.

JayBhagavan, Вам тоже спасибо за ответ, в целом, понял Вашу мысль, будем пробовать.

Сейчас пойду создавать еще одну тему.
Страницы: 1
Наверх