Имеется умная таблица с базой данных, и эта таблица предназначена для массовой рассылки писем в Outlook.
То есть, имеется информация: 1. Кому отправить письмо; 2. Кого поставить в копию; 3. Как назвать тему письма, 4. Прочие нюансы.
С помощью нехитрых манипуляций с ВПР на том же листе есть формочка, которая подтягивает необходимые данные по индикатору "a" (латинская раскладка) из первого столбца (в примере это наглядно видно).
Далее; на текущий момент имеется такой вот код:
Скрытый текст
Код
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
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
Что хотел сделать:
1. Проставить индикаторы (далее - галочки) по тем строкам в умной таблице, по которым необходимо отправить письма; 2. Запустить этот макрос, который создает письма и заполняет информацию в каждое созданное письмо из этой ранее упомянутой формы; создав первое письмо и вставив туда информацию, верхний индикатор стирается; далее создается следующее письмо. 3. Посчитать количество созданных писем.
В чем проблема:
Письма создаются, информация вставляется, количество созданных писем соответствует количеству галочек в таблице, но все письма одинаковые, т.е. информация заполняется лишь по самой первой галочке. Все остальное вроде работает нормально.
Подскажите, пожалуйста, как устранить дефект? (Также буду очень благодарен за любые замечания по структуре кода и любым полезным советам по данному вопросу, может быть я пытаюсь почесать правое ухо левой рукой и уже есть способы автоматически отправлять письма попроще).
У Вас все переменные объявляются сразу после With и потом в теле цикла используются не значения ячеек (которые исправно обновляются) а значения переменных, которые задаются один раз перед началом цикла. Вообще не вижу смысла формировать выходную форму. Я бы использовал конструкцию типа:
Я попробовал, с помощью 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