Отправка книги или листа по электронной почте
Если вам часто приходится рассылать определенные книги или листы по электронной почте, то вы должны были заметить, что процедуру эту быстрой не назовешь. Если делать ее "классически", то надо:
- открыть почтовую программу (например Outlook)
- создать новое сообщение
- вбить туда адрес, тему и текст
- прикрепить к сообщению файл (не забыть!)
- нажать кнопку Отправить
На самом деле почту можно легко отправлять прямо из Excel кучей разных способов. Поехали...
Способ 1. Встроенная отправка
Если у вас еще старый добрый Excel 2003, то все просто. Открываете нужную книгу/лист и выбираете в меню Файл - Отправить - Сообщение (File - Send To - Mail Recipient). Откроется окошко, в котором можно выбрать один из двух вариантов отправки:

В первом случае текущая книга будет добавлена в сообщение как вложение, во втором - содержимое текущего листа попадет прямо в текст сообщения как текстовая таблица (без формул).
Кроме этого в меню Файл - Отправить (File - Send To) есть еще несколько более экзотических вариантов отправки:

- Сообщение (для ознакомления) (Mail Recipient for Review) - отправляется вся книга целиком и при этом для нее включается отслеживание изменений, т.е. начинает явно фиксироваться - кто, когда и в каких ячейках какие изменения производил. Отобразить внесенные изменения потом можно в меню Сервис - Исправления - Выделить исправления (Tools - Track changes - Highlight changes) или на вкладке Рецензирование - Исправления (Reveiw - Track Changes) Выглядеть это будет примерно так:
Цветные рамочки помечают изменения, внесенные в документ (для каждого пользователя - свой цвет). При наведении мыши всплывает похожее на примечание окошко с подробным описанием кто, что и когда изменил в этой ячейке. Весьма удобно для рецензирования документов, когда, например, вы правите отчет своих подчиненных или шеф правит ваш. - По маршруту (Routing Recipient) - сообщение, куда будет вложена ваша книга, отправится по цепочке получателей, каждый из которых автоматически будет пересылать его дальше, как эстафетную палочку. При желании можно задать, чтобы в конце цепочки сообщение вернулось к вам обратно. Можно включить режим отслеживания изменений, чтобы видеть правки, внесенный каждым человеком в цепочке.
В новых Excel 2007/2010 ситуация немного другая. В этих версиях для отправки книги по почте нужно выбрать кнопку Офис (Office Button) или вкладку Файл (File) и команду Отправить (Send). Далее, пользователю предлагается набор вариантов отправки:

Обратите внимание на то, что в новых версиях исчезла возможность отправки отдельного листа книги, вставленного в тело письма - как это было в Excel 2003 и старше. Осталась только возможность отправить весь файл целиком. Зато появилась полезная возможность отправлять в известном формате PDF и менее известном XPS (аналог PDF, но не требует Acrobat Reader для чтения - открывается прямо в Internet Explorer). Команду отправки книги для ознакомления можно вытащить как дополнительную кнопку на панель быстрого доступа через Файл - Параметры - Панель быстрого доступа - Все команды - Отправить на проверку (File - Options - Quick Access Toolbar - All Comands - Send for Review).
Способ 2. Простые макросы для отправки
Отправка макросом гораздо проще. Открываем редактор Visual Basic через меню Сервис - Макрос - Редактор Visual Basic (Tools - Macro - Visual Basic Editor), вставляем новый модуль в меню Insert - Module и копируем туда текст этих двух макросов:
Sub SendWorkbook()
ActiveWorkbook.SendMail Recipients:="vasya@pupkin.com", Subject:="Лови файлик"
End Sub
Sub SendSheet()
ThisWorkbook.Sheets("Лист1").Copy
With ActiveWorkbook
.SendMail Recipients:="vasya@pupkin.com", Subject:="Лови файлик"
.Close SaveChanges:=False
End With
End Sub
После этого скопированные макросы можно запустить в меню Сервис - Макрос - Макросы (Tools - Macro - Macros). SendWorkbook отправляет на заданный адрес всю текущую книгу, а SendSheet - Лист1 как вложение.
При запуске макроса Excel будет обращаться к Outlook, что вызовет появление вот такого сообщения безопасности на экране:

Дождитесь, пока кнопка Разрешить станет активной и нажмите ее, чтобы подтвердить свою отправку. После этого созданные автоматически сообщения будут помещены в папку Исходящие и отправятся получателям при первом запуске Outlook или, если он у вас запущен, непосредственно сразу же.
Способ 3. Универсальный макрос
А если хочется отправлять не текущую книгу, а любой другой файл? И текст сообщения тоже неплохо было бы задать! Предыдущие макросы здесь не помогут, поскольку ограничены возможностями самого Excel, но можно создать макрос, который будет из Excel'я управлять Outlook'ом - создавать и заполнять окно нового сообщения и отправлять его. Макрос выглядит так:
Sub SendMail()
Dim OutApp As Object
Dim OutMail As Object
Dim cell As Range
Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application") 'запускаем Outlook в скрытом режиме
OutApp.Session.Logon
On Error GoTo cleanup 'если не запустился - выходим
Set OutMail = OutApp.CreateItem(0) 'создаем новое сообщение
On Error Resume Next
'заполняем поля сообщения
With OutMail
.To = Range("A1").Value
.Subject = Range("A2").Value
.Body = Range("A3").Value
.Attachments.Add Range("A4").Value
'команду Send можно заменить на Display, чтобы посмотреть сообщение перед отправкой
.Send
End With
On Error GoTo 0
Set OutMail = Nothing
cleanup:
Set OutApp = Nothing
Application.ScreenUpdating = True
End Sub
Адрес, тема, текст сообщения и путь к вложенному файлу должны быть в ячейках A1:A4 текущего листа.
Ссылки по теме
- Групповая рассылка почтовых сообщений из Excel с помощью надстройки PLEX
- Макросы для отправки почты из Excel через Lotus Notes от Dennis Wallentin
- Что такое макросы, куда вставлять код макроса на Visual Basic
- Создание писем с помощью функции ГИПЕРССЫЛКА
Sub SendWorkbook()
ActiveWorkbook.SendMail Recipients:="vasya@pupkin.com", Subject:="Лови файлик"
End Sub
но возможно ли чтобы файл который отправлялся был в формате pdf и как нибудь убрать всплывающее окно где надо разрешать outlook отправлять письмо.
?
Что бы все в 1 клик ?
Подскажите пожалуйста, способом "Способом №3" можно решить следующую задачу ?
Имеется перечень контактов, также справа имеется столбец с числами (например, кол-во дней до определенного события),
необходимо:
1. Просмотр диапазона с числами на условие достижение числами определенного значения (например, 30 > x > 25)
2. При выполнении условия в п.1 Excel начинает формировать массовую рассылку, как это было сделано в Способе№3. Еще есть вариант (МАССОВАЯ РАССЫЛКА ПИСЕМ ПО АДРЕСАМ ). Подобная процедура должна пробежаться до последней строки всей таблицы
3. Вся конструкция макроса "Напоминалки" запускается после открытия файла.
Подскажите как в этом макросе прописать, чтобы он еще дополнительно в текст письма помимо текста, который подтягивает из ячейки вставлял и уже созданную подпись которая в Outlook/
Sub Send_Mail() Dim objOutlookApp As Object, objMail As Object Dim sTo As String, sSubject As String, sBody As String, sAttachment As String Application.ScreenUpdating = False On Error Resume Next Set objOutlookApp = GetObject(, "Outlook.Application") Err.Clear If objOutlookApp Is Nothing Then Set objOutlookApp = CreateObject("Outlook.Application") End If objOutlookApp.Session.Logon Set objMail = objOutlookApp.CreateItem(0) If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub sTo = Range("D3") sSubject = "Всем приветик" sBody = Range("F3").Value sAttachment = Range("F3").Value With objMail .To = sTo .CC = "" .BCC = "" .Subject = sSubject .Body = sBody & String(4, vbCrLf) .HTMLBody = sBody .Attachments.Add sAttachment .Display End With Set objOutlookApp = Nothing: Set objMail = Nothing Application.ScreenUpdating = True End SubВо втором способе есть только "Кому" а есть еще макрос на в "Копии"
Вопрос: можно сделать так чтобы документ без макроса и кнопки отправки?
Т.е. получатель получает вложение в котором уже нет кнопки отправить и соответственно макроса для отправки.
можно ли сделать чтобы в тело письма вставлялись только измененные после открытия ячейки и "шапка"?
Ну или может чтобы отправлялись шапка (первые две строки) и выделенный диапазон ячеек?
При отправке одного листа как вложения документ Excel называется "Книга1". Как сделать, чтобы было изначальное название?
Спасибо!
8)
Скажите , есть ли возможность в тело письма вставить диаграму которая находитса на одному с листов робочей книги
Есть ли возможность вставить частичные данные из я ячейки?
Поясню: в ячейке указана надпись типа "счет фактура(или товарная накладная) №**** от дд.мм.гг". Необходимо чтобы в теме письма указывались данные из этой ячейки в виде "№**** от дд.мм.гг". Без указания типа документа.
Есть ли возможность к этим данным из ячейки добавить через макрос свои? Типа этого: "№**** от дд.мм.гг(из ячейки), филиал такойто(свои данные)".
Есть ли возможность в макросе вставить шаблон с произвольным текстом, что бы в теле письма отображался этот текст и в этом тексте дата в виде кода(отправки письма, т.е. сегодняшняя)?
Заранее спс за помощь.
Необходимо:
Создать одновременно (не отправляя никому автоматически) несколько писем с разными Кому, Телом письма. Я понимаю, что в цикле вызывать, но что-то пока не получается ((
Подскажите, пожалуйста, может можно как-то реализовать такую задачу:
Есть Книга Exel с несколькими Листами. Необходимо одним получателям отправить один набор листов, другим - другой.
Только начинаю постигать просторы Excel-я. Прошу помощи.
Задача: отправить часть таблицы по почте
Вводные: почтовая программа EmClient
Вопрос: Как изменить код ,
Set objOutlookApp = GetObject(, "Outlook.Application") Err.Clear If objOutlookApp Is Nothing Then Set objOutlookApp = CreateObject("Outlook.Application")что бы Excel использовал EmClient вместо Outlook ?
Спасибо
1) а у меня в Универсальном коде выдает ошибку на строке Set OutApp=CreateObject("Outlook.Application")
Ошибка с текстом: 429
ActiveX component can't creat object
Почему так происходит?
2) как можно в способе 2 вместо адреса в коде указать ссылку на ячейку на листе книги?
Указывала
.SendMail Recipients = Range ("A2").Value, Subject= Range ("A3").Value
В ячейке А2 - адрес.
В ячейке А3 - тема
Но тоже выдает ошибку " в списке адресатов указано неизвестное имя"
В файле (например) "Шаблон"есть выпадающий список. Как только я выбираю в списке " Уведомить тов. Иванова посмотреть файл №1".
Товарищу Иванову уходит письмо на Яндекс Почту с содержанием "Посмотри файл №1". При выборке остальных позиций списка отправка письма не происходит.
Далее на другом листе того же файла "Шаблон" я выбираю в списке " Уведомить тов. Петрова посмотреть файл №2".
Товарищу Петрову уходит письмо на Яндекс Почту с содержанием "Посмотри файл №2". При выборке остальных позиций списка отправка письма не происходит.
Помогите создать движок.
Есть около 60 листов.
Есть таблица Название листа - адрес E-Mail
Как разослать листы по соответствующим адресам? Help!
Dim xRg As Range Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Cells.Count > 1 Then Exit Sub Set xRg = Intersect(Range("E7"), Target) If xRg Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 10 Then Call SendMail End If End Sub Sub SendMail() Dim OutApp As Object Dim OutMail As Object Dim cell As Range Application.ScreenUpdating = False Set OutApp = CreateObject("Outlook.Application") OutApp.Session.Logon On Error GoTo cleanup Set OutMail = OutApp.CreateItem(0) On Error Resume Next With OutMail .To = "ycui@mail.ru" .Subject = Range("A2").Value .Body = Range("E7").Value .Attachments.Add Range("A4").Value .Send End With On Error GoTo 0 Set OutMail = Nothing cleanup: Set OutApp = Nothing Application.ScreenUpdating = True End SubПодскажите, может ошибка где?
Не срабатывает удаление формул из листа, я её может не ту переменную поставил?
Option Explicit Sub КаТЗ() Dim objOutlookApp As Object, objMail As Object Dim sTo As String, sSubject As String, sBody As String, sAttachment As String Dim objTmpMail As Object 'временное письмо для создания подписи 'Шаг 2: Скопируйте рабочую таблицу, вставьте ее в новую книгу и 'сохраните ее Sheets("Отправка КАТЗ").Copy ActiveWorkbook.SaveAs ThisWorkbook.Path & "\КаТЗ.xlsx" Application.ScreenUpdating = False On Error Resume Next 'пробуем подключиться к Outlook, если он уже открыт Set objOutlookApp = GetObject(, "Outlook.Application") Err.Clear 'Outlook закрыт, очищаем ошибку If objOutlookApp Is Nothing Then Set objOutlookApp = CreateObject("Outlook.Application") End If objOutlookApp.Session.Logon Set objMail = objOutlookApp.CreateItem(0) 'создаем новое сообщение 'если не получилось создать приложение или экземпляр сообщения - выходим If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub sTo = "" 'Кому(можно заменить значением из ячейки - sTo = Range("A1").Value) sSubject = "КаТЗ" 'Тема письма(можно заменить значением из ячейки - sSubject = Range("A2").Value) sBody = "" 'Текст письма(можно заменить значением из ячейки - sBody = Range("A3").Value) sAttachment = "" 'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4").Value) 'создаем сообщение With objMail .ReadReceiptRequested = True 'прочтение .OriginatorDeliveryReportRequested = True 'доставка .Importance = 2 'Варианты (0-normal, 1-low, 2-high) .To = sTo 'адрес получателя .CC = "" 'адрес для копии .BCC = "" 'адрес для скрытой копии .Subject = sSubject 'тема сообщения .Body = sBody 'текст сообщения .HTMLBody = sBody & .HTMLBody 'если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.) .Attachments.Add (ThisWorkbook.Path & "\КаТЗ.xlsx") 'чтобы отправить активную книгу вместо sAttachment указать ActiveWorkbook.FullName .ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value ' удалить строку, если формулы нужны 'добавляем подпись к письму 'создаем новое письмо Set objTmpMail = objOutlookApp.CreateItem(0) 'отображаем его - у него появится подпись objTmpMail.Display 'теперь к нашему текущему(рабочему) письму просто добавляем текст из временного objMail.Body = objMail.Body & objTmpMail.Body objTmpMail.Delete 'удаляем временное письмо .Display 'Display/Send, если необходимо просмотреть сообщение, а не отправлять без просмотра End With ActiveWorkbook.Close SaveChanges:=True Kill ThisWorkbook.Path & "\КаТЗ.xlsx" Set objOutlookApp = Nothing: Set objMail = Nothing Application.ScreenUpdating = True End SubПользуюсь способом номер 2. Подскажите пожалуйста если на отправляемом листе информация отфильтрована с использованием фильтров, возможно ли сделать так чтобы получатель получал уже только отфильтрованную информацию. Сейчас получатель получает полностью лист и при удалении фильтров видит информацию которую он видеть не должен
Спасибо за помощь.
Sub SendWorkbook()
ActiveWorkbook.SendMail Recipients:="vasya@pupkin.com", Subject:="Лови файлик"
End Sub
Sub SendSheet()
ThisWorkbook.Sheets("Лист1".Copy
With ActiveWorkbook
.SendMail Recipients:="vasya@pupkin.com", Subject:="Лови файлик"
.Close SaveChanges:=False
End With
End Sub