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

В этой статье рассказывается об отправке электронного письма через Outlook, когда ячейка в определенном диапазоне изменяется в Excel.

Отправить электронное письмо, если ячейка в определенном диапазоне изменена с помощью кода VBA


Отправить электронное письмо, если ячейка в определенном диапазоне изменена с помощью кода VBA

Если вам нужно автоматически создать новое электронное письмо с активной рабочей книгой, когда ячейка в диапазоне A2: E11 изменяется на определенном листе, вам может помочь следующий код VBA.

1. На листе, который необходимо отправить по электронной почте на основе измененной ячейки в определенном диапазоне, щелкните правой кнопкой мыши вкладку листа, а затем щелкните значок Просмотреть код из контекстного меню. Смотрите скриншот:

2. Во всплывающем Microsoft Visual Basic для приложений окна, скопируйте и вставьте ниже код VBA в окно кода.

Код VBA: отправить электронное письмо, если ячейка в указанном диапазоне изменена в Excel

Private Sub Worksheet_Change(ByVal Target As Range)
'Updated by Extendoffice 2017/9/12
    Dim xRgSel As Range
    Dim xOutApp As Object
    Dim xMailItem As Object
    Dim xMailBody As String
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set xRg = Range("A2:E11")
    Set xRgSel = Intersect(Target, xRg)
    ActiveWorkbook.Save
    If Not xRgSel Is Nothing Then
        Set xOutApp = CreateObject("Outlook.Application")
        Set xMailItem = xOutApp.CreateItem(0)
        xMailBody = "Cell(s) " & xRgSel.Address(False, False) & _
            " in the worksheet '" & Me.Name & "' were modified on " & _
            Format$(Now, "mm/dd/yyyy") & " at " & Format$(Now, "hh:mm:ss") & _
            " by " & Environ$("username") & "."

        With xMailItem
            .To = "Email Address"
            .Subject = "Worksheet modified in " & ThisWorkbook.FullName
            .Body = xMailBody
            .Attachments.Add (ThisWorkbook.FullName)
            .Display
        End With
        Set xRgSel = Nothing
        Set xOutApp = Nothing
        Set xMailItem = Nothing
    End If
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

Заметки:

1). В коде A2: E11 это диапазон, на основе которого вы будете отправлять электронную почту.

2). Пожалуйста, измените текст сообщения электронной почты, как вам нужно в xMailBody строка в коде.

3). Заменить Ваш e-mail с адресом электронной почты получателя в строке .To = «Адрес электронной почты».

4). Измените тему электронного письма в строке .Subject = «Рабочий лист изменен в» & ThisWorkbook.FullName.

3. нажмите другой + Q клавиши одновременно, чтобы закрыть Microsoft Visual Basic для приложений окно.

С этого момента любая ячейка в диапазоне A2: E11 будет изменена, будет создано новое электронное письмо с прикрепленной обновленной книгой. И все указанные поля, такие как тема, получатель и тело письма, будут перечислены в письме. Отправьте электронное письмо.

Внимание: код VBA работает, только если вы используете Outlook в качестве почтовой программы.


Статьи по теме:

  • Как автоматически отправлять электронную почту на основе значения ячейки в Excel?
  • Как отправить электронное письмо через Outlook, когда книга сохранена в Excel?
  • Как отправить электронное письмо, если в Excel нажата кнопка?
  • Как отправить электронное письмо, если срок в Excel соблюден?
  • Как отправить напоминание или уведомление по электронной почте, если книга обновлена ​​в Excel?

Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (37)


Оценок пока нет. Оцените первым!

Хитрости »

1 Май 2011              386182 просмотров


Прежде чем начать читать статью прошу принять к сведению объявление: используйте СВОИ АДРЕСА ЭЛ.ПОЧТЫ при тестировании кодов. Не надо отсылать письма на указанные в статье e-mail адреса- это все приходит мне на почту. Помимо этого Вы сами не сможете понять работает или нет, т.к. письма придут мне, а не Вам.
Спасибо за понимание
P.S. А если написанное выше Вы все же проигнорировали и отправили письмо на мои адреса электронной почты — это означает, что Вы соглашаетесь с тем, что вся информация внутри письма, включая вложения, может быть использована мной без ограничений в личных целях.

  • Отправка через меню Excel
  • Простая отправка книги через VBA без Outlook
  • Отправка писем через VBA при помощи Outlook(с вложениями)
  • Отправить письма через Outlook с картинкой в теле письма
  • Массовая рассылка писем по адресам при помощи Outlook
  • Отправка сообщения без использования Outlook — используем CDO

Отправить письмо из Excel можно несколькими способами, в том числе и через написание кода в VBA.

Отправка через меню Excel
Отправку без кода осуществить достаточно просто:

  • Excel 2003: Файл(File)Отправить(Send To)Сообщение(Mail Recipient)
    и выбрать способ отправки:

    • Сообщение(Mail Recipient) — создается сообщение в программе по умолчанию для отправки электронных писем
    • Сообщение (для ознакомления) (Mail Recipient for Review) — вполне интересный вариант. Перед отправкой для книги включается отслеживание изменений(Сервис(Tools)Исправления(Track changes)). Можно воспользоваться этим методом, чтобы отправить получателю для внесения им изменений, а после отследить их(СервисИсправленияВыделить исправления(Highlight changes))
    • Сообщение (как вложение)(Mail Recipient as attachment) — создается сообщение в программе по умолчанию для отправки электронных писем, в которое вложением вкладывается активная книга целиком
    • По маршруту(Routing Recipient) — практически тоже самое, что и Сообщение (для ознакомления) (Mail Recipient for Review) с той разницей, что письмо с вложением пересылается как эстафета от одного получателя к другому. После этого так же можно отследить изменения, внесенные каждым пользователем
    • Папка Exchange(Exchange folder) — активная книга автоматически сохраняется в заданную папку общего сервера Microsoft Exchange. Доступ к этой книге будет открыт всем участникам рабочей группы
    • Факс пользователю службы факсов интернета(Fax) — отправляет содержимое книги по факсу указанным получателям. Для использования данной возможности должна быть установлена служба факсов
  • Excel 2007: Кнопка ОфисОтправить(Send)Сообщение(E-mail)
  • Excel 2010: Файл(File)Сохранить и отправить(Save & Send)Отправить(Send Using E-mail)
  • Далее выбирается способ отправки:

    • Как вложение(Send as attachment) — будет автоматически запущена почтовая программа по умолчанию и создано новое письмо, в которое уже будет вложен файл книги, из которой была вызвана команда
    • Как ссылку(Send link) — доступно, только если файл находится на сетевом ресурсе. После нажатия будет создано новое письмо в почтовой программе по умолчанию, в тело которого будет вставлена ссылка на книгу
    • Как PDF(Send as PDF) — файл будет автоматически сохранен в формате PDF, далее будет создано новое письмо в почтовой программе по умолчанию и файл PDF будет вставлен в письмо
    • Как XPS(Send as XPS) — файл будет автоматически сохранен в формате PDF, далее будет создано новое письмо в почтовой программе по умолчанию и файл PDF будет вставлен в письмо
    • Отправить как факс через интернет(Send as internet fax) — если у вас на ПК установлена служба работы с факсами и есть возможность отправлять и получать факсы на ПК — то данная команда отправит данные активного листа файла как факс

Простая отправка книги через VBA без Outlook

Описанные выше действия можно выполнить так же кодом(так же будет использоваться программа, установленная по умолчанию для отправки писем):

Sub SendMailStandart()
    ActiveWorkbook.SendMail "mail1@excel-vba.ru", "Тема письма"
End Sub

Также можно указать несколько получателей:

Sub SendMailStandart_MassRecipients()
    ActiveWorkbook.SendMail Array("mail1@excel-vba.ru", "mail2@excel-vba.ru"), "Тема письма"
End Sub

Внутри скобок Array можно в кавычках через запятую указать достаточное количество получателей.
Данный метод универсален, но работает только с активным файлом. Нельзя выбрать файл с диска и отправить как вложение. Кроме того, нельзя отправить более одного файла разом и указать текст письма.
Поэтому очень часто на форумах возникает вопрос как отправить письмо из Excel кодом с указанием темы, текста и вложения.
Есть несколько вариантов:


Отправить письмо через Outlook кодом VBA

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
    'раскомментировать строку, если в Outlook несколько учетных записей и нужно подключиться к конкретной(только если Outlook закрыть)
    '   [параметры]: Session.Logon "имя профиля","пароль",[показывать окно выбора профиля], [запускать в новой сессии]
    'objOutlookApp.Session.Logon "profile","1234",False, True
    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 'тема сообщения
        .Body = sBody 'текст сообщения
        '.HTMLBody = sBody 'если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.)
        'добавляем вложение, если файл по указанному пути существует(dir проверяет это)
        If sAttachment <> "" Then
            If Dir(sAttachment, 16) <> "" Then
                .Attachments.Add sAttachment 'просто вложение
                'чтобы отправить активную книгу вместо sAttachment указать ActiveWorkbook.FullName
            End If
        End If
        .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
    End With
 
    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub

Этот код отправляет одно письмо и одно вложение за раз. Но если несколько раз вызвать метод .Attachments.Add, то можно добавить еще файлы:

.Attachments.Add "C:TempКнига1.xlsx"
.Attachments.Add "C:TempКнига2.xlsx"
.Attachments.Add "C:DocumentsReport.rar"

Строка:

objOutlookApp.Session.Logon "user","1234",False, True

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

objOutlookApp.Session.Logon

Важно помнить: пути для файлов в качестве вложений должны содержать полный путь до файла, включая его имя и расширение: C:DocumentsReport.rar. При указании только имени Report.rar или пути без расширения (C:DocumentsReport) ошибки не будет, но вложения не будут помещены в сообщения и адресату отправится письмо без вложений.

Этот код создает сообщение, но есть маленький нюанс — если в Outlook настроено добавление подписей в новые сообщения — то созданные кодом VBA письма игнорирует эту настройку(особенность Outlook, так назовем). Поэтому, если необходимо отправлять письма с подписью, то ознакомьтесь со статьей: Вставить в письмо подпись из Outlook через VBA
В этой же статье можно посмотреть пример составления письма с форматированным текстом.


 
Отправить письма через Outlook с картинкой в теле письма

Sub Send_Mail_With_Picture()
    Dim objOutlookApp As Object, objMail As Object
    Dim sTo As String, sSubject As String, sBody As String, sAttachment As String, sPicture 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 "user","1234",False, True
    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)
    sPicture = "C:ДокументыИзображенияExcel_vba_ru.png" 'если надо вставить в письмо картинку
    'создаем сообщение
    With objMail
        .To = sTo 'адрес получателя
        .CC = "" 'адрес для копии
        .BCC = "" 'адрес для скрытой копии
        .Subject = sSubject 'тема сообщения
'        .Body = sBody 'текст сообщения без форматирования
        .HTMLBody = sBody 'если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.)
        'чтобы картинка была видна внутри сообщения - надо её сначала добавить как вложение
        'если картинка по указанному пути существует(dir проверяет это)
        If Dir(sPicture, 16) <> "" Then
            If Dir(sPicture, 16) <> "" Then
                .Attachments.Add sPicture
                'теперь вставляем код картинки
                .HTMLBody = .HTMLBody & "<p>Картинка в письме</p>" & "<img src=cid:" & Replace(Dir(sPicture, 16), " ", "%20") & ">" ' & " height=240 width=180>"
            '" height=240 width=180>" - если нужны размеры картинки
            End If
        End If
        'добавляем вложение, если файл по указанному пути существует(dir проверяет это)
        If sAttachment <> "" Then        
            If Dir(sAttachment, 16) <> "" Then
                .Attachments.Add sAttachment 'просто вложение
            End If
        End If
        .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
    End With
 
    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub

Этот код отправляет одно письмо и вставляет одну картинку. За это отвечает строка

"<img src=cid:" & Replace(Dir(sPicture, 16), " ", "%20") & ">"

Если картинку надо вложить с заранее указанными размерами, то строка будет выглядеть так:

"<img src=cid:" & Replace(Dir(sPicture, 16), " ", "%20") & " height=240 width=180>"
'height - высота
'width  - ширина

Если надо добавить несколько картинок, то метод .Attachments.Add sPicture надо будет вызвать столько раз, сколько картинок(для каждого свой путь к картинке).

Важно помнить: пути для картинок должны содержать полный путь до файла, включая его имя и расширение: C:ДокументыИзображенияExcel_vba_ru.png. При указании только имени Excel_vba_ru.png или пути без расширения (C:ДокументыИзображенияExcel_vba_ru) ошибки не будет, но картинка не будет вставлена, а вместо неё скорее всего будет текст «Ошибка загрузки картинки!» или пустой квадрат вместо реальной картинки.


 
Массовая рассылка писем по адресам

Так же можно сделать нечто вроде рассылки, организовав цикл по ячейкам. Предположим, что в столбце А записаны адреса, в столбце В тема, в столбце С текст сообщения, в столбце D путь к вложениям:
Таблица адресов
Тогда можно применить следующий код:

Sub Send_Mail_Mass()
    Dim objOutlookApp As Object, objMail As Object
    Dim sTo As String, sSubject As String, sBody As String, sAttachment As String
    Dim lr As Long, lLastR As Long
 
    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
    'произошла ошибка создания объекта - выход
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    'objOutlookApp.Session.Logon "user","1234",False, True
 
    lLastR = Cells(Rows.Count, 1).End(xlUp).Row
    'цикл от второй строки(начало данных с адресами) до последней ячейки таблицы
    For lr = 2 To lLastR
        Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
        'создаем сообщение
        With objMail
            .to = Cells(lr, 1).Value 'адрес получателя
            .Subject = Cells(lr, 2).Value 'тема сообщения
            .Body = Cells(lr, 3).Value 'текст сообщения
            'вложение(если ячейка не пустая и путь к файлу указан правильно)
            If Cells(lr, 4).Value <> "" Then   
                If Dir(Cells(lr, 4).Value, 16) <> "" Then
                    .Attachments.Add Cells(lr, 4).Value
                End If
            End If
            .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
        End With
    Next lr
 
    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub

Скачать пример массовой рассылки:

  Массовая рассылка писем через Outlook.xls (60,0 KiB, 6 984 скачиваний)

При использовании этих кодов есть один недостаток: очень часто при программной отправке писем Outlook выдает окно с запросом подтверждения отправки. Сообщение может быть трех видов:

  • Программа пытается получить доступ к адресам электронной почты, хранящимся в Outlook. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы.
  • Программа пытается отправить сообщение от вашего имени. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы.
  • Программа пытается выполнить действие, которое может привести к отправке сообщения от вашего имени. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы

Чтобы при программной отправке данных сообщений не появлялось, в версиях Outlook, начиная с 2007 можно отключить его настройками безопасности:

  • Outlook 2007: МенюПараметрыЦентр управления безопасностьюПрограммный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется)
  • Outlook 2010 и выше: ФайлПараметрыЦентр управления безопасностьюПрограммный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется)

ВАЖНО: Если компьютер управляется администратором Microsoft Exchange или Microsoft Windows Active Directory Domain Services и администратором в качестве параметров по умолчанию установлен запрет на внесение изменений в параметры безопасности пользователями, возможность изменения данных настроек безопасности программного доступа будет недоступна.

Важно: сам код рассылки не имеет никаких ограничений по числу отправляемых сообщений. Но различные почтовые серверы могут устанавливать свои лимиты. Например, Gmail и Yandex могут заблокировать email, с которого ведется рассылка, если общее количество отправленных сообщений превышает 100 штук в день. Поэтому производить важные массовые рассылки рекомендуется с собственного SMTP-сервера.


 

Но так же при отправке файлов и писем часто необходимо не привязываться к конкретной почтовой программе. Ведь далеко не все ставят Outlook. Многие используют иные почтовые программы, например TheBat.

Отправка сообщения без использования Outlook — используем CDO

Option Explicit
 
Sub Send_Mail()
    Const CDO_Cnf = "http://schemas.microsoft.com/cdo/configuration/"
    Dim oCDOCnf As Object, oCDOMsg As Object
    Dim SMTPserver As String, sUsername As String, sPass As String, sMsg As String
    Dim sTo As String, sFrom As String, sSubject As String, sBody As String, sAttachment As String
    On Error Resume Next
    'sFrom – как правило совпадает с sUsername
    SMTPserver = "smtp.yandex.ru"    ' SMTPServer: для Mail.ru "smtp.mail.ru"; для Яндекса "smtp.yandex.ru"; для Рамблера "mail.rambler.ru"
    sUsername = "YourMail@mail.ru"    ' Учетная запись на сервере
    sPass = "1234"    ' Пароль к почтовому аккаунту
 
    If Len(SMTPserver) = 0 Then MsgBox "Не указан SMTP сервер", vbInformation, "www.Excel-VBA.ru": Exit Sub
    If Len(sUsername) = 0 Then MsgBox "Не указана учетная запись", vbInformation, "www.Excel-VBA.ru": Exit Sub
    If Len(sPass) = 0 Then MsgBox "Не указан пароль", vbInformation, "www.Excel-VBA.ru": Exit Sub
 
    sTo = "AddressTo@mail.ru"    'Кому
    sFrom = "YourMail@yandex.ru"    'От кого
    sSubject = "Автоотправка"    'Тема письма
    sBody = "Привет от Excel-VBA"    'Текст письма
    sAttachment = "C:/Temp/Книга1.xls"    'Вложение(полный путь к файлу)
 
    'Назначаем конфигурацию CDO
    Set oCDOCnf = CreateObject("CDO.Configuration")
    With oCDOCnf.Fields
        .Item(CDO_Cnf & "sendusing") = 2
        .Item(CDO_Cnf & "smtpauthenticate") = 1
        .Item(CDO_Cnf & "smtpserver") = SMTPserver
        'если необходимо указать SSL
        '.Item(CDO_Cnf & "smtpserverport") = 465 'для Яндекса и Gmail 465
        '.Item(CDO_Cnf & "smtpusessl") = True
        '=====================================
        .Item(CDO_Cnf & "sendusername") = sUsername
        .Item(CDO_Cnf & "sendpassword") = sPass
        .Update
    End With
    'Создаем сообщение
    Set oCDOMsg = CreateObject("CDO.Message")
    With oCDOMsg
        Set .Configuration = oCDOCnf
        .BodyPart.Charset = "koi8-r"
        .From = sFrom
        .To = sTo
        .Subject = sSubject
        .TextBody = sBody
        'Проверка наличия файла по указанному пути
        If Len(sAttachment) > 0 Then
            If Dir(sAttachment, 16) <> "" Then
                .AddAttachment sAttachment
            End If
        End If
        .Send
    End With
 
    Select Case Err.Number
    Case -2147220973: sMsg = "Нет доступа к Интернет"
    Case -2147220975: sMsg = "Отказ сервера SMTP"
    Case 0: sMsg = "Письмо отправлено"
    Case Else: sMsg = "Ошибка номер: " & Err.Number & vbNewline & "Описание ошибки: " & Err.Description
    End Select
    MsgBox sMsg, vbInformation, "www.Excel-VBA.ru"
    Set oCDOMsg = Nothing: Set oCDOCnf = Nothing
End Sub

Данный код отправляет письмо, используя объект CDO(Collaboration Data Objects — присутствует во всех версиях Windows) и от имени Вашей учетной записи(либо Яндекс, либо Мэйл, либо Рамблер либо др.).

  • SMTPserver — Каждый из приведенных выше сервисов имеет свой сервер для отправки сообщений(его можно посмотреть на сайте сервиса). В комментариях к коду я написал три самых распространенных, но если Вы используете какой-то другой, то просто посмотрите на его сайте настройки для Outlook и отыщите тот параметр, который отвечает за SMTPserver.
  • sUsername — это Ваш логин для входа в почтовый сервис. Думаю тут все понятно. Единственный момент — обязательно указывать e-mail именно в полном виде — YourMail@mail.ru, даже если для входа на сервис через браузер Вы используете только первую часть записи(YourMail). Если необходимо подставить в качестве отправителя псевдоним(чтобы получатель видел не просто адрес, а ассоциированное имя учетной записи), то указывать надо именно в формате псевдонима:
    sFrom = "Excel-vba <YourMail@yandex.ru>"

    Excel-vba — и есть псевдоним. А сам адрес должен указываться между знаками <>

  • sPass — пароль доступа к Вашей учетной записи, который Вы используете для входа в почту.

Это основные моменты. Поля Кому(sTo), От кого(sFrom),Тема письма(sSubject), Текст письма(sBody) и Вложение(sAttachment) думаю не нуждаются в расшифровке.
Так же стоит учесть пару важных моментов: если на почтовом сервере используется шифрование, то необходимо раскомментировать(убрать знак апострофа) эти строки:

.Item(CDO_Cnf & "smtpserverport") = 465
.Item(CDO_Cnf & "smtpusessl")

Иначе вместо отправки письма получим ошибку «Отказ сервера SMTP». Серверы Яндекс и Gmail требуют шифрования, а значит для них указанные выше строки должны быть активированы(т.е. раскомментированы). Номер порта указывается в описании настроек сервера и для каждого сервера может быть своим, поэтому если с указанием приведенного в коде порта(«smtpserverport») письмо не отправляется — необходимо зайти в настройки почтового сервера и убедиться в правильности указания номера порта.

Чтобы использовать данный код вы можете либо просто скопировать его прямо со страницы, либо скачать файл. В файле программа немного упрощена к использованию — в ячейки листа вам необходимо будет внести поля: Кому(sTo), От кого(sFrom),Тема письма(sSubject), Текст письма(sBody) и Вложение(sAttachment) и выбрать SMTPserver. SMTPserver выбирается из выпадающего списка. Сам список является динамическим и расположен на листе «Settinngs«. Там же расположены поля Учетной записи и Пароль, которые автоматически подставляются в необходимые поля на листе «Отправка«. Т.к. список динамический Вы можете просто добавлять к уже имеющимся новые сервисы и потом просто выбирать их из списка. Так же в файле есть еще одна возможность — выбрать файл. Для этого надо просто нажать на кнопку и выбрать файл.

Скачать пример:

  Массовая рассылка писем через CDO — без Outlook.xls (64,0 KiB, 7 544 скачиваний)


Ввиду все более участившихся вопросов о том, как добавить к тексту письма картинку именно через CDO — описываю как это можно сделать. Я приведу лишь самый главный кусок кода — создание непосредственно сообщения. Весь остальной код остается таким же, как приведен выше.

With oCDOMsg
    Set .Configuration = oCDOCnf
    .From = sFrom
    .BodyPart.Charset = "windows-1251"
    .To = sTo
    .Subject = sSubject
    Set objbp = oCDOMsg.AddRelatedBodyPart("C:ДокументыИзображения11.jpg", "11.jpg", 1)
    objbp.Fields.Item("urn:schemas:mailheader:Content-ID") = "<11.jpg>"
    objbp.Fields.Update
    If Len(sAttachment) > 0 Then
        If Dir(sAttachment, 16) <> "" Then
            .AddAttachment sAttachment
        End If
    End If
    'для вложения картинки письмо лучше формировать в формате HTML
    .HTMLBody = "<img src=""11.jpg""><br />" & sBody
    .Send
End With

Самый главный момент:
AddRelatedBodyPart

    C:ДокументыИзображения11.jpg — указывается полный путь к файлу картинки на компьютере, включая расширение файла.
    11.jpg — указывается имя картинки с расширением. Это имя будет использовано внутри письма и именно его необходимо будет указать дальше в «urn:schemas:mailheader:Content-ID». И указывать обязательно в треугольных скобках: «<11.jpg>»
    внутри же самого письма в том месте, где должна отображаться картинки надо записать:

    в приведенном выше коде картинка вставляется в самом начале письма и после неё так же добавляется перенос на новую строку при помощи тэга

Также см.:
Отправка листа/книги по почте
Вставить в письмо подпись из Outlook через VBA
Вставить в письмо Outlook таблицу Excel с форматированием
Сохранить вложения из Outlook в указанную папку
Как отправить письмо от другой учетной записи Outlook


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Здравствуйте подскажите, а вот токае вообще реально сделать? Есть столбец «M:M», в нем в каждой ячейки формулой происходят вычисления, и когда какая-нибудь ячейка равно «Отправка», то нужно скопировать ячейку «S» и отправить на одину и туже почту с темой «для сотрудника». Например в ячейки «M1201», формула высчитала «Отправка», то она должна скопировать ячейку «S1201» и отправить на почту с темой «для сотрудника». Нашел вот такой скрипт, помогите применить его ко мне.

VAR ID =""; //speadsheet id
var EMAIL = " Вадим@Шема.команда"; / / электронная почта 
VAR RANGE =""; //диапазон данных для отправки
проверка var= ""; / / параметры
var text = ""; / / subject

функция sendData() {
 var электронная таблица = SpreadsheetApp.openById(ID);
 var data = электронная таблица.getRangeByName (диапазон).getValues();
 var message = {};
 if (SpreadsheetApp.openById (ID).getRangeByName (проверка).getValues()
 Сообщение.тема = "[Шема] " + текст;
 message.to = электронная почта;
 Сообщение.htmlBody = dataToHtmlTable_ (данные) +
 "<br><br><br>[SHEMA]";
 MailApp.sendEmail(сообщение);
  }
}

Массив.прототип.datesToString = функция(){
 верните это.карта (функция (строка){
 верните строку.карта (функция (ячейка){
 возврат ячейки & & cell.- есть время ? Служебные программы.formatDate(ячейка, сессия.getScriptTimeZone (), "гггг-ММ-ДД"): ячейка;
    });
  });
}


функция dataToHtmlTable_(данные){
 возвращение JSON.stringify(данные, null, " ")
 .заменить (/^[/g, " <таблица>")
 .заменить (/]$ / g, " < / table>")
 .заменить(/^ss[$/mg, " <tr>")
 .заменить(/^ss], {0,1}$ / mg, " < / tr>")
 .заменить(/^s{4} " {0,1}(.*?)"{0,1},{0,1}$/mg, " <td > $1<td > < / td>");
}

Содержание

  1. Exceltip
  2. Блог о программе Microsoft Excel: приемы, хитрости, секреты, трюки
  3. Три способа отправить письмо из Excel с помощю VBA
  4. Отправить письмо в Excel с помощью VBA
  5. Отправить письмо в Excel с помощью CDO
  6. Отправить письмо в Excel с помощью Send Keys
  7. Как отправить письмо из Excel?
  8. Поиск по меткам

Exceltip

Блог о программе Microsoft Excel: приемы, хитрости, секреты, трюки

Три способа отправить письмо из Excel с помощю VBA

Excel позволяет создавать диаграммы высокого качества, работать с огромным количеством данных, обрабатывать картинки, блок-схемы и многое другое. И даже если вам и этого не достаточно, можно использовать Excel для автоматической отправки писем с помощью встроенного VBA редактора.

Данная статья описывает три способа отправки писем с помощью VBA в Excel. Вы можете скачать файл с примером отправки email с помощью VBA в Excel.

Отправить письмо в Excel с помощью VBA

Один из самых простых способов для автоматизации отправки почты с Excel заключается в вызове функции Create («ObjectOutlook.Application»). Данная функция возвращающает ссылку на ActiveX объект (в данном случает приложение Outlook), которое затем используется для создания и отправки электронной почты.

Чтобы проверить данный способ в работе, скопируйте и вставьте код ниже в VB редактор.

В качестве напоминания: Когда вы пытаетесь отправить письмо вышеуказанным способом, система безопасности будет выдавать каждый раз предупреждающее окно, в котором будет говориться о том, что Программа пытается отправить сообщение от вашего имени… и возможности обойти этот шаг нет.

К счастью, существует еще два способа, с помощью которых данный вопрос может быть решен: первый – через использование CDO, второй – имитирующий использование событий нажатий клавиш клавиатуры.

Отправить письмо в Excel с помощью CDO

Что такое CDO? CDO является библиотекой объектов, которая предоставляет интерфейс Messaging Application Programming Interface (MAPI). CDO позволяет манипулировать обменом данных, и отправлять и получать сообщения.

Использование CDO может быть предпочтительно в случаях, когда вы хотите предотвратить появление вплывающих окон безопасности Программа пытается отправить сообщение от вашего имени… и следовательно, предотвратить задержку отправки сообщения.

В нашем примере мы используем функцию CreateObject («CDO.Message»). Важно отметить, что необходимо правильно установить конфигурацию SMTP сервера, чтобы не допустить появления ошибок Run-time error 2147220973(80040213) или sendUsing configuration value is invalid. Пример ниже настроен на отправку сообщений через почту Google (Gmail). Для других почтовых серверов, вам потребуется ввести свои значения SMTP-сервера и SMTP-порта.

Обратите внимание, чтобы воспользоваться данным методом вам необходимо подключить библиотеку CDO в редакторе макросов Tool –> References.

Отправить письмо в Excel с помощью Send Keys

Другой способ отправки email с помощью Excel – использование команды ShellExecute, которая выполняет любую программу в VBA. Команда ShellExecute используется для загрузки документа с соответствующей программой. По сути, вы создаете объект String (текстовые данные) и передаете его в качестве параметра для функции ShellExecute. Остальная часть операций выполняется в окнах. Автоматически определяется, какая программа связана с данным типом документа и используется для загрузки документа. Вы можете использовать функцию ShellExecute, чтобы открыть Internet Explorer, Word, Paint и множество других приложений. В коде ниже используется задержка в три секунды, чтобы убедиться, что отправляемое письмо корректно и для возможности предотвратить отправку, если вы вдруг нашли какие-нибудь недочеты.

Источник

Как отправить письмо из Excel?

Прежде чем начать читать статью прошу принять к сведению объявление: используйте СВОИ АДРЕСА ЭЛ.ПОЧТЫ при тестировании кодов . Не надо отсылать письма на указанные в статье e-mail адреса- это все приходит мне на почту. Помимо этого Вы сами не сможете понять работает или нет, т.к. письма придут мне, а не Вам.
Спасибо за понимание
P.S. А если написанное выше Вы все же проигнорировали и отправили письмо на мои адреса электронной почты — это означает, что Вы соглашаетесь с тем, что вся информация внутри письма, включая вложения, может быть использована мной без ограничений в личных целях.

Отправить письмо из Excel можно несколькими способами, в том числе и через написание кода в VBA.

Отправка через меню Excel
Отправку без кода осуществить достаточно просто:

    Excel 2003 : Файл (File)Отправить (Send To)Сообщение (Mail Recipient)
    и выбрать способ отправки:
  • Сообщение (Mail Recipient) — создается сообщение в программе по умолчанию для отправки электронных писем
  • Сообщение (для ознакомления) (Mail Recipient for Review) — вполне интересный вариант. Перед отправкой для книги включается отслеживание изменений(Сервис (Tools)Исправления (Track changes) ). Можно воспользоваться этим методом, чтобы отправить получателю для внесения им изменений, а после отследить их(СервисИсправленияВыделить исправления (Highlight changes) )
  • Сообщение (как вложение) (Mail Recipient as attachment) — создается сообщение в программе по умолчанию для отправки электронных писем, в которое вложением вкладывается активная книга целиком
  • По маршруту (Routing Recipient) — практически тоже самое, что и Сообщение (для ознакомления) (Mail Recipient for Review) с той разницей, что письмо с вложением пересылается как эстафета от одного получателя к другому. После этого так же можно отследить изменения, внесенные каждым пользователем
  • Папка Exchange (Exchange folder) — активная книга автоматически сохраняется в заданную папку общего сервера Microsoft Exchange. Доступ к этой книге будет открыт всем участникам рабочей группы
  • Факс пользователю службы факсов интернета (Fax) — отправляет содержимое книги по факсу указанным получателям. Для использования данной возможности должна быть установлена служба факсов
  • Excel 2007 : Кнопка ОфисОтправить (Send)Сообщение (E-mail)
  • Excel 2010 : Файл (File)Сохранить и отправить (Save & Send)Отправить (Send Using E-mail)

    Далее выбирается способ отправки:

    • Как вложение (Send as attachment) — будет автоматически запущена почтовая программа по умолчанию и создано новое письмо, в которое уже будет вложен файл книги, из которой была вызвана команда
    • Как ссылку (Send link) — доступно, только если файл находится на сетевом ресурсе. После нажатия будет создано новое письмо в почтовой программе по умолчанию, в тело которого будет вставлена ссылка на книгу
    • Как PDF (Send as PDF) — файл будет автоматически сохранен в формате PDF, далее будет создано новое письмо в почтовой программе по умолчанию и файл PDF будет вставлен в письмо
    • Как XPS (Send as XPS) — файл будет автоматически сохранен в формате PDF, далее будет создано новое письмо в почтовой программе по умолчанию и файл PDF будет вставлен в письмо
    • Отправить как факс через интернет (Send as internet fax) — если у вас на ПК установлена служба работы с факсами и есть возможность отправлять и получать факсы на ПК — то данная команда отправит данные активного листа файла как факс
  • Простая отправка книги через VBA без Outlook
    Описанные выше действия можно выполнить так же кодом(так же будет использоваться программа, установленная по умолчанию для отправки писем):

    Sub SendMailStandart() ActiveWorkbook.SendMail «mail1@excel-vba.ru», «Тема письма» End Sub

    Также можно указать несколько получателей:

    Sub SendMailStandart_MassRecipients() ActiveWorkbook.SendMail Array(«mail1@excel-vba.ru», «mail2@excel-vba.ru»), «Тема письма» End Sub

    Внутри скобок Array можно в кавычках через запятую указать достаточное количество получателей.
    Данный метод универсален, но работает только с активным файлом. Нельзя выбрать файл с диска и отправить как вложение. Кроме того, нельзя отправить более одного файла разом и указать текст письма.
    Поэтому очень часто на форумах возникает вопрос как отправить письмо из Excel кодом с указанием темы, текста и вложения.
    Есть несколько вариантов:

    Отправить письмо через Outlook кодом VBA

    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 ‘раскомментировать строку, если в Outlook несколько учетных записей и нужно подключиться к конкретной(только если Outlook закрыть) ‘ [параметры]: Session.Logon «имя профиля»,»пароль»,[показывать окно выбора профиля], [запускать в новой сессии] ‘objOutlookApp.Session.Logon «profile»,»1234″,False, True 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 ‘тема сообщения .Body = sBody ‘текст сообщения ‘.HTMLBody = sBody ‘если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.) ‘добавляем вложение, если файл по указанному пути существует(dir проверяет это) If sAttachment <> «» Then If Dir(sAttachment, 16) <> «» Then .Attachments.Add sAttachment ‘просто вложение ‘чтобы отправить активную книгу вместо sAttachment указать ActiveWorkbook.FullName End If End If .Send ‘Display, если необходимо просмотреть сообщение, а не отправлять без просмотра End With Set objOutlookApp = Nothing: Set objMail = Nothing Application.ScreenUpdating = True End Sub

    Этот код отправляет одно письмо и одно вложение за раз. Но если несколько раз вызвать метод .Attachments.Add, то можно добавить еще файлы:

    .Attachments.Add «C:TempКнига1.xlsx» .Attachments.Add «C:TempКнига2.xlsx» .Attachments.Add «C:DocumentsReport.rar»

    objOutlookApp.Session.Logon «user»,»1234″,False, True

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

    Важно помнить: пути для файлов в качестве вложений должны содержать полный путь до файла, включая его имя и расширение: C:DocumentsReport.rar . При указании только имени Report.rar или пути без расширения ( C:DocumentsReport ) ошибки не будет, но вложения не будут помещены в сообщения и адресату отправится письмо без вложений.

    Этот код создает сообщение, но есть маленький нюанс — если в Outlook настроено добавление подписей в новые сообщения — то созданные кодом VBA письма игнорирует эту настройку(особенность Outlook, так назовем). Поэтому, если необходимо отправлять письма с подписью, то ознакомьтесь со статьей: Вставить в письмо подпись из Outlook через VBA
    В этой же статье можно посмотреть пример составления письма с форматированным текстом.

    Отправить письма через Outlook с картинкой в теле письма

    Sub Send_Mail_With_Picture() Dim objOutlookApp As Object, objMail As Object Dim sTo As String, sSubject As String, sBody As String, sAttachment As String, sPicture 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 «user»,»1234″,False, True 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) sPicture = «C:ДокументыИзображенияExcel_vba_ru.png» ‘если надо вставить в письмо картинку ‘создаем сообщение With objMail .To = sTo ‘адрес получателя .CC = «» ‘адрес для копии .BCC = «» ‘адрес для скрытой копии .Subject = sSubject ‘тема сообщения ‘ .Body = sBody ‘текст сообщения без форматирования .HTMLBody = sBody ‘если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.) ‘чтобы картинка была видна внутри сообщения — надо её сначала добавить как вложение ‘если картинка по указанному пути существует(dir проверяет это) If Dir(sPicture, 16) <> «» Then If Dir(sPicture, 16) <> «» Then .Attachments.Add sPicture ‘теперь вставляем код картинки .HTMLBody = .HTMLBody & «

    Картинка в письме

    » & » » ‘ & » height=240 width=180>» ‘» height=240 width=180>» — если нужны размеры картинки End If End If ‘добавляем вложение, если файл по указанному пути существует(dir проверяет это) If sAttachment <> «» Then If Dir(sAttachment, 16) <> «» Then .Attachments.Add sAttachment ‘просто вложение End If End If .Send ‘Display, если необходимо просмотреть сообщение, а не отправлять без просмотра End With Set objOutlookApp = Nothing: Set objMail = Nothing Application.ScreenUpdating = True End Sub

    Этот код отправляет одно письмо и вставляет одну картинку. За это отвечает строка

    Если картинку надо вложить с заранее указанными размерами, то строка будет выглядеть так:

    » » ‘height — высота ‘width — ширина

    Если надо добавить несколько картинок, то метод .Attachments.Add sPicture надо будет вызвать столько раз, сколько картинок(для каждого свой путь к картинке).

    Важно помнить: пути для картинок должны содержать полный путь до файла, включая его имя и расширение: C:ДокументыИзображенияExcel_vba_ru.png . При указании только имени Excel_vba_ru.png или пути без расширения ( C:ДокументыИзображенияExcel_vba_ru ) ошибки не будет, но картинка не будет вставлена, а вместо неё скорее всего будет текст «Ошибка загрузки картинки!» или пустой квадрат вместо реальной картинки.

    Sub Send_Mail_Mass() Dim objOutlookApp As Object, objMail As Object Dim sTo As String, sSubject As String, sBody As String, sAttachment As String Dim lr As Long, lLastR As Long 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 ‘произошла ошибка создания объекта — выход If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub ‘objOutlookApp.Session.Logon «user»,»1234″,False, True lLastR = Cells(Rows.Count, 1).End(xlUp).Row ‘цикл от второй строки(начало данных с адресами) до последней ячейки таблицы For lr = 2 To lLastR Set objMail = objOutlookApp.CreateItem(0) ‘создаем новое сообщение ‘создаем сообщение With objMail .to = Cells(lr, 1).Value ‘адрес получателя .Subject = Cells(lr, 2).Value ‘тема сообщения .Body = Cells(lr, 3).Value ‘текст сообщения ‘вложение(если ячейка не пустая и путь к файлу указан правильно) If Cells(lr, 4).Value <> «» Then If Dir(Cells(lr, 4).Value, 16) <> «» Then .Attachments.Add Cells(lr, 4).Value End If End If .Send ‘Display, если необходимо просмотреть сообщение, а не отправлять без просмотра End With Next lr Set objOutlookApp = Nothing: Set objMail = Nothing Application.ScreenUpdating = True End Sub

    Скачать пример массовой рассылки:

    Массовая рассылка писем через Outlook.xls (60,0 KiB, 6 946 скачиваний)

    При использовании этих кодов есть один недостаток: очень часто при программной отправке писем Outlook выдает окно с запросом подтверждения отправки. Сообщение может быть трех видов:

    • Программа пытается получить доступ к адресам электронной почты, хранящимся в Outlook. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы.
    • Программа пытается отправить сообщение от вашего имени. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы.
    • Программа пытается выполнить действие, которое может привести к отправке сообщения от вашего имени. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы

    Чтобы при программной отправке данных сообщений не появлялось, в версиях Outlook, начиная с 2007 можно отключить его настройками безопасности:

    • Outlook 2007 : МенюПараметрыЦентр управления безопасностьюПрограммный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется)
    • Outlook 2010 и выше : ФайлПараметрыЦентр управления безопасностьюПрограммный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется)

    ВАЖНО: Если компьютер управляется администратором Microsoft Exchange или Microsoft Windows Active Directory Domain Services и администратором в качестве параметров по умолчанию установлен запрет на внесение изменений в параметры безопасности пользователями, возможность изменения данных настроек безопасности программного доступа будет недоступна.

    Важно: сам код рассылки не имеет никаких ограничений по числу отправляемых сообщений. Но различные почтовые серверы могут устанавливать свои лимиты. Например, Gmail и Yandex могут заблокировать email, с которого ведется рассылка, если общее количество отправленных сообщений превышает 100 штук в день. Поэтому производить важные массовые рассылки рекомендуется с собственного SMTP-сервера.

    Отправка сообщения без использования Outlook — используем CDO

    Option Explicit Sub Send_Mail() Const CDO_Cnf = «http://schemas.microsoft.com/cdo/configuration/» Dim oCDOCnf As Object, oCDOMsg As Object Dim SMTPserver As String, sUsername As String, sPass As String, sMsg As String Dim sTo As String, sFrom As String, sSubject As String, sBody As String, sAttachment As String On Error Resume Next ‘sFrom – как правило совпадает с sUsername SMTPserver = «smtp.yandex.ru» ‘ SMTPServer: для Mail.ru «smtp.mail.ru»; для Яндекса «smtp.yandex.ru»; для Рамблера «mail.rambler.ru» sUsername = «YourMail@mail.ru» ‘ Учетная запись на сервере sPass = «1234» ‘ Пароль к почтовому аккаунту If Len(SMTPserver) = 0 Then MsgBox «Не указан SMTP сервер», vbInformation, «www.Excel-VBA.ru»: Exit Sub If Len(sUsername) = 0 Then MsgBox «Не указана учетная запись», vbInformation, «www.Excel-VBA.ru»: Exit Sub If Len(sPass) = 0 Then MsgBox «Не указан пароль», vbInformation, «www.Excel-VBA.ru»: Exit Sub sTo = «AddressTo@mail.ru» ‘Кому sFrom = «YourMail@yandex.ru» ‘От кого sSubject = «Автоотправка» ‘Тема письма sBody = «Привет от Excel-VBA» ‘Текст письма sAttachment = «C:/Temp/Книга1.xls» ‘Вложение(полный путь к файлу) ‘Назначаем конфигурацию CDO Set oCDOCnf = CreateObject(«CDO.Configuration») With oCDOCnf.Fields .Item(CDO_Cnf & «sendusing») = 2 .Item(CDO_Cnf & «smtpauthenticate») = 1 .Item(CDO_Cnf & «smtpserver») = SMTPserver ‘если необходимо указать SSL ‘.Item(CDO_Cnf & «smtpserverport») = 465 ‘для Яндекса и Gmail 465 ‘.Item(CDO_Cnf & «smtpusessl») = True ‘===================================== .Item(CDO_Cnf & «sendusername») = sUsername .Item(CDO_Cnf & «sendpassword») = sPass .Update End With ‘Создаем сообщение Set oCDOMsg = CreateObject(«CDO.Message») With oCDOMsg Set .Configuration = oCDOCnf .BodyPart.Charset = «koi8-r» .From = sFrom .To = sTo .Subject = sSubject .TextBody = sBody ‘Проверка наличия файла по указанному пути If Len(sAttachment) > 0 Then If Dir(sAttachment, 16) <> «» Then .AddAttachment sAttachment End If End If .Send End With Select Case Err.Number Case -2147220973: sMsg = «Нет доступа к Интернет» Case -2147220975: sMsg = «Отказ сервера SMTP» Case 0: sMsg = «Письмо отправлено» Case Else: sMsg = «Ошибка номер: » & Err.Number & vbNewline & «Описание ошибки: » & Err.Description End Select MsgBox sMsg, vbInformation, «www.Excel-VBA.ru» Set oCDOMsg = Nothing: Set oCDOCnf = Nothing End Sub

    Данный код отправляет письмо, используя объект CDO (Collaboration Data Objects — присутствует во всех версиях Windows) и от имени Вашей учетной записи(либо Яндекс, либо Мэйл, либо Рамблер либо др.).

    • SMTPserver — Каждый из приведенных выше сервисов имеет свой сервер для отправки сообщений(его можно посмотреть на сайте сервиса). В комментариях к коду я написал три самых распространенных, но если Вы используете какой-то другой, то просто посмотрите на его сайте настройки для Outlook и отыщите тот параметр, который отвечает за SMTPserver .
    • sUsername — это Ваш логин для входа в почтовый сервис. Думаю тут все понятно. Единственный момент — обязательно указывать e-mail именно в полном виде — YourMail@mail.ru , даже если для входа на сервис через браузер Вы используете только первую часть записи(YourMail). Если необходимо подставить в качестве отправителя псевдоним(чтобы получатель видел не просто адрес, а ассоциированное имя учетной записи), то указывать надо именно в формате псевдонима:

    Excel-vba — и есть псевдоним. А сам адрес должен указываться между знаками <>

  • sPass — пароль доступа к Вашей учетной записи, который Вы используете для входа в почту.
  • Это основные моменты. Поля Кому(sTo) , От кого(sFrom) , Тема письма(sSubject) , Текст письма(sBody) и Вложение(sAttachment) думаю не нуждаются в расшифровке.
    Так же стоит учесть пару важных моментов: если на почтовом сервере используется шифрование, то необходимо раскомментировать(убрать знак апострофа) эти строки:

    .Item(CDO_Cnf & «smtpserverport») = 465 .Item(CDO_Cnf & «smtpusessl»)

    Иначе вместо отправки письма получим ошибку «Отказ сервера SMTP». Серверы Яндекс и Gmail требуют шифрования, а значит для них указанные выше строки должны быть активированы(т.е. раскомментированы). Номер порта указывается в описании настроек сервера и для каждого сервера может быть своим, поэтому если с указанием приведенного в коде порта( «smtpserverport» ) письмо не отправляется — необходимо зайти в настройки почтового сервера и убедиться в правильности указания номера порта.

    Чтобы использовать данный код вы можете либо просто скопировать его прямо со страницы, либо скачать файл. В файле программа немного упрощена к использованию — в ячейки листа вам необходимо будет внести поля: Кому(sTo), От кого(sFrom),Тема письма(sSubject), Текст письма(sBody) и Вложение(sAttachment) и выбрать SMTPserver. SMTPserver выбирается из выпадающего списка. Сам список является динамическим и расположен на листе «Settinngs«. Там же расположены поля Учетной записи и Пароль, которые автоматически подставляются в необходимые поля на листе «Отправка«. Т.к. список динамический Вы можете просто добавлять к уже имеющимся новые сервисы и потом просто выбирать их из списка. Так же в файле есть еще одна возможность — выбрать файл. Для этого надо просто нажать на кнопку и выбрать файл.

    Массовая рассылка писем через CDO — без Outlook.xls (64,0 KiB, 7 527 скачиваний)

    Ввиду все более участившихся вопросов о том, как добавить к тексту письма картинку именно через CDO — описываю как это можно сделать. Я приведу лишь самый главный кусок кода — создание непосредственно сообщения. Весь остальной код остается таким же, как приведен выше.

    With oCDOMsg Set .Configuration = oCDOCnf .From = sFrom .BodyPart.Charset = «windows-1251» .To = sTo .Subject = sSubject Set objbp = oCDOMsg.AddRelatedBodyPart(«C:ДокументыИзображения11.jpg», «11.jpg», 1) objbp.Fields.Item(«urn:schemas:mailheader:Content-ID») = » » objbp.Fields.Update If Len(sAttachment) > 0 Then If Dir(sAttachment, 16) <> «» Then .AddAttachment sAttachment End If End If ‘для вложения картинки письмо лучше формировать в формате HTML .HTMLBody = »
    » & sBody .Send End With

    Самый главный момент:
    AddRelatedBodyPart

      C:ДокументыИзображения11.jpg — указывается полный путь к файлу картинки на компьютере, включая расширение файла.
      11.jpg — указывается имя картинки с расширением. Это имя будет использовано внутри письма и именно его необходимо будет указать дальше в » urn:schemas:mailheader:Content-ID «. И указывать обязательно в треугольных скобках: » »
      внутри же самого письма в том месте, где должна отображаться картинки надо записать:

    в приведенном выше коде картинка вставляется в самом начале письма и после неё так же добавляется перенос на новую строку при помощи тэга

    Статья помогла? Поделись ссылкой с друзьями!

    Поиск по меткам

    Большое спасибо! Лучшего описания не видел. Использовал Ваш код CDO отсылки почты в MS Access — работает прекрасно.

    Здравствуйте, Дмитрий. Огромное спасибо за данный файл !
    Скачал Массовая рассылка писем через Outlook.xls
    Подскажите пожалуйста, как при отправке убрать окно предварительного просмотра сообщения в аутлук ?
    в коде нашёл строку с комментарием
    .Display = ‘, если необходимо просмотреть сообщение, а не отправлять без просмотра
    а что туда вписывать, не пойму
    Пробовал вообще её убирать или дописывать =false
    не помогает

    Андрей, вместо .Display надо просто записать .Send

    Огромное спасибо ! Всё работает

    для отправки сообщения использовал код «ОТПРАВИТЬ ПИСЬМО ЧЕРЕЗ OUTLOOK КОДОМ VBA»
    проблема в том, что в ячейку (откуда тянутся пути файлов) может быть вписано несколько файлов (до 20-30)

    значение ячейки имеет вот такой вид (указывается в одной строке):
    «\fuib.comkhoDOCUMENTYOOKUTUКулиничев! открытие счетовe-tokenписьмо на заказ.docx»; «\fuib.comkhoDOCUMENTYOOKUTUКулиничев! открытие счетовe-tokenакт.doc»; «\fuib.comkhoDOCUMENTYOOKUTUКулиничев! открытие счетовтарифыРаздел 1. Расчетно-кассовое обслуживание.doc»

    при это отправляется только первый файл

    помогите, пожалуйста, чтобы добавляло в сообщение Outlook все файлы, адреса, которых указаны в ячейке

    Добрый день, Дмитрий. А можно ли так сделать, чтоб из выбранного списка (где у Вас имя, почта) добавить еще один столбец с датой (будущей). Если текущая дата Дмитрий :

    Александр, сделать можно. Добавляйте и в цикле проверяйте:

    For lr = 2 To lLastR If Date «» Then If Dir(Cells(lr, 4).Value, 16) <> «» Then .Attachments.Add Cells(lr, 4).Value End If End If .Send ‘Display, если необходимо просмотреть сообщение, а не отправлять без просмотра End With End If Next lr

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

    Николай, для этого достаточно было посмотреть ссылки внизу статьи 🙂 Среди них есть и такая: Вставить в письмо Outlook таблицу Excel с форматированием

    Дмитрий, добрый день!
    Скачал и протестировал Ваш вариант с CDO. Все прекрасно работает, когда кнопка запуска находится на странице с адресами, как в Вашем примере. Но мне нужно запускать этот процесс с кнопки на форме без открытия этой страницы. А вот это никак не получается реализовать. Буду благодарен, если подскадете способ, если такая возможность вообще есть.
    С уважением.

    RICK78, советую ознакомиться с этой статьей: Как обратиться к диапазону из VBA . Если вкратце:

    Лист1 — имя листа, из которого брать значения ячеек.

    Дмитрий, огромное спасибо за быстрый и понятный ответ. Все получилось!
    С уважением,

    Источник

    письмо excel

    Excel позволяет создавать диаграммы высокого качества, работать с огромным количеством данных, обрабатывать картинки, блок-схемы и многое другое. И даже если вам и этого не достаточно, можно использовать Excel для автоматической отправки писем с помощью встроенного VBA редактора.

    Данная статья описывает три способа отправки писем с помощью VBA в Excel. Вы можете скачать файл с примером отправки email с помощью VBA в Excel.

    Отправить письмо в Excel с помощью VBA

    Один из самых простых способов для автоматизации отправки почты с Excel заключается в вызове функции Create («ObjectOutlook.Application»). Данная функция возвращающает ссылку на ActiveX объект (в данном случает приложение Outlook), которое затем используется для создания и отправки электронной почты.

    Чтобы проверить данный способ в работе, скопируйте и вставьте код ниже в VB редактор.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    Sub Send_Email_Using_VBA()
    Dim Email_Subject, Email_Send_From, Email_Send_To, _
    Email_Cc, Email_Bcc, Email_Body As String
    Dim Mail_Object, Mail_Single As Variant
    Email_Subject = «Попытка отправить письмо с помощью VBA»
    Email_Send_From = «exceltipmail@gmail.com»
    Email_Send_To = » exceltipmail@gmail.com «
    Email_Cc = » exceltipmail@gmail.com «
    Email_Bcc = » exceltipmail@gmail.com «
    Email_Body = «Поздравляем!!!! Ваше письмо успешно отправлено !!!!»
    On Error GoTo debugs
    Set Mail_Object = CreateObject(«Outlook.Application»)
    Set Mail_Single = Mail_Object.CreateItem(0)
    With Mail_Single
    .Subject = Email_Subject
    .To = Email_Send_To
    .cc = Email_Cc
    .BCC = Email_Bcc
    .Body = Email_Body
    .send
    End With
    debugs:
    If Err.Description &lt;&gt; «» Then MsgBox Err.Description
    End Sub

    В качестве напоминания: Когда вы пытаетесь отправить письмо вышеуказанным способом, система безопасности будет выдавать каждый раз предупреждающее окно, в котором будет говориться о том, что Программа пытается отправить сообщение от вашего имени… и возможности обойти этот шаг нет.

    предупреждение об отправке письма

    К счастью, существует еще два способа, с помощью которых данный вопрос может быть решен: первый – через использование CDO, второй – имитирующий использование событий нажатий клавиш клавиатуры.

    Отправить письмо в Excel с помощью CDO

    Что такое CDO? CDO является библиотекой объектов, которая предоставляет интерфейс Messaging Application Programming Interface (MAPI). CDO позволяет манипулировать обменом данных, и отправлять и получать сообщения.

    Использование CDO может быть предпочтительно в случаях, когда вы хотите предотвратить появление вплывающих окон безопасности Программа пытается отправить сообщение от вашего имени… и следовательно, предотвратить задержку отправки сообщения.

    В нашем примере мы используем функцию CreateObject («CDO.Message»). Важно отметить, что необходимо правильно установить конфигурацию SMTP сервера, чтобы не допустить появления ошибок Run-time error 2147220973(80040213) или sendUsing configuration value is invalid. Пример ниже настроен на отправку сообщений через почту Google (Gmail). Для других почтовых серверов, вам потребуется ввести свои значения SMTP-сервера и SMTP-порта.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    Sub CDO_Mail_Small_Text_2()
    Dim iMsg As Object
    Dim iConf As Object
    Dim strbody As String
    Dim Flds As Variant
    Set iMsg = CreateObject(«CDO.Message»)
    Set iConf = CreateObject(«CDO.Configuration»)
    iConf.Load -1
    Set Flds = iConf.Fields
    With Flds
    .Item(«https://schemas.microsoft.com/cdo/configuration/smtpusessl») = True
    .Item(«https://schemas.microsoft.com/cdo/configuration/smtpauthenticate») = 1
    .Item(«https://schemas.microsoft.com/cdo/configuration/sendusername») = «Полный адрес вашего GMail ящика»
    .Item(«https://schemas.microsoft.com/cdo/configuration/sendpassword») = «GMail пароль»
    .Item(«https://schemas.microsoft.com/cdo/configuration/smtpserver») = «smtp.gmail.com»
    .Item(«https://schemas.microsoft.com/cdo/configuration/sendusing») = 2
    .Item(«https://schemas.microsoft.com/cdo/configuration/smtpserverport») = 465
    .Update
    End With
    strbody = «Поздравляем!!!! Ваше письмо успешно отправлено !!!!»
    With iMsg
    Set .Configuration = iConf
    .To = «Почтовый адрес получателя»
    .CC = «»
    .BCC = «»
    .From = «»«ВашеИмя»» &lt;Reply@something.nl&gt;»
    .Subject = «Попытка отправить письмо с помощью CDO»
    .TextBody = strbody
    .Send
    End With
    End Sub

    Обратите внимание, чтобы воспользоваться данным методом вам необходимо подключить библиотеку CDO в редакторе макросов Tool –> References.

    Отправить письмо с помощью CDO

    Отправить письмо в Excel с помощью Send Keys

    Другой способ отправки email с помощью Excel – использование команды ShellExecute, которая выполняет любую программу в VBA. Команда ShellExecute используется для загрузки документа с соответствующей программой. По сути, вы создаете объект String (текстовые данные) и передаете его в качестве параметра для функции ShellExecute. Остальная часть операций выполняется в окнах. Автоматически определяется, какая программа связана с данным типом документа и используется для загрузки документа. Вы можете использовать функцию ShellExecute, чтобы открыть Internet Explorer, Word, Paint и множество других приложений. В коде ниже используется задержка в три секунды, чтобы убедиться, что отправляемое письмо корректно и для возможности предотвратить отправку, если вы вдруг нашли какие-нибудь недочеты.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    Sub Send_Email_Using_Keys()
    Dim Mail_Object As String
    Dim Email_Subject, Email_Send_To, Email_Cc, Email_Bcc, Email_Body As String
    Email_Subject = «Попытка отправить письмо с помощью SendKeys»
    Email_Send_To = «exceltipmail@gmail.com «
    Email_Cc = «exceltipmail@gmail.com «
    Email_Bcc = «exceltipmail@gmail.com «
    Email_Body = «Поздравляем!!!! Ваше письмо успешно отправлено !!!!»
    Mail_Object = «mailto:» & Email_Send_To & «?subject=» & Email_Subject & «&body=» & Email_Body & «&cc=» & Email_Cc & «&bcc=» & Email_Bcc
    On Error GoTo debugs
    ShellExecute 0&, vbNullString, Mail_Object, vbNullString, vbNullString, vbNormalFocus
    Application.Wait (Now + TimeValue(«0:00:03»))
    Application.SendKeys «^({ENTER})»
    Application.SendKeys («{ENTER}»)
    debugs:
    If Err.Description <> «» Then MsgBox Err.Description
    End Sub

    Cкачать файл с примером отправки email с помощью VBA в Excel

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

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

    • открыть почтовую программу (например 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 текущего листа.

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

    • Групповая рассылка почтовых сообщений из Excel с помощью надстройки PLEX
    • Макросы для отправки почты из Excel через Lotus Notes от Dennis Wallentin
    • Что такое макросы, куда вставлять код макроса на Visual Basic
    • Создание писем с помощью функции ГИПЕРССЫЛКА

    Отправка e-mail уведомления по условию

    VIDEO56

    Дата: Среда, 26.08.2015, 13:18 |
    Сообщение № 1

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 262


    Репутация:

    23

    ±

    Замечаний:
    0% ±


    Excel 2010

    Добрый день!
    Прошу помочь в решении задачи. Есть файл который на ежедневной основе ведут менеджеры. Задача в следующем при введении суммы оплаты факт в столбце Q формировалось письмо с указанием клиента в этой же строке из столба А, номера договора (столб Н), и рассылка была привязана к двум почтовым адресам, и указанием пути к файлу где лежит заявка (например корень диска С).

    К сообщению приложен файл:

    7419908.xlsm
    (16.2 Kb)


    Всем удачного дня!

    Сообщение отредактировал VIDEO56Среда, 26.08.2015, 13:19

     

    Ответить

    KSV

    Дата: Среда, 26.08.2015, 22:18 |
    Сообщение № 2

    Группа: Друзья

    Ранг: Ветеран

    Сообщений: 770


    Репутация:

    255

    ±

    Замечаний:
    0% ±


    Excel 2013

    Добрый вечер!
    Можно так: [vba]

    Код

    Private Sub Worksheet_Change(ByVal Target As Range)
          If Target.Column <> 17 Then Exit Sub
          Dim r&: r = Target.Row: If r < 3 Then Exit Sub
          With CreateObject(«Outlook.Application»)
              With .CreateItem(0)
                  .To = «e-mail1@domain.com; e-mail2@domain.com »
                  .Subject = «Оплата по договору № » & Cells(r, 8) & » от » & Cells(r, 11) & »   » & Cells(r, 1)
                  .Body = «Контрагент: » & Cells(r, 1) & vbCrLf & _
                          «Договор № » & Cells(r, 8) & » от » & Cells(r, 11) & vbCrLf & _
                          «Сумма по договору: » & Cells(r, 9) & vbCrLf & _
                          «Оплачено: » & Cells(r, 17) & »   (» & Cells(r, 16) & «)»
                  .Attachments.Add «C:FileName.ext»
                  ‘.Display ‘ если нужно посмотреть письмо
                  .Send
              End With
              .Quit
          End With
    End Sub

    [/vba]

    К сообщению приложен файл:

    8922811.xlsm
    (24.3 Kb)


    KSV.VBA@gmail.com
    Яндекс.Деньги: 410011921213333

    Сообщение отредактировал KSVСреда, 26.08.2015, 22:57

     

    Ответить

    EvgenyD

    Дата: Среда, 26.08.2015, 22:25 |
    Сообщение № 3

    Группа: Пользователи

    Ранг: Участник

    Сообщений: 74


    Репутация:

    19

    ±

    Замечаний:
    0% ±


    Excel 2013

    VIDEO56, если воспользоваться поиском, то вариантов организации отправки e-mail найдете не один.
    Я пользуюсь таким:
    [vba]

    Код

    Sub Send_Mail()
         Const CDO_Cnf = «http://schemas.microsoft.com/cdo/configuration/»
         Dim oCDOCnf As Object, oCDOMsg As Object
         Dim SMTPserver As String, sUsername As String, sPass As String, sMsg As String
         Dim sTo As String, sFrom As String, sSubject As String, sBody As String, sAttachment As String, Header As String
         ‘On Error Resume Next
         ‘sFrom – как правило совпадает с sUsername
         SMTPserver = «smtp.yandex.ru»    ‘ SMTPServer: для Mail.ru «smtp.mail.ru»; для Яндекса «smtp.yandex.ru»; для Рамблера «mail.rambler.ru»
         sUsername = «»    ‘ Учетная запись на сервере
         sPass = «»    ‘ Пароль к почтовому аккаунту

            If Len(SMTPserver) = 0 Then MsgBox «Не указан SMTP сервер», vbInformation, «Недостаточно данных»: Exit Sub
         If Len(sUsername) = 0 Then MsgBox «Не указана учетная запись», vbInformation, «Недостаточно данных»: Exit Sub
         If Len(sPass) = 0 Then MsgBox «Не указан пароль», vbInformation, «Недостаточно данных»: Exit Sub

            sTo = «»    ‘Кому
         sFrom = «»    ‘От кого
         sSubject = «»   ‘Тема письма
         sBody = «»    ‘Текст письма
         sAttachment = «»    ‘Вложение(полный путь к файлу)
         ‘Проверка наличия файла по указанному пути
         If Dir(sAttachment, vbDirectory) = «» Then sAttachment = «»
         ‘Назначаем конфигурацию CDO
         Set oCDOCnf = CreateObject(«CDO.Configuration»)
         With oCDOCnf.Fields
             .Item(CDO_Cnf & «sendusing») = 2
             .Item(CDO_Cnf & «smtpauthenticate») = 1
             .Item(CDO_Cnf & «smtpserver») = SMTPserver
             ‘если необходимо указать SSL
             .Item(CDO_Cnf & «smtpserverport») = 25 ‘для Яндекса и Gmail 465
             .Item(CDO_Cnf & «smtpusessl») = True
             ‘=====================================
             .Item(CDO_Cnf & «sendusername») = sUsername
             .Item(CDO_Cnf & «sendpassword») = sPass
             .Update
         End With
         ‘Создаем сообщение
         Set oCDOMsg = CreateObject(«CDO.Message»)
         With oCDOMsg
             Set .Configuration = oCDOCnf
             .BodyPart.Charset = «koi8-r»
             .From = sFrom
             .To = sTo
             .Subject = sSubject
             .HTMLBody = «<html><body><div>» & sBody & «</div></body></html>»
             ‘.TextBody = sBody
             If Len(sAttachment) > 0 Then .AddAttachment sAttachment
             .send
         End With

            Select Case Err.Number
         Case -2147220973: sMsg = «Нет доступа к Интернет»
         Case -2147220975: sMsg = «Отказ сервера SMTP»
         Case 0: sMsg = «Письмо отправлено»
         End Select
         ‘MsgBox sMsg, vbInformation
         Set oCDOMsg = Nothing: Set oCDOCnf = Nothing
    End Sub

    [/vba]

     

    Ответить

    VIDEO56

    Дата: Четверг, 27.08.2015, 09:01 |
    Сообщение № 4

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 262


    Репутация:

    23

    ±

    Замечаний:
    0% ±


    Excel 2010

    KSV, спасибо огромное. Все работает как часы.


    Всем удачного дня!

     

    Ответить

    Бывает нужно разослать большое количество писем списку контактов из таблицы в Excel.

    Это может быть список потенциальных клиентов с мероприятия, выгрузка контактов из программы (1С, Битрикс24, amoCRM), просто список родственников, которые с нетерпением ждут от вас поздравления с праздником или уникального предложения.

    Расскажу, как сделать это просто, быстро и бесплатно. Для решения задачи понадобится Excel, Word и Outlook из пакета Microsoft Office.

    Итак, например, есть Excel таблица с данными клиентов (ФИО, компания, E-mail) и мы хотим отправить им персонализированное сообщение о предстоящих скидках.

    Таблица Excel
    Таблица Excel со списком клиентов

    Колонка “Пол” потребуется для определения окончания “уважаемый” или “уважаемая”, ее я вычислил по формуле, если “Отчество” заканчивается на “ч” значит это мужчина, если нет — женщина:

    =ЕСЛИ(ПРАВСИМВ(C2;1) = "ч"; "М";"Ж")

    В новом документе Word наберём шаблон текста сообщения, которое будем отправлять. Вместо обращения, имени и названия компании оставим пока пустые места.

    Запустим Мастер Слияния: вкладка Рассылки (Mailings), Начать слияние (Start Mail Merge), далее Пошаговый мастер слияния (Step-by-Step Merge Wizard).

    Пошаговый мастер слияния
    Запуск пошагового мастера слияния

    Откроется мастер, состоящий из 6 этапов.

    На перовом этапе выберем пункт Электронное сообщение (E-mail), так как хотим отправить наши сообщения по электронной почте.

    Выбор типа документа
    Выбор типа документа

    На втором этапе нужно указать, какой документ будет использоваться в качестве шаблона, выберем Текущий документ (Current document).

    Выбор документа
    Выбор документа

    Третий этап — выбор получателей. Так как список наших клиентов хранится в файле Excel, выбираем пункт Использование списка, жмем Обзор (Browse) и указываем наш файл.

    Выбор получателей
    Выбор получателей

    Откроется окно Получатели слияния, в нем можно выбрать или отменить клиентов для которых делаем рассылку.

    Получатели слияния
    Выбор получателей рассылки

    Четвертый этап — создание сообщения. Тут можно вставить данные из нашего файла Excel в шаблон сообщения, который мы подготовили.

    Создание сообщения
    Создание сообщения

    Вставим Фамилию, Имя, Отчество и название компании в наш шаблон, для этого: установим курсор в текст сообщения куда хотим вставить значение поля Excel, нажмем Другие элементы, в открывшемся окне выберем поле, которое хотим вставить, и так для всех полей.

    Вставка поля слияния
    Вставка поля

    Чтобы правильно указать обращение “уважаемый” для мужчин, и “уважаемая” для женщин создадим правило. Жмём кнопку Правила (Rules) на вкладке Рассылки (Mailings) и выберем пункт IF…THEN…ELSE.

    Создание правила
    Создание правила

    В открывшемся окне укажем правило: если поле “Пол” равно “М” — вставить текст “уважаемый”, в противном случае — вставить текст “уважаемая”.

    Настройка правила
    Настройка правила

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

    Готовый шаблон слияния
    Готовый шаблон слияния

    На пятом этапе можно предварительно просмотреть результаты слияния. Для перехода между письмами служат кнопки со стрелками.

    Просмотр сообщений
    Предварительный просмотр сообщений

    На завершающем 6 этапе нужно выбрать единственный пункт Электронная почта.

    Завершение слияния
    Завершение слияния

    Затем в открывшемся окне указать тему отправляемых писем и выбрать в поле Кому столбец нашей таблицы Excel, в котором содержаться адреса получателей

    Запуск рассылки
    Запуск рассылки

    После нажатия на кнопку ОК, Word автоматически подключится к вашему почтовому клиенту Outlook, поместит все сообщения в папку «Исходящие», после чего письма отправятся получателям.

    Если вы хотите проверить письма перед отправкой, есть небольшая хитрость, нужно предварительно перевести Outlook в автономный режим Файл — Автономный режим. Письма останутся в исходящих, пока вы не выйдете из автономного режима и при необходимости вы сможете проверить или внести в них изменения.

    На этом всё. Но вы можете поддержать проект. Даже небольшая сумма поможет нам писать больше полезных статей.

    Если статья помогла или понравилась, пожалуйста поделитесь ей в соцсетях.

    • Интернет
    • Рассылка почты

    Пример макроса, отправляющего письма со вложениями из Excel через почтовый клиент Outlook:

    Sub Отправить_Письмо_из_Outlook()
     
        'отправляем письмо без вложений
        res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 1", "Тема письма 1")
        If res Then Debug.Print "Письмо 1 отправлено успешно" Else Debug.Print "Ошибка отправки"
     
     
        'отправляем письмо с 1 вложением
        attach$ = ThisWorkbook.FullName    ' прикрепляем текущий файл Excel
        res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 2", "Тема письма 2", attach$)
        If res Then Debug.Print "Письмо 2 отправлено успешно" Else Debug.Print "Ошибка отправки"
     
     
        'отправляем письмо с несколькими вложениями
        Dim coll As New Collection    ' заносим в коллекцию список прикрепляемых файлов
        coll.Add "C:Documents and SettingsAdminРабочий столTyres.jpg"
        coll.Add "C:Documents and SettingsAdminРабочий столcalc.xls"
        coll.Add ThisWorkbook.FullName    ' прикрепляем текущий файл Excel
    
        res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 3", "Тема письма 3", coll)
        If res Then Debug.Print "Письмо 3 отправлено успешно" Else Debug.Print "Ошибка отправки"
    End Sub

    Макрос использует функцию SendEmailUsingOutlook, которая:

    • принимает в качестве параметров адрес получателя письма, тему и текст письма, список вложений
    • запускает Outlook, формирует письмо, и отправляет его
    • возвращает TRUE, если отправка прошла успешно, или FALSE, если с отправкой почты вызникли проблемы

    Код функции SendEmailUsingOutlook:

    Function SendEmailUsingOutlook(ByVal Email$, ByVal MailText$, Optional ByVal Subject$ = "", _
                                   Optional ByVal AttachFilename As Variant) As Boolean
        ' функция производит отправку письма с заданной темой и текстом на адрес Email
        ' с почтового ящика, настроенного в Outlook для отправки писем "по-умолчанию"
        ' Если задан параметр AttachFilename, к отправляемому письму прикрепляется файл (файлы)
    
        On Error Resume Next: Err.Clear
        Dim OA As Object: Set OA = CreateObject("Outlook.Application")
        If OA Is Nothing Then MsgBox "Не удалось запустить OUTLOOK для отправки почты", vbCritical: Exit Function
     
        With OA.CreateItem(0)   'создаем новое сообщение
            .To = Email$: .Subject = Subject$: .Body = MailText$
            If VarType(AttachFilename) = vbString Then .Attachments.Add AttachFilename
            If VarType(AttachFilename) = vbObject Then    ' AttachFilename as Collection
                For Each file In AttachFilename: .Attachments.Add file: Next
            End If
            For i = 1 To 100000: DoEvents: Next    ' без паузы не отправляются письма без вложений
            Err.Clear: .Send
            SendEmailUsingOutlook = Err = 0
        End With
        Set OutApp = Nothing
    End Function

    Пример макроса, с получением параметров письма из ячеек листа Excel: 

    Sub Отправить_Письмо_из_Outlook()
        ' адрес получателя - в ячейке A1, текст письма - в ячейке A2
        res = SendEmailUsingOutlook(Cells(1, 1), Range("a2"), "Тема письма 1")
        If res Then Debug.Print "Письмо 1 отправлено успешно" Else Debug.Print "Ошибка отправки"
    End Sub
    • 176089 просмотров

    Не получается применить макрос? Не удаётся изменить код под свои нужды?

    Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

    Понравилась статья? Поделить с друзьями:
  • Excel отобрать только цифры
  • Excel отобрать по фильтрам
  • Excel отобразить ячейку с другого листа
  • Excel отобразить ярлык листа в excel
  • Excel отобразить ширину столбцов