Страницы: 1 2 3 След.
RSS
Массовая отправка писем Outlook, с вставкой отдельной таблицы в каждое письмо
 
Ребята, всем привет

Пытаюсь реализовать отправку писем по заданному списку адресов.

Есть список получателей (поставщиков) которым нужно отправить письма в тело каждого письма нужно вставить разные таблицы.
То есть каждое письмо с отдельной таблицей.
В ручную это возможно сделать и это реализовано в файле (Запрос-mail1)
Но здесь не могу реализовать массовую рассылку с вставкой таблицы.

Как реализовать массовую рассылку одинаковых писем - реализовано в файле (Массовая рассылка писем)

Пытался совместить коды но к сожалению знаний не хватает.
Очень нужна ваша помощь.

Нужно чтобы при нажатии кнопки "отправить письмо" программа находила первого поставщика, формировало таблицу (копирует строки по признаку "поставщик" из закладки "заявки" и вставляла отфильтрованную по поставщику информацию на лист1 в таблицу которая будет в последствии вставлена в письмо)
 
По поводу вставки таблицы в тело письма та еще заморочка, я пытался но там такие танцы с бубнами , что проще вставить файл с листом Excel.
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
вставки таблицы в тело письма та еще заморочка
в смысле? HTML Таблица и все, другое дело форматирование её заморочное, если соблюдать то что в источнике. А так, набор HTML тегов <tr> <td>.
По вопросам из тем форума, личку не читаю.
 
Цитата
Nordheim написал:
там такие танцы с бубнами
вроде не так уж и сложно. Здесь приводил готовую функцию и готовый код: Вставить в письмо Outlook таблицу Excel с форматированием
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток.
Цитата
Nordheim написал:
По поводу вставки таблицы в тело письма та еще заморочка
А какие там заморочки? Outlook вполне себе позволяет отправлять выделение с листа, плюс, не так и сложно комбинировать HtmlBody = HtmlBoy & (Html другого источника).
 
Дмитрий Щербаков, Андрей VG,  это и меня касается :-) каждый отметил что ничего сложного, а ТС помощи так и не получил :-)? Я правда не макрушник , это у меня алиби такое.
Изменено: БМВ - 15.02.2018 17:13:59
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
это и меня касается :-) каждый отметил что ничего сложного,
А это есть обязанность обеспечивать помощь ТС готовым решением? Если так, то я лучше эмигрирую.
Цитата
БМВ написал:
Я правда не макрушник , это у меня алиби такое.
Не прибедняйтесь. Я помню как вы код для анализа файлов PowerPoin на зашифрованность делали и, в общем-то, по таким же наводкам. Никто готового решения не предоставлял.
Изменено: Андрей VG - 15.02.2018 17:27:37
 
Друзья, не сортесь
Готовый результат всё равно останется на форуме в общее пользование.

Я вижу два пути решения этой задачи:
1) После нажатия кнопки «Отправить письмо» проверяется первый получатель в списке рассылки. По получателю (ключевое поле) выгружается информация из общей таблицы, которая на закладке «Заявки» и вставляется как отфильтрованный результат в таблицу на листе «Лист1».
Тема письма, адрес, тело, и путь вложения копируется в соответствующие поля подготовленной формы на листе «Лист1»

Дальше код реализован, эта таблица вставляется в тело письма (форма Outlook).
Цикл продолжается пока в столбце, получателей, не достигнем последнего получателя.

2) Ни чем не отличается от первого только если это проще вместо цикла можно сделать кнопку следующий и после нажатия которой загружаются все данные в таблицу и в форму после чего нажимаем кнопку «Отправить письмо».
 
Offtop Андрей VG,  ну смайлы то не зря стоят :-) просто и правда смешно, три подряд ответа.
Цитата
Андрей VG написал:
Не прибедняйтесь
Это вот про это , да , это не единственный полезный скрипт, но скорее по надобности и из любви к искуству .Приятно такую oценку получить от профессионалов, но я оцениваю себя адекватно, могу что-то - да, уровень - ну так себе.
Изменено: БМВ - 15.02.2018 17:58:25
По вопросам из тем форума, личку не читаю.
 
Уточните, логику отправки таблиц. Критерий фильтрации данных в таблице.
"Все гениальное просто, а все простое гениально!!!"
 
Логика фильтрации следующая:

Есть две таблицы с данными.
Первая таблица (лист "Лист1") содержит только список получателей.
Вторая таблица (лист "Заявки") содержит колонку с получателями и еще несколько колонок с данными.
В первой таблице определяем первого в списке получателя и по нему фильтруем вторую таблицу.
Отфильтрованные данные вставляем на Лист1 в подготовленную форму таблицы (Таблица для вставки).

.... отправляется письмо.

Цикл завершается и переходим в первой таблице ко второму по списку получателю.

Действие с фильтрацией повторяем.

Цикл выполняем пока не дойдём до последнего получателя в первой таблице.

Что самое интересное это должно происходить синхронно
Вставка отфильтрованной таблицы в (Таблица для вставки на Листе1
Вставка темы из таблицы в форму тема письма (это всё происходит на листе Лист1)
Вставка текста сообщения (из таблицы с получателями) в текст письма (форма письма на листе Лист1)
Вставка путь к вложению в поле вложение.

Если посмотрите вложенные файлы в начале этой темы та Лист1 разделён на две части:
Правая с подготовленной информацией таблице и вторая часть форма письма куда эти данные должны быть вставлены перед отправкой письма.
Изменено: Mutarix - 16.02.2018 15:32:15
 
У меня есть пример реализации подобной фильтрации но с выборкой из внешнего файла.
Не получается его адаптировать под выгрузку из внутреннего источника.

Код
Sub Tablitsa()

Dim DateX As Date
Dim DateA As Date
Dim DateB As Date

Dim ShtX As Worksheet
Dim ShtA As Worksheet

Dim A As Long
Dim B As Long
Dim C As Long

Application.ScreenUpdating = False
Set ShtA = Workbooks("Çàïðîñ - mail.xlsm").Worksheets("Çàÿâêè")
' проверяем открыт ли необходимый файл для загрузки или нет с всплывающим сообщением о необходимости выполнить действие
On Error Resume Next
Set ShtX = Workbooks("2018.xlsx").Worksheets("Áàçà")
    If ShtX Is Nothing Then
        Dim retval As Integer
        retval = MsgBox("нужно открыть файл 2018.xlsx", vbExclamation + vbOKCancel, "Выполнить действие")
    Exit Sub
    End If
On Error GoTo 0
'----------------------
ShtA.Range("A2:J" & WorksheetFunction.Max(4, ShtA.Cells(ShtA.Rows.Count, 1).End(xlUp).Row)).Value = "" 'очищаем поля перед вставкой новых данных
DateA = ShtA.Cells(3, 13).Value 'дата от
DateB = ShtA.Cells(3, 14).Value 'дата до
B = 1
    With ShtX
            C = ShtX.Cells(.Rows.Count, 1).End(xlUp).Row
            If C > 1 Then
                For A = 1 To C
                        If ShtA.Cells(1, 14).Value = ShtX.Cells(A, 17).Value Then 'отбираются строки согласно выбранного получателя
                        DateX = ShtX.Cells(A, 3).Value 'ячейка дата заявки
                        If DateX >= DateA And DateX <= DateB Then 'условия отбора Дата заявки в диапазоне: дата от - дата до
                            B = B + 1
                             ShtA.Cells(B, 1).Resize(1, 2).Value = .Range(.Cells(A, 2), .Cells(A, 3)).Value
                             ShtA.Cells(B, 3).Resize(1, 2).Value = .Range(.Cells(A, 7), .Cells(A, 8)).Value
                             ShtA.Cells(B, 5).Resize(1, 2).Value = .Range(.Cells(A, 9), .Cells(A, 10)).Value
                             ShtA.Cells(B, 7).Resize(1, 2).Value = .Range(.Cells(A, 11), .Cells(A, 12)).Value
                             ShtA.Cells(B, 9).Resize(1, 1).Value = .Range(.Cells(A, 13), .Cells(A, 13)).Value
                             ShtA.Cells(B, 10).Resize(1, 1).Value = .Range(.Cells(A, 22), .Cells(A, 22)).Value
                        End If
                        End If
                Next A
            End If
    End With
Set ShtA = Nothing
Application.ScreenUpdating = True

End Sub
Изменено: Mutarix - 17.02.2018 00:02:38
 
Попробуйте может так подойдет!
"Все гениальное просто, а все простое гениально!!!"
 
Друзья, подскажите пожалуйста мне стоит ждать помощи?
Давайте хотя бы подискутируем как правильно реализовать эту задачу.
Может я не правильную логику выбрал.
 
Nordheim, спасибо огромное результат то, что нужно.
Подскажите, пожалуйста, как преобразовать код чтобы можно было к каждой таблице обратиться по заданному диапазону.
То есть если нужно передвинуть таблицы на каждом листе это можно было указать в код.
Изменено: Mutarix - 17.02.2018 00:04:06
 
Не понял, что значит   к каждой таблице обратиться по заданному диапазону. Логика кода проста, берется вся таблица. Циклом дробится на куски по критерию, и эти куски вставляются в тело письма. по сути тут нет никаких заданных диапазонов кроме ограничения количества столбцов.
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim,
Я имею ввиду, что на листе1 таблица вставляется в ячейку А1 как её передвинуть в ячейку например J10. Ну или лист "поставщик" код обращается к таблице с ячейки А1 - нужно передвинуть таблицу в ячейку например С10.
 
на листе1 таблица вставляется в ячейку A2, поменяйте в коде A2 на J10 и все, аналогично на листе "поставщике". Только непонятно зачем? Вставляйте свои данные в таблицу на листе "поставщике" и запускайте процедуру. Если структура таблицы будет другая, то сломается вся логика работы макроса, и соответственно данные будут некорректны. Если брать ваш первоначальный файл, то это макрос от Дмитрия Щербакова. Сделайте свой файл перенесите код, и работайте с ним. Зачем вам в рабочем файле лишние кнопки и диапазоны заполненные информацией для понятия и обучения работы самого кода. Я поэтому и удалил первый лист и создал для таблицы отдельный, что бы не было ничего лишнего.
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, Вы правы. Я перестроил форму под ваш код и получилась программа во вложенных файлах по ссылке. Файлы
Файлы больше допустимого размера по этому вложил ссылку. Если модераторы разрешат вложу файлы.

Но в процессе использования пришёл к тому что не хватает ещё одной детали.
После отправки писем нужно в файле "база 2018" сделать запись об отправке (поставить текущую дату в момент отправки как признак, что именно эта заявка отправлена)

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

Обратите внимание когда создаются письма программа создаёт кроме заданного количества писем ещё одно пустое, не могу найти где ошибка, если сможете устранить скажите что нужно исправить в коде.

Заранее спасибо.
Изменено: Mutarix - 26.02.2018 18:17:17
 
На  примере моего файла покажите , что куда записывать. А про пустое письмо не могу ничего сказать, у меня все письма заполнены.
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, запись нужно сделать в файл база 2018 Столбец "AI" (записываем дату отправки то есть текущую)
Ключевое поле №заявки - это номер есть и в файле "база 2018" и в загружаемом файле "тест" лист "Заявки".

№ Заявки
ОМТС-284/03
ОМТС-284/04
ОМТС-284/05


Логика следующая:
1) По всем заявкам в файле"тест" лист "Заявки" (ключевое поле № заявки), после нажатия кнопки "SendMail" записать текущую дату в файл "База 2018" на лист "База" столбец "AI" только для тех строк у которых № заявки совпадает.
То-есть идём перебором сравнением двух таблиц по номерам заявки. Если номер совпадает делаем запись в столбец "AI - Дата оправки".
Изменено: Mutarix - 19.02.2018 12:56:07
 
Так?
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim,
Работает правильно, большое спасибо.
Попробую адаптировать к своему файлу.
Результат выложу дополнительно немного позже.
 
Добрый день,Nordheim
В процессе использования нашёл небольшую ошибку.
Таблица которая вставляется в письмо, вставляется с обрезанными данные по рамки ячеек.

Подскажите пожалуйста как изменить код чтобы таблица в вставлялась в письмо с выравниванием по содержимому каждой ячейки.
 
не совсем понял, что значит с обрезанными. Может это поможет
Код
 Cells.EntireColumn.AutoFit
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, спасибо код помог.
 
Добрый день Nordheim,
Продолжаю адаптацию последней версии кода.
Не могу справиться с ошибкой которая просить определить переменную. Что именно нужно определить и как это должно выглядит?
 
Объявите переменную objDic как Object
Код
Dim objDic As Object
и активизируйте строку
Код
Set objDic = CreateObject("Scripting.Dictionary")
Изменено: Nordheim - 28.02.2018 08:09:25
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim,
Спасибо я в принципе так и сделала. Но кроме этого ещё отдельно объявил переменную и для:
Код
Dim rng As Range


Есть ещё один вопрос. Если в файле База 2018 стоит фильтр, запись выполняться не корректно.
Нужно перед записью снять все фильтра, после чего выполнять запись.

Подскажи пожалуйста как это сделать.

Заранее спасибо.
Изменено: Mutarix - 28.02.2018 11:14:31
 
Цитата
Mutarix написал:
Но кроме этого ещё отдельно объявил переменную и для:
Переменная rng изначально была объявлена.
"Все гениальное просто, а все простое гениально!!!"
Страницы: 1 2 3 След.
Наверх