Отправка книги или листа по электронной почте

Если вам часто приходится рассылать определенные книги или листы по электронной почте, то вы должны были заметить, что процедуру эту быстрой не назовешь. Если делать ее "классически", то надо:

  • открыть почтовую программу (например Outlook)
  • создать новое сообщение
  • вбить туда адрес, тему и текст
  • прикрепить к сообщению файл (не забыть!)
  • нажать кнопку Отправить

На самом деле почту можно легко отправлять прямо из Excel кучей разных способов. Поехали...

Способ 1. Встроенная отправка

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

sendmail1.gif

В первом случае текущая книга будет добавлена в сообщение как вложение, во втором - содержимое текущего листа попадет прямо в текст сообщения как текстовая таблица (без формул).

Кроме этого в меню Файл - Отправить (File - Send To) есть еще несколько более экзотических вариантов отправки:

 sendmail2.gif

  • Сообщение (для ознакомления) (Mail Recipient for Review) - отправляется вся книга целиком и при этом для нее включается отслеживание изменений, т.е. начинает явно фиксироваться - кто, когда и в каких ячейках какие изменения производил. Отобразить внесенные изменения потом можно в меню Сервис - Исправления - Выделить исправления (Tools - Track changes - Highlight changes) или на вкладке Рецензирование - Исправления (Reveiw - Track Changes) Выглядеть это будет примерно так:
    sendmail3.gif

    Цветные рамочки помечают изменения, внесенные в документ (для каждого пользователя - свой цвет). При наведении мыши всплывает похожее на примечание окошко с подробным описанием кто, что и когда изменил в этой ячейке. Весьма удобно для рецензирования документов, когда, например, вы правите отчет своих подчиненных или шеф правит ваш.
  • По маршруту (Routing Recipient) - сообщение, куда будет вложена ваша книга, отправится по цепочке получателей, каждый из которых автоматически будет пересылать его дальше, как эстафетную палочку. При желании можно задать, чтобы в конце цепочки сообщение вернулось к вам обратно. Можно включить режим отслеживания изменений, чтобы видеть правки, внесенный каждым человеком в цепочке.

В новых Excel 2007/2010 ситуация немного другая. В этих версиях для отправки книги по почте нужно выбрать кнопку Офис (Office Button) или вкладку Файл (File) и команду Отправить (Send). Далее, пользователю предлагается набор вариантов отправки:

sendmail5.gif

Обратите внимание на то, что в новых версиях исчезла возможность отправки отдельного листа книги, вставленного в тело письма - как это было в 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, что вызовет появление вот такого сообщения безопасности на экране:

sendmail4.gif

Дождитесь, пока кнопка Разрешить станет активной и нажмите ее, чтобы подтвердить свою отправку. После этого созданные автоматически сообщения будут помещены в папку Исходящие и отправятся получателям при первом запуске 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 текущего листа.

Ссылки по теме

 


Страницы: 1  2  
12.06.2016 15:19:04
Николай, здравствуйте.
Нашел на просторах сети вот такой ккод

Option Explicit
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
   'пробуем подключиться к 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 = "AddressTo@mail.ru"    'Кому(можно заменить значением из ячейки - sTo = Range("A1";).Value)
   sSubject = "Автоотправка"    'Тема письма(можно заменить значением из ячейки - sSubject = Range("A2";).Value)
   sBody = "Привет от Excel-VBA"    'Текст письма(можно заменить значением из ячейки - sBody = Range("A3";).Value)
   sAttachment = "C:\Temp\Книга1.xls"    'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4";).Value)
   
   'создаем сообщение
   With objMail
 .To = sTo 'адрес получателя
 .CC = "" 'адрес для копии
 .BCC = "" 'адрес для скрытой копии
 .Subject = sSubject 'тема сообщения
 . = sBody 'текст сообщения
 '.HTMLBody = sBody 'если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.)
 .Attachments.Add sAttachment 'чтобы отправить активную книгу вместо sAttachment указать ActiveWorkbook.FullName
 .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
   End With
   Set objOutlookApp = Nothing: Set objMail = Nothing
   Application.ScreenUpdating = True
End Sub
[CODE][/CODE] Не могу понять что изменить чтобы отправлять текущий лист или текущую книгу.
Подскажите пожалуйста.

не получилось вставить в теги код, все переносы убирает.
17.06.2016 06:09:45
Всем привет.
Очень понравился макрос из шапки


Sub SendSheet()
   ThisWorkbook.Sheets("Лист1";).Copy
   With ActiveWorkbook
 .SendMail Recipients:="vasya@pupkin.com", Subject:="Лови файлик"
 .Close SaveChanges:=False
   End With
End Sub


Помогите, пожалуйста, внести некоторые коррективы:
Необходимо настроить отправку в формате XPS
Необходимо настроить отправку получателям, чьи адреса прописаны в определенных клетках
Необходимо настроить отправку копии получателям, чьи адреса прописаны в определенных клетках

В идеале - настроить отправку не самого файла, а в виде вложенной в письмо таблички с диапазоном (A1:L16)
20.06.2016 12:43:18
Добрый день. Очень помог ваш макрос.

Sub SendWorkbook()
   ActiveWorkbook.SendMail Recipients:="vasya@pupkin.com", Subject:="Лови файлик"
End Sub
но возможно ли чтобы файл который отправлялся был в формате pdf и как нибудь убрать всплывающее окно где надо разрешать outlook отправлять письмо.
?
31.08.2016 10:48:06
Возможно ли обойти окошко  с кнопкой "разрешить"
Что бы все в 1 клик ?
25.09.2016 20:43:09
Добрый день !
Подскажите пожалуйста, способом "Способом №3" можно решить следующую задачу ?

Имеется перечень контактов, также справа имеется столбец с числами (например, кол-во дней до определенного события),
необходимо:
1. Просмотр диапазона с числами на условие достижение числами определенного значения (например, 30 > x > 25)
2. При выполнении условия в п.1 Excel начинает формировать массовую рассылку, как это было сделано в Способе№3. Еще есть вариант  http://www.excel-vba.ru/chto-umeet-excel/kak-otpravit-pismo-iz-excel/  (МАССОВАЯ РАССЫЛКА ПИСЕМ ПО АДРЕСАМ ). Подобная процедура должна пробежаться до последней строки всей таблицы
3. Вся конструкция макроса "Напоминалки" запускается после открытия файла.
28.09.2016 21:56:24
Приветик, всем Гуру.
Подскажите как в этом макросе прописать, чтобы он еще дополнительно в текст письма помимо текста, который подтягивает из ячейки вставлял и уже созданную подпись которая в 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

 
Добрый день!

Во втором способе есть только "Кому" а есть еще макрос на в  "Копии"
02.02.2017 13:18:40
Николай, пользуюсь вторым способом для отправки. В документ добавил кнопку и ей назначил макрос.
Вопрос: можно сделать так чтобы документ без макроса и кнопки отправки?
Т.е. получатель получает вложение в котором уже нет кнопки отправить и соответственно макроса для отправки.
29.05.2017 12:59:49
А вот у меня стоит задача ЗАПРЕТИТЬ пользователям отправлять конкретный файл по почте. Можно ли это реализовать?
09.08.2017 16:15:03
Добрый день!

можно ли сделать чтобы в тело письма вставлялись только измененные после открытия ячейки и "шапка"?
Ну или может чтобы отправлялись шапка (первые две строки) и выделенный диапазон ячеек?
07.11.2017 12:51:35
Здравствуйте!
При отправке одного листа как вложения документ Excel называется "Книга1". Как сделать, чтобы было изначальное название?
Спасибо!

8)
14.11.2017 22:23:51
Доброго времени суток ,
Скажите , есть ли возможность в тело письма вставить диаграму которая находитса на одному с листов робочей книги
14.03.2018 08:53:01
Ссылка на Lotus не рабочая.
22.03.2018 00:07:24
Здравтствуйте!
Есть ли возможность вставить частичные данные из я ячейки?
Поясню: в ячейке указана надпись типа "счет фактура(или товарная накладная) №**** от дд.мм.гг". Необходимо чтобы в теме письма указывались данные из этой ячейки в виде "№**** от дд.мм.гг". Без указания типа документа.
Есть ли возможность к этим данным из ячейки добавить через макрос свои? Типа этого: "№**** от дд.мм.гг(из ячейки), филиал такойто(свои данные)".
Есть ли возможность в макросе вставить шаблон с произвольным текстом, что бы в теле письма отображался этот текст и в этом тексте дата в виде кода(отправки письма, т.е. сегодняшняя)?
Заранее спс за помощь.
13.10.2018 18:58:47
Всем привет Как можно  улучшить 3 способ  отправки  писем?

Необходимо:
Создать одновременно (не отправляя никому автоматически) несколько писем с разными Кому, Телом письма.  Я понимаю,  что  в  цикле вызывать,  но что-то  пока  не получается ((  
22.03.2019 14:22:41
Здравствуйте!
Подскажите, пожалуйста, может можно как-то реализовать такую задачу:
Есть Книга Exel с несколькими Листами. Необходимо одним получателям отправить один набор листов, другим - другой.
09.08.2019 07:53:22
Уважаемые, здравствуйте!
Только начинаю постигать просторы Excel-я. Прошу помощи.
Задача: отправить часть таблицы по почте
Вводные: почтовая программа EmClient
Вопрос: Как изменить код ,
Set objOutlookApp = GetObject(, "Outlook.Application")
    Err.Clear
    If objOutlookApp Is Nothing Then
        Set objOutlookApp = CreateObject("Outlook.Application")
 

что бы Excel использовал EmClient вместо Outlook ?
Спасибо
23.08.2019 17:49:03
Алексей, подскажите
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 - тема
Но тоже выдает ошибку " в списке адресатов указано неизвестное имя"
03.06.2020 12:27:58
Подскажите пожалуйста как реализовать следующую задачу:
В  файле (например) "Шаблон"есть выпадающий список. Как только я выбираю в списке " Уведомить тов. Иванова посмотреть файл №1".
Товарищу Иванову уходит письмо на Яндекс Почту с содержанием "Посмотри файл №1". При выборке остальных позиций списка отправка письма не происходит.
Далее на другом листе того же файла "Шаблон"  я выбираю в списке " Уведомить тов. Петрова посмотреть файл №2".
Товарищу Петрову уходит письмо на Яндекс Почту с содержанием "Посмотри файл №2". При выборке остальных позиций списка отправка письма не происходит.
Помогите создать движок.
03.06.2020 14:38:47
Забыл добавить, что ОС мелкомягких отправителя и получателя могут быть 32-х и 64-х разрядные
A A
02.09.2020 19:50:26
Относительно первого способа: в экселе 2016 по-прежнему можно отправлять один лист в теле письма, выведя на панель быстрого доступа кнопку Send To Mail Recipient
17.11.2020 09:50:54
Коллеги подскажите как сделать вывод  таблицы html в тело письма более сжатым, таблица должна быть отформатирована так чтобы входила на экран монитора, изменение ширины линий горизонтальных в самом Excel результата не дает, изменение шрифта тоже не помогает, не силен в VB сам код взял в форуме и немного доработал под себя. и еще съедает строчку отступ в самом начале письма как его тоже убрать?

Исходник Mail_range_html_2.xlsm здесь
17.04.2021 14:26:27
Здравствуйте! Подскажите, пожалуйста, макрос, которым можно разослать листы на разные адреса! Вроде, проблема не уникальная, но нигде не могу найти.
Есть около 60 листов.
Есть таблица Название листа - адрес E-Mail
Как разослать листы по соответствующим адресам? Help!
09.09.2021 16:24:37
Здравствуйте. Подскажите пожалуйста. Есть макрос, который отправляет письмо через Outlook если значение в ячейке изменяется и выполняется условие. Все работает, но только если самому изменить значение в ячейке и нажать Enter. Мне же нужно, чтобы эта ячейка суммировала несколько других ячеек - тогда значение в ячейке меняется но отправка письма не происходит. Можно что-нибудь сделать? Спасибо.


 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

16.05.2022 15:00:08
Здравствуйте.
Подскажите, может ошибка где?
Не срабатывает удаление формул из листа, я её может не ту переменную поставил?

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
Страницы: 1  2  
Наверх