Перейти к содержимому

Учебник по Excel – Отправка писем из Excel

Author: Siluvia Last Modified: 2025-06-05

Обычно для отправки писем мы используем почтовые клиенты, такие как Outlook, Gmail и т.д. Однако многие пользователи хранят данные в книгах Excel и им необходимо отправлять эти данные другим, работая с ними. Поэтому возникает потребность отправлять письма прямо из книги Excel, что экономит время на работу с почтовым клиентом. В этом пошаговом руководстве вы узнаете, как отправлять письма из Excel в различных ситуациях.

Примечание: Перед применением следующих методов необходимо настроить почтовый клиент Outlook на вашем компьютере и установить его как клиент по умолчанию.

Оглавление: [ Скрыть ]

(Нажмите на любой заголовок в оглавлении ниже или справа, чтобы перейти к соответствующему разделу.)

1. Основы отправки писем из Excel

В этом разделе рассматриваются основы отправки писем из Excel.

1.1 Отправка писем из Excel с помощью встроенных функций Excel

Если вам нужно отправить простое письмо из Excel, включающее только поля Кому, Тема, Копия и Текст письма, встроенные функции Excel помогут вам в этом.


1.1.1 Отправка письма из Excel с помощью формулы

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

Примечание: Если в полях Кому или Копия указано несколько получателей, разделяйте их точкой с запятой.

Этот раздел состоит из четырёх частей, в которых поэтапно показано, как добавить адрес электронной почты, получателя Cc, тему и текст письма в формулу Hyperlink. Пожалуйста, следуйте инструкциям.

Синтаксис и аргументы функции "HYPERLINK" приведены ниже.

Синтаксис

HYPERLINK(link_location, [friendly_name])

Аргументы

"Link_location" (обязательный): путь и имя файла к документу, который нужно открыть;
Совет: В этом руководстве все необходимые для письма поля, такие как адрес получателя, получатель Cc, тема и текст письма, должны быть указаны в первом аргументе "link_location".
"Friendly_name" (необязательный): значение, отображаемое в ячейке.

1.1.1.1 Добавление адреса электронной почты в формулу Hyperlink

Здесь мы используем "mailto:" как часть формулы для добавления получателя письма. В этом примере адрес первого получателя находится в ячейке B2, поэтому нужно добавить "mailto:" и сослаться на ячейку B2.

“mailto:”&B2

1. Выберите ячейку, в которой будет отображаться гиперссылка. В данном случае выберите ячейку F2.

2. Затем введите в неё следующую формулу.

=HYPERLINK("mailto:"&B2)

Примечание: После нажатия клавиши "Enter" будет создана гиперссылка, как показано на скриншоте ниже. При нажатии на ссылку будет создано письмо в Outlook, и адрес получателя автоматически подставится в поле Кому.

Адрес получателя теперь добавлен в формулу Hyperlink. Продолжайте выполнять следующие шаги, чтобы добавить тему, получателя Cc и текст письма по необходимости.


1.1.1.2 Добавление получателя Cc в формулу Hyperlink

Чтобы добавить получателя Cc в функцию Hyperlink, добавьте "?cc=" как часть формулы, как показано ниже.

"?cc=" & C2
где C2 содержит адрес электронной почты получателя Cc.

Формула в ячейке F2 должна быть следующей:

=HYPERLINK("mailto:" & B2 & "?cc=" & C2)


1.1.1.3 Добавление темы письма в формулу Hyperlink

Чтобы добавить тему письма в функцию Hyperlink, добавьте "&subject=" как часть формулы, как показано ниже.

"&subject="& D2
где D2 содержит тему письма.

Формула в ячейке F2 теперь будет выглядеть так:

=HYPERLINK("mailto:" & B2 & "?cc=" & C2 & "&subject="& D2)


1.1.1.4 Добавление текста письма с переносами строк в формулу Hyperlink

Последний шаг — добавить текст письма в формулу Hyperlink. Как видно из примера, в ячейке E2 две строки текста разделены переносом строки, и вы хотите сохранить этот перенос в теле письма. Сможет ли Outlook распознать перенос строки в этом случае? Давайте проверим.

Чтобы добавить текст письма в формулу Hyperlink, необходимо добавить “&body=" как часть формулы, как показано ниже.

"&body="& E2
где E2 содержит текст письма.

Формула в ячейке F2 теперь отображается следующим образом:

=HYPERLINK("mailto:" & B2 & "?cc=" & C2 & "&subject="& D2 & "&body="& E2)

Примечание: Если вы нажмёте клавишу "Enter" и кликнете по ссылке, то увидите, что содержимое письма отображается в одной строке.

Чтобы текст письма отображался в отдельных строках, измените содержимое ячейки, добавив код символа перевода строки "%0A" в то место, где нужен перенос строки. См. скриншот:


1.1.1.5 Указание текста для отображения гиперссылки

В предыдущих шагах мы заполнили аргумент Link_location полями письма. В этом разделе мы завершим настройку следующего аргумента [friendly_name].

В данном случае я хочу, чтобы в ячейке с гиперссылкой отображался текст "Письмо для xx", где xx — имя получателя из A2. Поэтому формулу в F2 нужно изменить на:

=HYPERLINK("mailto:" & B2 & "?cc=" & C2 & "&subject="& D2 & "&body="& E2, "Email to "&A2)

Нажмите клавишу "Enter", чтобы получить результат.

Выделите ячейку с формулой и перетащите маркер автозаполнения вниз, чтобы создать другие гиперссылки для писем. См. скриншот:


1.1.2 Отправка письма из Excel с помощью функции Hyperlink

Помимо использования формулы Hyperlink, вы можете вручную создать гиперссылку на письмо с помощью функции "Вставить гиперссылку" в Excel. В этом разделе показаны необходимые шаги.

1. Щёлкните правой кнопкой мыши по ячейке, где хотите вставить гиперссылку, и выберите "Ссылка" в контекстном меню.

2. В появившемся окне "Вставка гиперссылки" выполните следующие настройки.

2.1) В левой панели выберите "Адрес электронной почты".
2.2) В поле "Текст для отображения" введите текст, который хотите видеть в ячейке;
Совет: В этом окне нельзя использовать ссылки на ячейки, поэтому все поля письма нужно вводить вручную, как показано ниже.
2.3) В поле "Адрес электронной почты" введите нужные адреса.
mailto:адрес электронной почты
Замените текст "адрес электронной почты" на ваш реальный адрес. Если адресов несколько, разделяйте их точкой с запятой.
2.4) В поле "Тема" вы можете указать тему письма и текст письма прямо здесь. Настройте следующим образом:
Тема письма&body=Текст письма
В этом примере я ввожу "Monthly sale&body=Hi,%0AEmail received".
где тема письма — Monthly sale;
и
текст письма:
Hi,
Email received. ("%0A" — это код символа перевода строки, который распознаётся Outlook)
2.5) Нажмите кнопку "ОК", чтобы сохранить гиперссылку. См. скриншот:

При нажатии на гиперссылку будет создано письмо в Outlook с указанными полями Кому, Тема и Текст, как показано на скриншоте ниже.

Примечания:

1) При этом способе каждую гиперссылку на письмо нужно создавать вручную.
2) С помощью этого метода нельзя добавить поле Cc. Если оно необходимо, добавьте его в новом окне письма.

1.2 Отправка письма нескольким получателям в ячейках с помощью VBA-скрипта

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


1.2.1 Отправка письма нескольким получателям в ячейках с помощью VBA-скрипта

1. В листе, где содержатся все адреса, которым нужно отправить письмо, нажмите "Alt" + "F11" для открытия окна "Microsoft Visual Basic for Applications".

2. В окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль" и вставьте следующий код в окно "Модуль (Код)".

VBA-код: Отправка письма списку адресов электронной почты

Sub sendmultiple()
'updateby Extendoffice 20220802
    Dim xOTApp As Object
    Dim xMItem As Object
    Dim xCell As Range
    Dim xRg As Range
    Dim xEmailAddr As String
    Dim xTxt As String
    On Error Resume Next
    xTxt = ActiveWindow.RangeSelection.Address
    Set xRg = Application.InputBox("Please select the addresses list:", "Kutools for Excel", xTxt, , , , , 8)
    If xRg Is Nothing Then Exit Sub
    Set xOTApp = CreateObject("Outlook.Application")
    For Each xCell In xRg
        If xCell.Value Like "*@*" Then
            If xEmailAddr = "" Then
                xEmailAddr = xCell.Value
            Else
                xEmailAddr = xEmailAddr & ";" & xCell.Value
            End If
        End If
    Next
    Set xMItem = xOTApp.CreateItem(0)
    With xMItem
        .To = xEmailAddr
        .Subject = "Test"
        .Body = "Dear " _
                & vbNewLine & vbNewLine & _
                "This is a test email " & _
                "sending in Excel"
        .Display
    End With
End Sub

3. Нажмите клавишу "F5" для запуска кода — появится окно Kutools для Excel. Выберите список адресов и нажмите "ОК".

A screenshot of the 'Kutools for Excel' dialog box asking for the email addresses list

Примечания:

1) Если вы не хотите, чтобы появлялось диалоговое окно, и хотите указать диапазон адресов прямо в коде, замените эту строку:
Set xRg = Application.InputBox("Пожалуйста, выберите список адресов:", "Kutools для Excel", xTxt, , , , ,8)
на
Set xRg = Range("A2:A7")
2) Вы можете указать свою тему и текст письма в следующих строках:
.Subject = "Test"
.Body = "Dear " _
        & vbNewLine & vbNewLine & _
        "This is a test email " & _
        "sending in Excel"
3) Чтобы отправить письмо сразу, не открывая окно нового сообщения, замените эту строку:
.Display
на
.Send

После выполнения кода все адреса из выбранного диапазона будут добавлены в поле Кому окна сообщения. См. скриншот:

A screenshot of the email message window with all email addresses filled in the To field


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

Приведённый выше код добавляет все адреса из выбранного диапазона в поле Кому окна сообщения. Если вы хотите отправить письмо каждому адресу отдельно, чтобы получатели не видели адреса друг друга, используйте следующий VBA-скрипт.

1. В листе, где содержатся все адреса, которым нужно отправить письма, нажмите "Alt" + "F11" для открытия окна "Microsoft Visual Basic for Applications".

2. В окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль" и вставьте следующий код в окно "Модуль (Код)".

VBA-код: Отдельная отправка писем каждому адресу из списка в ячейках

Sub SendEmailToAddressInCells()
'Updated by Extendoffice 20220802
    Dim xRg As Range
    Dim xRgEach As Range
    Dim xRgVal As String
    Dim xAddress As String
    Dim xOutApp As Outlook.Application
    Dim xMailOut As Outlook.MailItem
    On Error Resume Next
    xAddress = ActiveWindow.RangeSelection.Address
    Set xRg = Application.InputBox("Please select the addresses list", "KuTools For Excel", xAddress, , , , , 8)
    If xRg Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    Set xOutApp = CreateObject("Outlook.Application")
    Set xRg = xRg.SpecialCells(xlCellTypeConstants, xlTextValues)
    For Each xRgEach In xRg
        xRgVal = xRgEach.Value
        If xRgVal Like "?*@?*.?*" Then
            Set xMailOut = xOutApp.CreateItem(olMailItem)
            With xMailOut
                .To = xRgVal
                .Subject = "Test"
                .Body = "Dear " _
                      & vbNewLine & vbNewLine & _
                        "This is a test email " & _
                        "sending in Excel"
                .Display
                '.Send
            End With
        End If
    Next
    Set xMailOut = Nothing
    Set xOutApp = Nothing
    Application.ScreenUpdating = True
End Sub

3. Затем выберите "Сервис" > "Ссылки". В диалоговом окне "Ссылки – VBAProject" найдите и отметьте "Microsoft Outlook16.0 Object Library", затем нажмите "ОК" для сохранения изменений.

A screenshot of the 'References – VBAProject' dialog box in Excel with the Microsoft Outlook 16.0 Object Library option selected

4. Нажмите клавишу "F5" для запуска кода — появится окно Kutools для Excel. Выберите список адресов и нажмите "ОК".

A screenshot of the 'Kutools for Excel' dialog box asking for the email address list selection

Примечания:

1) Если вы не хотите, чтобы появлялось диалоговое окно, и хотите указать диапазон адресов прямо в коде, замените эту строку:
Set xRg = Application.InputBox("Пожалуйста, выберите список адресов:", "Kutools для Excel", xTxt, , , , ,8)
на
Set xRg = Range("A2:A7")
2) Вы можете указать свою тему и текст письма в следующих строках:
.Subject = "Test"
.Body = "Dear " _
        & vbNewLine & vbNewLine & _
        "This is a test email " & _
        "sending in Excel"
3) Чтобы отправить письмо сразу, не открывая окна сообщений, замените эту строку:
.Display
на
.Send

В этом примере в выбранном диапазоне шесть адресов, поэтому будет создано шесть окон сообщений Outlook с отдельным адресом в поле Кому, как показано на скриншоте ниже.

A screenshot of multiple Outlook message windows with separate email addresses in the To field

5. В конце нажмите кнопку "Отправить", чтобы отправить письма по одному.


2. Вставка вложений или подписи Outlook в письма, отправляемые из Excel (с помощью VBA-скриптов)

В этом разделе показано, как вставлять вложения или стандартную подпись Outlook в письма, отправляемые из Excel.

2.1 Вставка вложений в письма, отправляемые из Excel

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


2.1.1 Отправка определённого файла как вложения

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

1. Нажмите клавиши "Alt" + "F11".

2. В открывшемся окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль". Затем вставьте следующий VBA-код в окно "Модуль (Код)".

VBA-код: Отправка файлов из папки как вложений из Excel

Sub EmailWithAttachments()
'Updated by Extendoffice 20220802
    Dim xStrFile As String
    Dim xFilePath As String
    Dim xFileDlg As FileDialog
    Dim xFileDlgItem As Variant
    Dim xOutApp As Outlook.Application
    Dim xMailOut As Outlook.MailItem
    Application.ScreenUpdating = False
    Set xOutApp = CreateObject("Outlook.Application")
    Set xMailOut = xOutApp.CreateItem(olMailItem)
    Set xFileDlg = Application.FileDialog(msoFileDialogFilePicker)
    If xFileDlg.Show = -1 Then
        With xMailOut
            .BodyFormat = olFormatRichText
            .To = "xxx@aaa.com"
            .Subject = "test"
            .HTMLBody = "test"
            For Each xFileDlgItem In xFileDlg.SelectedItems
                .Attachments.Add xFileDlgItem
            Next xFileDlgItem
            .Display
        End With
    End If
    Set xMailOut = Nothing
    Set xOutApp = Nothing
    Application.ScreenUpdating = True
End Sub

Примечания:

1) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на адрес получателя;
2) Измените тему и текст письма отдельно в строках ".Subject = "test"" и ".HTMLBody = "test"";
3) При необходимости добавьте получателей Cc и Bcc, просто добавьте следующие две строки после строки ."To = xxx@aaa.com".
.CC = "email address"
.BCC = "email address"

3. Затем выберите "Сервис" > "Ссылки". В диалоговом окне "Ссылки – VBAProject" найдите и отметьте "Microsoft Outlook16.0 Object Library", затем нажмите "ОК" для сохранения изменений.

A screenshot of the 'References – VBAProject' dialog box in Excel with the Microsoft Outlook 16.0 Object Library option selected

4. Нажмите клавишу "F5" для запуска кода — появится окно "Обзор". Выберите файлы, которые нужно прикрепить к письму, и нажмите "ОК".

A screenshot of the 'Browse' window for selecting files to attach to an email in Exce

Затем появится окно сообщения. Вы увидите, что выбранные файлы отображаются как вложения в поле "Вложения".

A screenshot of the Outlook message window with selected files displayed as attachments


2.1.2 Отправка текущего листа как вложения

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

1. Нажмите клавиши "Alt" + "F11".

2. В открывшемся окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль". Затем вставьте следующий VBA-код в окно "Модуль (Код)".

VBA-код: Отправка текущего листа как вложения

Sub SendWorkSheet()
'Update by Extendoffice 20220802
Dim xFile As String
Dim xFormat As Long
Dim Wb As Workbook
Dim Wb2 As Workbook
Dim FilePath As String
Dim FileName As String
Dim OutlookApp As Object
Dim OutlookMail As Object
On Error Resume Next
Application.ScreenUpdating = False
Set Wb = Application.ActiveWorkbook
ActiveSheet.Copy
Set Wb2 = Application.ActiveWorkbook
Select Case Wb.FileFormat
Case xlOpenXMLWorkbook:
    xFile = ".xlsx"
    xFormat = xlOpenXMLWorkbook
Case xlOpenXMLWorkbookMacroEnabled:
    If Wb2.HasVBProject Then
        xFile = ".xlsm"
        xFormat = xlOpenXMLWorkbookMacroEnabled
    Else
        xFile = ".xlsx"
        xFormat = xlOpenXMLWorkbook
    End If
Case Excel8:
    xFile = ".xls"
    xFormat = Excel8
Case xlExcel12:
    xFile = ".xlsb"
    xFormat = xlExcel12
End Select
FilePath = Environ$("temp") & "\"
FileName = Wb.Name & Format(Now, "dd-mmm-yy h-mm-ss")
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
Wb2.SaveAs FilePath & FileName & xFile, FileFormat:=xFormat
With OutlookMail
    .To = "xxx@aaa.com"
    .CC = "Email Address"
    .BCC = "Email Address"
    .Subject = "kte features"
    .Body = "Please check and read this document."
    .Attachments.Add Wb2.FullName
    .Display
    '.Send
End With
Wb2.Close
Kill FilePath & FileName & xFile
Set OutlookMail = Nothing
Set OutlookApp = Nothing
Application.ScreenUpdating = True
End Sub

Примечания:

1) В строке ."To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
2) Измените тему и текст письма отдельно в строках ".Subject = "kte features"" и ".Body = " Пожалуйста, ознакомьтесь с этим документом."";
3) В следующих двух строках:
.CC = "email address"
.BCC = "email address"
Если нужно добавить получателей Cc и Bcc, замените текст "email address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.

3. Нажмите клавишу "F5" для запуска кода — текущий лист будет сохранён как книга Excel и автоматически прикреплён к письму как вложение. См. скриншот:

A screenshot of the Outlook message window with the current worksheet saved and attached as an Excel workbook

Примечание: Вложенная книга, содержащая только текущий лист, будет иметь то же имя, что и исходная книга. К имени файла также будет добавлено время запуска кода.


2.1.3 Отправка текущей книги как вложения

После изучения кода для отправки текущего листа как вложения из Excel, ниже приведён другой VBA-скрипт для отправки всей книги как вложения. Выполните следующие действия.

1. Нажмите клавиши "Alt" + "F11".

2. В открывшемся окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль". Затем вставьте следующий VBA-код в окно "Модуль (Код)".

VBA-код: Отправка текущей книги как вложения из Excel

Sub SendWorkBook()
'Update by Extendoffice 20220802
Dim OutlookApp As Object
Dim OutlookMail As Object
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
On Error Resume Next
With OutlookMail
    .To = "xxx@aaa.com"
    .CC = "Email Address"
    .BCC = "Email Address"
    .Subject = "kte feature"
    .Body = "Hello, please check and read this document, thank you."
    .Attachments.Add Application.ActiveWorkbook.FullName
    .Display
    '.Send
End With
Set OutlookMail = Nothing
Set OutlookApp = Nothing
End Sub

Примечания:

1) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
2) Измените тему и текст письма отдельно в строках ".Subject = "kte features"" и ".Body = " Пожалуйста, ознакомьтесь с этим документом."";
3) В следующих двух строках:
.CC = "email address"
.BCC = "email address"
Если нужно добавить получателей Cc и Bcc, замените текст "email address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.

3. Нажмите клавишу "F5" для запуска кода — текущая книга будет автоматически прикреплена к письму как вложение. См. скриншот:

A screenshot of the Outlook message window with the current workbook attached automatically


2.1.4 Отправка всей книги как PDF-вложения

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

1. Нажмите клавиши "Alt" + "F11".

2. В открывшемся окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль". Затем вставьте следующий VBA-код в окно "Модуль (Код)".

VBA-код: Отправка всей книги как PDF-вложения

Sub SendWorkBookAsPDF()
'Update 20220803
Dim Wb As Workbook
Dim FilePath As String
Dim FileName As String
Dim xOutApp As Object
Dim xOutMail As Object
On Error Resume Next

Application.ScreenUpdating = False
Set Wb = Application.ActiveWorkbook
FileName = Left(Wb.Name, (InStrRev(Wb.Name, ".", -1, vbTextCompare) - 1)) & Format(Now, "dd-mmm-yy h-mm-ss") & ".pdf"
FilePath = Environ$("temp") & "\" & FileName

Wb.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _
    FilePath, Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
    False

Set xOutApp = CreateObject("Outlook.Application")
Set xOutMail = xOutApp.CreateItem(0)
With xOutMail
       .To = "xxx@aaa.com"
       .CC = "Email Address"
       .BCC = "Email Address"
       .Subject = "test"
       .Body = "test"
       .Attachments.Add FilePath
       .Display   'or use .Send
   End With
Kill FilePath
Set xOutMail = Nothing
Set xOutApp = Nothing
Application.ScreenUpdating = True
End Sub

Примечания:

1) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
2) Измените тему и текст письма отдельно в строках .Subject = "test" и .Body = "test";
3) В следующих двух строках:
.CC = "Email Address"
.BCC = "Email Address"
Если нужно добавить получателей Cc и Bcc, замените текст "Email Address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.
4) Имя PDF-файла будет совпадать с именем исходной книги. К имени файла также будет добавлено время запуска кода. Если не нужно добавлять временную метку, удалите & Format(Now, "dd-mmm-yy h-mm-ss") из следующей строки.
FileName = Left(Wb.Name, (InStrRev(Wb.Name, ".", -1, vbTextCompare) -1)) & Format(Now, "dd-mmm-yy h-mm-ss") & ".pdf"

3. Нажмите клавишу "F5" для запуска кода. Текущая книга будет автоматически прикреплена к новому письму как PDF-файл. См. скриншот:

A screenshot of the Outlook message window with the current workbook attached as a PDF file


2.1.5 Отправка текущего листа как PDF-вложения

Например, у вас есть книга "Monthly sales", и вы подготовили отчёт о продажах на листе "sales report" и хотите отправить этот лист как PDF-файл коллегам. Следующий VBA-код поможет вам.

1. Нажмите клавиши "Alt" + "F11".

2. В открывшемся окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль". Затем вставьте следующий VBA-код в окно "Модуль (Код)".

VBA-код: Отправка текущего листа как PDF-вложения

Sub SendWorkSheetToPDF()
'Update by Extendoffice 20220803
Dim Wb As Workbook
Dim FileName As String
Dim OutlookApp As Object
Dim OutlookMail As Object
On Error Resume Next
Set Wb = Application.ActiveWorkbook
FileName = Wb.FullName
xIndex = VBA.InStrRev(FileName, ".")
If xIndex > 1 Then FileName = VBA.Left(FileName, xIndex - 1)
FileName = FileName & "_" + ActiveSheet.Name & ".pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:=FileName
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
With OutlookMail
    .To = "xxx@aaa.com"
    .CC = "Email Address"
    .BCC = "Email Address"
    .Subject = "test"
    .Body = "test"
    .Attachments.Add FileName
    .Display
    '.Send
End With
Kill FileName
Set OutlookMail = Nothing
Set OutlookApp = Nothing
End Sub

Примечания:

1) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
2) Измените тему и текст письма отдельно в строках .Subject = "test" и .Body = "test";
3) В следующих двух строках:
.CC = "Email Address"
.BCC = "Email Address"
Если нужно добавить получателей Cc и Bcc, замените текст "Email Address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.
4) Имя PDF-файла будет: имя исходной книги_имя исходного листа. В данном случае PDF будет называться Monthly sales_sales report.

3. Нажмите клавишу "F5" для запуска кода. Текущий лист будет автоматически прикреплён к новому письму как PDF-файл. См. скриншот:

A screenshot of the Outlook message window with the current worksheet attached as a PDF file


2.2 Вставка подписи Outlook в письма, отправляемые из Excel

Возьмём предыдущий пример: вы используете VBA-код для отправки текущего листа как PDF-файла из Excel, но подпись Outlook не добавляется в окно сообщения. Чтобы сохранить стандартную подпись Outlook в письме, отправляемом из Excel, воспользуйтесь следующим методом.

Ниже приведены два VBA-кода.

VBA-код1: Код для сохранения подписи Outlook.

VBA-код2: Код для отправки текущего листа как PDF-вложения.

VBA-код1: Сохранение подписи Outlook

.HTMLBody = "Email body" & "
" & .HTMLBody

VBA-код2: Отправка текущего листа как PDF-вложения

Sub SendWorkSheetToPDF()
'Update by Extendoffice 20220803
Dim Wb As Workbook
Dim FileName As String
Dim OutlookApp As Object
Dim OutlookMail As Object
On Error Resume Next
Set Wb = Application.ActiveWorkbook
FileName = Wb.FullName
xIndex = VBA.InStrRev(FileName, ".")
If xIndex > 1 Then FileName = VBA.Left(FileName, xIndex - 1)
FileName = FileName & "_" + ActiveSheet.Name & ".pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:=FileName
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
With OutlookMail
    .To = "xxx@aaa.com"
    .CC = "Email Address"
    .BCC = "Email Address"
    .Subject = "test"
    .Body = "test"
    .Attachments.Add FileName
    .Display
    '.Send
End With
Kill FileName
Set OutlookMail = Nothing
Set OutlookApp = Nothing
End Sub

1. Обычно нужно нажать клавиши "Alt" + "F11" для открытия окна "Microsoft Visual Basic for Applications".

2. В окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль". Затем вставьте вышеуказанный VBA-код2 в окно "Модуль (Код)".

3. Чтобы сохранить стандартную подпись Outlook в письме, отправляемом из Excel, измените VBA-код2 следующим образом:

1) Замените строку ".Body" на "VBA-код1";
2) Переместите строку ".Display" под строку "With OutlookMail (или With xMailOut в других кодах)". См. скриншот:

A screenshot showing the modified VBA code with the .Body line replaced and .Display placed under With OutlookMail

Вот полный код после изменений.

Sub SendWorkSheetToPDF()
'Update by Extendoffice 20220803
Dim Wb As Workbook
Dim FileName As String
Dim OutlookApp As Object
Dim OutlookMail As Object
On Error Resume Next
Set Wb = Application.ActiveWorkbook
FileName = Wb.FullName
xIndex = VBA.InStrRev(FileName, ".")
If xIndex > 1 Then FileName = VBA.Left(FileName, xIndex - 1)
FileName = FileName & "_" + ActiveSheet.Name & ".pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:=FileName
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
With OutlookMail
    .Display
    .To = "xxx@aaa.com"
    .CC = "Email Address"
    .BCC = "Email Address"
    .Subject = "test"
    .HTMLBody = "Email body" & "
" & .HTMLBody
    .Attachments.Add FileName
    '.Send
End With
Kill FileName
Set OutlookMail = Nothing
Set OutlookApp = Nothing
End Sub

4. Нажмите клавишу "F5" для запуска кода. Откроется новое окно сообщения с текущим листом, прикреплённым как PDF-файл, а стандартная подпись Outlook будет автоматически добавлена в конец письма.

A screenshot of an email in Outlook with the default signature automatically inserted at the end of the email body


3. Автоматическая отправка писем из Excel при выполнении условия (с помощью VBA-скриптов)

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

3.1 Автоматическая отправка письма при достижении ячейкой определённого значения

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

1. В листе с таблицей продаж щёлкните правой кнопкой мыши по вкладке листа и выберите "Просмотреть код" в контекстном меню.

2. В открывшемся окне "Microsoft Visual Basic for Applications" вставьте следующий VBA-код в окно "Лист (Код)".

VBA-код: Автоматическая отправка письма при достижении ячейкой определённого значения в Excel

Dim xRg As Range
'Update by Extendoffice 20200803
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Cells.Count > 1 Then Exit Sub
Set xRg = Intersect(Range("D6"), Target)
If xRg Is Nothing Then Exit Sub
If IsNumeric(Target.Value) And Target.Value > 10000 Then
Call Mail_small_Text_Outlook
End If
End Sub
Sub Mail_small_Text_Outlook()
Dim xOutApp As Object
Dim xOutMail As Object
Dim xMailBody As String
Set xOutApp = CreateObject("Outlook.Application")
Set xOutMail = xOutApp.CreateItem(0)
xMailBody = "Hi boss" & vbNewLine & vbNewLine & _
"Total sales of over $10,000 in January: " & Range("D6")
On Error Resume Next
With xOutMail
.To = "xxx@aaa.com"
.CC = "Email address"
.BCC = "Email address"
.Subject = "test"
.Body = xMailBody
.Display 'or use .Send
End With
On Error GoTo 0
Set xOutMail = Nothing
Set xOutApp = Nothing
End Sub

Private Sub Worksheet_Calculate()
Dim xI As Integer
Dim xRg As Range
Set xRg = Range("D6")
On Error GoTo Err01
xI = Int(xRg.Value)
If xI > 10000 Then
Call Mail_small_Text_Outlook
End If
Err01:
End Sub

Примечания:

1) "D6" — это ячейка, по значению которой будет отправляться письмо.
2) " >10000" — это условие, то есть письмо будет отправлено, если значение в D6 больше10000.
3) "Range(“D6”)" в следующей строке означает, что в теле письма будет указано значение из D6.
xMailBody = "Hi boss" & vbNewLine & vbNewLine & _
"Total sales of over $10,000 in January: " & Range("D6")
4) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
5) Измените тему письма в строке .Subject = "test".
6) В следующих двух строках:
.CC = "Email Address"
.BCC = "Email Address"
Если нужно добавить получателей Cc и Bcc, замените текст "Email Address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.

Теперь, когда значение в ячейке D6 превысит10000, будет создано письмо, как показано на скриншоте ниже.

A screenshot of an email created in Outlook when the value in cell D6 exceeds 10000 in Excel


3.2 Автоматическая отправка письма при изменении значения в ячейке

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

1. В листе с таблицей продаж щёлкните правой кнопкой мыши по вкладке листа и выберите "Просмотреть код" в контекстном меню.

2. В открывшемся окне "Microsoft Visual Basic for Applications" вставьте следующий VBA-код в окно "Лист (Код)".

VBA-код: Автоматическая отправка письма при изменении значения указанной ячейки

Private Sub Worksheet_Change(ByVal Target As Range)
'Updated by Extendoffice 20220803
Dim xRgSel As Range
Dim xOutApp As Object
Dim xMailItem As Object
Dim xMailBody As String
Dim xBoolean As Boolean
Dim xItsRG As Range
Dim xDDs As Range
Dim xDs As Range
On Error Resume Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False
xBoolean = False
Set xRg = Range("B14")

Set xItsRG = Intersect(Target, xRg)
Set xDDs = Intersect(Target.DirectDependents, xRg)
Set xDs = Intersect(Target.Dependents, xRg)
If Not (xItsRG Is Nothing) Then
Set xRgSel = xItsRG
xBoolean = True
ElseIf Not (xDDs Is Nothing) Then
Set xRgSel = xDDs
xBoolean = True
ElseIf Not (xDs Is Nothing) Then
Set xRgSel = xDs
xBoolean = True
End If

ActiveWorkbook.Save
If xBoolean Then
Debug.Print xRgSel.Address

Set xOutApp = CreateObject("Outlook.Application")
Set xMailItem = xOutApp.CreateItem(0)
xMailBody = "The cell " & 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 = "xxx@aaa.com"
.CC = "Email address"
.BCC = "Email address"
.Subject = "Worksheet modified"
.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) "B14" в коде означает, что при изменении значения в ячейке B14 будет отправлено письмо.
2) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
3) Измените тему письма в строке .Subject = "Worksheet modified".
4) В следующих двух строках:
.CC = "Email Address"
.BCC = "Email Address"
Если нужно добавить получателей Cc и Bcc, замените текст "Email Address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.

Теперь, когда значение в ячейке B14 изменится, автоматически будет создано сообщение Outlook, как показано на скриншоте ниже.

A screenshot of an email created in Outlook when the value in cell B14 changes


3.3 Автоматическая отправка письма при сохранении книги

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

1. Нажмите клавиши "Alt" + "F11" для открытия окна "Microsoft Visual Basic for Applications".

2. В этом окне дважды кликните "ThisWorkbook" в панели "Проект", затем вставьте следующий VBA-код в окно "ThisWorkbook (Код)".

VBA-код: Автоматическая отправка письма при сохранении книги

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
'Updated by Extendoffice 20220804
    Dim xOutApp As Object
    Dim xMailItem As Object
    Dim xName As String
    On Error Resume Next
    Set xOutApp = CreateObject("Outlook.Application")
    Set xMailItem = xOutApp.CreateItem(0)
    xName = ActiveWorkbook.FullName
    With xMailItem
        .To = "xxx@aaa.com"
        .CC = "Email address"
        .BCC = "Email address"
        .Subject = "The workbook has been updated"
        .Body = "Hi," & Chr(13) & Chr(13) & "File is now updated."
        .Attachments.Add xName
        .Display
       '.send
    End With
    Set xMailItem = Nothing
    Set xOutApp = Nothing
End Sub

Примечание: В коде

1) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
2) Измените тему и текст письма отдельно в строках ".Subject = "The workbook has been updated"" и ".Body = "Hi," & Chr(13) & Chr(13) & "File is now updated."".
3) В следующих двух строках:
.CC = "Email Address"
.BCC = "Email Address"
Если нужно добавить получателей Cc и Bcc, замените текст "Email Address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.

Теперь при сохранении книги с помощью "Ctrl" + "S" или кнопки "Сохранить" автоматически будет создано письмо Outlook. Вы увидите, что текущая книга прикреплена как вложение, а поля заполнены указанным содержимым. См. скриншот:

A screenshot showing an Outlook email with the current workbook attached, ready to be sent automatically

Совет: Если вы часто используете эту книгу, рекомендуем сохранить её как "Книга Excel с поддержкой макросов", чтобы сохранить VBA-скрипт для будущего использования. Выполните следующие шаги.

1) Нажмите "Файл" > "Сохранить как" и выберите папку для сохранения файла.
2) В диалоговом окне "Сохранить как" переименуйте файл по необходимости в поле "Имя файла", выберите "Книга Excel с поддержкой макросов" в списке "Указать формат сохранения" и нажмите кнопку "Сохранить". См. скриншот:

A screenshot of the 'Save As' dialog in Excel showing the option to save the workbook as an Excel Macro-Enabled Workbook


3.4 Автоматическая отправка письма в определённое время

Допустим, вам нужно отправлять письмо с книгой заданий кому-то "каждую пятницу в9 утра" и хотите делать это автоматически в Excel без ручного запуска почтового клиента. В этом разделе показан способ реализации.

1. Нажмите клавиши "Alt" + "F11" для открытия окна "Microsoft Visual Basic for Applications".

2. В окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль". Затем вставьте следующий VBA-код в окно "Модуль".

VBA-код1: Отправка текущей книги как вложения из Excel

Sub Timer()
    If Weekday(Date) = vbFriday Then
        SendWorkBook
        Application.OnTime TimeValue("09:00:00"), "Timer"
    Else
        Application.OnTime TimeValue("09:00:00"), "Timer"
    End If
End Sub

Sub SendWorkBook()
'Update by Extendoffice 20220802
Dim OutlookApp As Object
Dim OutlookMail As Object
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
On Error Resume Next
With OutlookMail
    .To = "xxx@aaa.com"
    .CC = "Email Address"
    .BCC = "Email Address"
    .Subject = "kte feature"
    .Body = "Hello, please check and read this document, thank you."
    .Attachments.Add Application.ActiveWorkbook.FullName
    .Display
    '.Send
End With
Set OutlookMail = Nothing
Set OutlookApp = Nothing
End Sub

3. В этом окне дважды кликните "ThisWorkbook" в панели "Проект", затем вставьте следующий VBA-код в окно "ThisWorkbook (Код)".

A screenshot showing the VBA code editor with the 'Workbook_Open' event and 'Application.OnTime' function to schedule email sending

VBA-код2: Автоматическая отправка письма в определённое время

Private Sub Workbook_Open()
    Application.OnTime TimeValue("09:00:00"), "Timer"
End Sub

Примечания:

1) В VBA-коде1 "Пятница" в следующей строке означает, что письмо будет отправляться автоматически каждую пятницу;
If Weekday(Date) = vbFriday Then
2) В VBA-кодах1 и2 время "09:00:00" означает, что письмо будет отправлено в9 утра в указанный день.
Вы можете изменить день и время по своему усмотрению.
3) При запуске кода будет создано письмо. Если не хотите, чтобы появлялось окно сообщения, и нужно отправить письмо сразу, удалите строку ".Display" из VBA-кода1 и уберите апостроф перед строкой ‘.Send.

4. Сохраните коды, а затем сохраните книгу как книгу Excel с поддержкой макросов следующим образом.

4.1) Нажмите "Файл" > "Сохранить как" и выберите папку для сохранения файла.
4.2) В диалоговом окне "Сохранить как" переименуйте файл по необходимости в поле "Имя файла", выберите "Книга Excel с поддержкой макросов" в списке "Указать формат сохранения" и нажмите кнопку "Сохранить". См. скриншот:

A screenshot of the 'Save As' dialog in Excel showing the option to save the workbook as an Excel Macro-Enabled Workbook

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


4. Дополнительные темы

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

4.1 Отправка диапазона ячеек из Excel (с помощью VBA-скрипта)

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

4.1.1 Отправка диапазона как части текста письма из Excel

Вы можете запустить следующий VBA-код для отправки диапазона ячеек как части текста письма из Excel

1. Нажмите клавиши "Alt" + "F11" для открытия окна "Microsoft Visual Basic for Applications".

2. В окне "Microsoft Visual Basic for Applications" выберите "Сервис" > "Ссылки". Затем отметьте "Microsoft Outlook16.0 Object Library" и нажмите "ОК" в диалоговом окне "Ссылки – VBAProject".

3. Выберите "Вставка" > "Модуль", затем вставьте следующий VBA-код в окно "Модуль (Код)".

VBA-код: Отправка диапазона ячеек как части текста письма из Excel

Sub SendARangeofCells()
'Updated by Extendoffice 20220809
    Dim xRg As Range
    Dim I, J As Long
    Dim xAddress As String
    Dim xMailOut As Object
    Dim xOutApp As Object
    On Error Resume Next
    Set xOutApp = CreateObject("Outlook.Application")
    Set xMailOut = xOutApp.CreateItem(olMailItem)
    xAddress = ActiveWindow.RangeSelection.Address
    Set xRg = Application.InputBox("Please select range you need to paste into email body", "KuTools For Excel", xAddress, , , , , 8)
If xRg Is Nothing Then Exit Sub
Application.ScreenUpdating = False
    Set xOutApp = CreateObject("Outlook.Application")
    Set xMailOut = xOutApp.CreateItem(olMailItem)
    With xMailOut
        .Subject = "test"
        .To = "xxx@aaa.com"
        .CC = "Email address"
        .BCC = "Email address"
        .HTMLBody = RangetoHTML(xRg)
        .Display
        '.Send
    End With
    Set xMailOut = Nothing
    Set xOutApp = Nothing
    Application.ScreenUpdating = True
End Sub

 ' The following VBA script is cited from this page:
 ' https://stackoverflow.com/questions/18663127/paste-excel-range-in-outlook
Function RangetoHTML(rng As Range)
' By Ron de Bruin.
    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook

    TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

    'Copy the range and create a new workbook to past the data in
    rng.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        .Cells(1).Select
        Application.CutCopyMode = False
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        On Error GoTo 0
    End With

    'Publish the sheet to a htm file
    With TempWB.PublishObjects.Add( _
         SourceType:=xlSourceRange, _
         Filename:=TempFile, _
         Sheet:=TempWB.Sheets(1).Name, _
         Source:=TempWB.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With

    'Read all data from the htm file into RangetoHTML
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.ReadAll
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")

    'Close TempWB
    TempWB.Close savechanges:=False

    'Delete the htm file we used in this function
    Kill TempFile

    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing
End Function

Примечание: В коде

1) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
2) В следующих двух строках:
.CC = "Email Address"
.BCC = "Email Address"
Если нужно добавить получателей Cc и Bcc, замените текст "Email Address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.

4. Нажмите клавишу "F5" для запуска кода. В появившемся окне Kutools для Excel выберите диапазон ячеек, который нужно отправить как часть текста письма, затем нажмите "ОК". См. скриншот:

A screenshot of the Kutools for Excel dialog box where a range of cells is selected to send as part of an email body

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

A screenshot of an Outlook email with the selected range from Excel inserted into the email body


4.1.2 Отправка диапазона как вложения из Excel

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

1. Нажмите клавиши "Alt" + "F11".

2. В открывшемся окне "Microsoft Visual Basic for Applications" выберите "Вставка" > "Модуль". Затем вставьте следующий VBA-код в окно "Модуль (Код)".

VBA-код: Отправка диапазона как вложения из Excel

Sub SendRange()
'Update 20220809
Dim xFile As String
Dim xFormat As Long
Dim Wb As Workbook
Dim Wb2 As Workbook
Dim Ws As Worksheet
Dim FilePath As String
Dim FileName As String
Dim OutlookApp As Object
Dim OutlookMail As Object
Dim WorkRng As Range
xTitleId = "KutoolsforExcel"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set Wb = Application.ActiveWorkbook
Wb.Worksheets.Add
Set Ws = Application.ActiveSheet
WorkRng.Copy Ws.Cells(1, 1)
Ws.Copy
Set Wb2 = Application.ActiveWorkbook
Select Case Wb.FileFormat
Case xlOpenXMLWorkbook:
    xFile = ".xlsx"
    xFormat = xlOpenXMLWorkbook
Case xlOpenXMLWorkbookMacroEnabled:
    If Wb2.HasVBProject Then
        xFile = ".xlsm"
        xFormat = xlOpenXMLWorkbookMacroEnabled
    Else
        xFile = ".xlsx"
        xFormat = xlOpenXMLWorkbook
    End If
Case Excel8:
    xFile = ".xls"
    xFormat = Excel8
Case xlExcel12:
    xFile = ".xlsb"
    xFormat = xlExcel12
End Select
FilePath = Environ$("temp") & "\"
FileName = Wb.Name & Format(Now, "dd-mmm-yy h-mm-ss")
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
Wb2.SaveAs FilePath & FileName & xFile, FileFormat:=xFormat
With OutlookMail
    .To = "xxx@aaa.com"
    .CC = "Email address"
    .BCC = "Email address"
    .Subject = "Monthly sales for 2021"
    .Body = "Hello, please check and read this document. "
    .Attachments.Add Wb2.FullName
    .Display
    '.Send
End With
Wb2.Close
Kill FilePath & FileName & xFile
Set OutlookMail = Nothing
Set OutlookApp = Nothing
Ws.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Примечания:

1) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
2) Измените тему и текст письма отдельно в строках ".Subject = "Monthly sales for2021"" и ".Body = "Hello, please check and read this document."";
3) В следующих двух строках:
.CC = "email address"
.BCC = "email address"
Если нужно добавить получателей Cc и Bcc, замените текст "email address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.

3. Нажмите клавишу "F5" для запуска кода. В появившемся окне Kutools для Excel выберите диапазон ячеек, который нужно отправить как вложение, затем нажмите "ОК". См. скриншот:

A screenshot of the Kutools for Excel dialog box where a range of cells is selected to send as an attachment in an email

Затем автоматически будет создано письмо Outlook, а выбранный диапазон будет сохранён как книга Excel и прикреплён к письму. См. скриншот:

A screenshot of an Outlook email with the selected range from Excel saved as an attachment


4.2 Отправка писем по нажатию кнопки в Excel

Если нужно отправить письмо из Excel по нажатию командной кнопки, например, отправить текущую книгу как вложение, выполните следующие шаги.

1. Нажмите "Разработчик" > "Вставить" > "Командная кнопка (ActiveX-элемент управления)". Нарисуйте кнопку на листе.

Совет: Если у вас уже есть командная кнопка, пропустите этот шаг.

2. Нажмите клавиши "Alt" + "F11" для открытия окна "Microsoft Visual Basic for Applications". В окне выберите "Вставка" > "Модуль" и вставьте VBA-код (код для отправки текущей книги как вложения из Excel) в окно "Модуль (Код)".

Нажмите здесь, чтобы получить код.

Примечание: Имя макроса, созданного на шаге2, — "SendWorkbook".

3. Нажмите клавиши "Alt" + "Q" для закрытия окна "Microsoft Visual Basic for Applications".

4. Теперь нужно назначить макрос командной кнопке. Щёлкните правой кнопкой мыши по кнопке и выберите "Просмотреть код" в контекстном меню.

5. Появится окно "Microsoft Visual Basic for Applications", где вы увидите две строки в окне "Лист (Код)".

Private Sub CommandButton1_Click()
End Sub

A screenshot of the Microsoft Visual Basic for Applications window showing the CommandButton1_Click code

6. Введите имя существующего макроса внутри процедуры для командной кнопки.

A screenshot of editing the VBA code to assign an existing macro to the command button

7. Нажмите клавиши "Alt" + "Q" для закрытия редактора Visual Basic и нажмите "Разработчик" > "Режим конструктора", чтобы выйти из режима конструктора.

A screenshot of turning off Design Mode in the Developer tab

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


4.3 Отправка писем с определённого почтового аккаунта

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

В этом случае понадобятся следующие коды.

VBA-код1:

Dim OutlookMail As Outlook.MailItem

VBA-код2:

For Each xAccount In OutlookApp.Session.Accounts
  If VBA.LCase(xAccount.SmtpAddress) = VBA.LCase("zxm@addin99.com") Then 'Specify your email account here
    OutlookMail.SendUsingAccount = xAccount
  End If
Next

Как использовать приведённые выше VBA-коды?

1) В своём коде замените строку типа "Dim OutlookMail As Object" на VBA-код1;
2) Добавьте VBA-код2 после строки "On Error Resume Next" в вашем коде. Затем укажите адрес, с которого будет отправляться письмо, в VBA-коде2.

В этом примере мы укажем определённый почтовый аккаунт для отправки текущей книги как вложения из Excel. Выполните следующие действия.

1. Нажмите клавиши "Alt" + "F11". В окне "Microsoft Visual Basic for Applications" выберите "Сервис" > "Ссылки". Затем отметьте "Microsoft Outlook16.0 Object Library" и нажмите "ОК" в диалоговом окне "Ссылки – VBAProject".

A screenshot of the 'References – VBAProject' dialog box in Excel with the Microsoft Outlook 16.0 Object Library option selected

2. Выберите "Вставка" > "Модуль". Затем вставьте следующий VBA-код в окно "Модуль (Код)".

VBA-код: Отправка текущей книги как вложения из Excel через указанный аккаунт Outlook

Sub SendWorkBook()
'Update by Extendoffice 20220809
Dim OutlookApp As Object
Dim OutlookMail As Outlook.MailItem 'important! Here can’t be declared as Object
Dim xAccount As Account
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(olMailItem)
On Error Resume Next
'The following lines helps to specify a certian email account
For Each xAccount In OutlookApp.Session.Accounts
  If VBA.LCase(xAccount.SmtpAddress) = VBA.LCase("zxm@addin99.com") Then 'Specify your email account here
    OutlookMail.SendUsingAccount = xAccount
  End If
Next
'End
With OutlookMail
    .To = "xxx@aaa.com"
    .CC = "Email Address"
    .BCC = "Email Address"
    .Subject = "kte feature"
    .Body = "Hello, please check and read this document, thank you."
    .Attachments.Add Application.ActiveWorkbook.FullName
    .Display
    '.Send
End With
Set OutlookMail = Nothing
Set OutlookApp = Nothing
End Sub

3. Нажмите клавишу "F5" для запуска кода. Появится окно письма Outlook, и вы увидите, что в поле "От" указан аккаунт, который вы указали в коде.


4.4 Отправка письма при наступлении даты

Если нужно отправить письмо по определённой дате, например, как показано на скриншоте ниже, есть таблица проектов: "когда срок в диапазоне E2:E7 равен или меньше7 дней от текущей даты (допустим, сегодня2022/8/4)", письмо будет отправлено соответствующим руководителям проектов с уведомлением о скором завершении проекта.

1. В листе с таблицей проектов щёлкните правой кнопкой мыши по вкладке листа и выберите "Просмотреть код" в контекстном меню.

2. В открывшемся окне "Microsoft Visual Basic for Applications" вставьте следующий VBA-код в окно "Лист (Код)".

VBA-код: Автоматическая отправка письма при наступлении срока

Public Sub SendMailDueDate()
'Updated by Extendoffice 20220804
Dim xRgDate As Range
Dim xRgSend As Range
Dim xRgText As Range
Dim xRgDone As Range
Dim xOutApp As Object
Dim xMailItem As Object
Dim xLastRow As Long
Dim vbCrLf As String
Dim xMailBody As String
Dim xRgDateVal As String
Dim xRgSendVal As String
Dim xMailSubject As String
Dim i As Long
On Error Resume Next
Set xRgDate = Range("E2:E7") 'Please reference the due date column range
If xRgDate Is Nothing Then Exit Sub
Set xRgSend = Range("C2:C7") 'Please reference the email addresses column range
If xRgSend Is Nothing Then Exit Sub
Set xRgText = Range("D2:D7") 'Please reference the remark column range (the remark used to notify project leaders of the expiration of the project)
If xRgText Is Nothing Then Exit Sub
xLastRow = xRgDate.Rows.Count
Set xRgDate = xRgDate(1)
Set xRgSend = xRgSend(1)
Set xRgText = xRgText(1)
Set xOutApp = CreateObject("Outlook.Application")
For i = 1 To xLastRow
xRgDateVal = ""
xRgDateVal = xRgDate.Offset(i - 1).Value
If xRgDateVal <> "" Then
If CDate(xRgDateVal) - Date <= 7 And CDate(xRgDateVal) - Date > 0 Then
xRgSendVal = xRgSend.Offset(i - 1).Value
xMailSubject = xRgText.Offset(i - 1).Value & " on " & xRgDateVal
vbCrLf = "

"
            xMailBody = ""
            xMailBody = xMailBody & "Dear " & xRgSendVal & vbCrLf
            xMailBody = xMailBody & "Remark : " & xRgText.Offset(i - 1).Value & vbCrLf
            xMailBody = xMailBody & ""
Set xMailItem = xOutApp.CreateItem(0)
With xMailItem
.Subject = xMailSubject
.To = xRgSendVal
.CC = "Email address"
.BCC = "Email address"
.HTMLBody = xMailBody
.Display
'.Send
End With
Set xMailItem = Nothing
End If
End If
Next
Set xOutApp = Nothing
End Sub

Примечание: В коде

1) В следующих строках "E2:E7" — сроки, по которым будут отправляться письма, "C2:C7" — адреса получателей, "D2:D7" — примечания, которые будут добавлены в тело письма для уведомления о скором завершении проекта. Вы можете изменить диапазоны по необходимости.
Set xRgDate = Range("E2:E7")
Set xRgSend = Range("C2:C7")
Set xRgText = Range("D2:D7")
2) Следующая строка означает, что срок должен быть больше1 дня и равен или меньше7 дней от текущей даты. Вы можете изменить это по своему усмотрению.
If CDate(xRgDateVal) - Date <=7 And CDate(xRgDateVal) - Date >0 Then
3) В строке ".To = xxx@aaa.com" замените "xxx@aaa.com" на реальный адрес получателя. Если адресов несколько, разделяйте их точкой с запятой.
4) Измените тему письма в строке ".Subject = "Worksheet modified"".
5) В следующих двух строках:
.CC = "Email Address"
.BCC = "Email Address"
Если нужно добавить получателей Cc и Bcc, замените текст "Email Address" на нужные адреса.
Если Cc и Bcc не нужны, просто добавьте апостроф ' перед каждой строкой.

3. Нажмите клавишу "F5" для запуска кода. Если срок соответствует условиям, будет создано соответствующее письмо. В этом случае будет создано два письма, как показано на скриншоте ниже.

A screenshot of two emails created automatically based on expiration date matching conditions in Excel


5. Удобный инструмент, который поможет вам легко отправлять письма из Excel

Если вы новичок в VBA, вышеописанные методы могут показаться сложными. Рекомендуем использовать функцию Send Emails в Kutools для Excel — с её помощью вы сможете отправлять письма из Excel всего в несколько кликов. Выполните следующие действия.

Kutools для Excel предлагает более 300 продвинутых функций для упрощения сложных задач, повышая креативность и эффективность. Интеграция с возможностями ИИ позволяет Kutools автоматизировать задачи с высокой точностью, делая управление данными без усилий. Подробная информация о Kutools для Excel...  Бесплатная пробная версия...
5.1 Легко создать список рассылки, включающий необходимые поля электронной почты

Перед использованием функции Send Emails необходимо создать список рассылки с нужными полями. Для этого поможет функция Create Mailing List.

1. Нажмите "Kutools Plus" > "Create Mailing List".

2. В открывшемся окне "Create Mailing List" выполните следующие настройки.

2.1) В разделе "Columns for Mailing list" отметьте нужные поля для письма;
2.2) В разделе "Attach files" отметьте одно или несколько вложений, если требуется;
2.3) Укажите место для размещения списка рассылки;
2.4) Нажмите кнопку "Create". См. скриншот:

После этого будет создана примерная таблица списка рассылки, как показано на скриншоте ниже.

3. Теперь замените исходные данные в примере на свои собственные.

Теперь вы создали таблицу списка рассылки. Далее примените функцию "Send Emails" для отправки писем из Excel на основе созданных вами полей.

Kutools для Excel - Усильте Excel более чем 300 необходимыми инструментами. Наслаждайтесь постоянно бесплатными функциями ИИ! Получите прямо сейчас


5.2 Легко отправлять письма с полями, которые вы создали в списке рассылки

После создания списка рассылки (нажмите, чтобы узнать как), содержащего нужные вам поля, вы сможете отправлять письма из Excel с этими полями.

1. Выделите весь список рассылки, нажмите "Kutools Plus" > "Send Emails".

2. В диалоговом окне "Send Emails" выполните следующие настройки.

2.1) Поля автоматически заполняются в диалоговом окне на основе указанных вами в списке рассылки;
Совет: Если в данный момент какое-то поле не нужно, выберите пустой вариант в выпадающем списке.
2.2) "Insert Placeholder" (дополнительно): если нужно вставить переменную информацию в тело письма.
Например, если нужно отправить письмо нескольким получателям с персонализированным именем для каждого, поместите курсор в нужное место тела письма, выберите поле “E: First Name” (или другое имя из списка рассылки) и нажмите кнопку "Insert Placeholder";
Когда получатели получат письмо, тело письма останется одинаковым, но имена будут уникальными для каждого.
2.3) Составьте текст письма по необходимости;
2.4) Убедитесь, что отмечена опция "Send emails via Outlook";
2.5) Нажмите кнопку "Send". См. скриншот:

3. Затем появится окно Kutools для Excel с информацией о количестве отправленных писем, нажмите "ОК" для закрытия окна.

Совет: Вы можете проверить отправленные письма в папке "Отправленные" в Outlook.


5.3 Легко отправлять письма с HTML-телом (включая гиперссылки, изображения и т.д.)

Функция Send Emails позволяет создавать html-письма, которые могут содержать гиперссылки, изображения, различные размеры и цвета шрифта и т.д.

После создания списка рассылки с нужными полями, при настройке диалогового окна Send Emails вы можете сделать текст письма более насыщенным с помощью опций на панели инструментов.

См. скриншот ниже:


5.4 Легко вставлять стандартную подпись Outlook при отправке писем

В предыдущем способе мы показали VBA-код для отправки писем со стандартной подписью Outlook. Здесь, используя функцию Send Emails, достаточно отметить одну опцию, и стандартная подпись Outlook будет автоматически вставлена в письма, отправляемые из Excel.

После создания списка рассылки с нужными полями, при настройке диалогового окна Send Emails нажмите "Options" > "Use Outlook’s signature settings".

Примечание: Убедитесь, что перед опцией Use Outlook’s signature settings стоит галочка.

Когда получатели получат письмо, они увидят стандартную подпись Outlook в конце письма.


5.5 Легко отправлять письма с определённого почтового аккаунта

Чтобы использовать определённый почтовый аккаунт для отправки писем из Excel вместо аккаунта по умолчанию, функция Send Emails также поможет сделать это легко.

После создания списка рассылки с нужными полями, при настройке диалогового окна Send Emails нажмите "Options" > "Sent from", затем выберите нужный аккаунт для отправки писем.

Примечание: После выбора почтового аккаунта перед ним появится галочка.

Нажмите здесь, чтобы узнать больше о функции Send Emails.

Kutools для Excel - Усильте Excel более чем 300 необходимыми инструментами. Наслаждайтесь постоянно бесплатными функциями ИИ! Получите прямо сейчас

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

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

🤖 Kutools AI Aide: Совершенно новый подход к анализу данных на основе: Интеллектуальное выполнение |  Генерация кода  |  Создание пользовательских формул |  Анализ данных и построение диаграмм  |  Вызов Расширенных функций Kutools
Популярные функции: Найти, выделить или отметить дубликаты | Удалить пустые строки | Объединить столбцы или ячейки без потери данных |   Округлить без формулы ...
Супер ПОИСК: VLOOKUP по нескольким критериям | VLOOKUP с несколькими значениями | Многолистовой поиск | Распознавание нечетких соответствий ....
Расширенный раскрывающийся список: Быстро создать раскрывающийся список | Зависимый раскрывающийся список | Множественный выбор в раскрывающемся списке ....
Менеджер столбцов: Добавить определённое количество столбцов | Переместить столбцы | Переключить видимость скрытых столбцов | Сравнить диапазоны и столбцы ...
Избранные функции: Сетка фокусировки | Дизайн листа | Улучшенная строка формулы | Управление книгами и листами | Библиотека автотекста | Выбор даты | Объединить данные | Шифрование/расшифровка ячеек | Отправить письмо по списку | Супер фильтр | Специальный фильтр (фильтр ячеек с жирным/курсивом/зачёркнутым...) ...
Топ-15 наборов инструментов:12 текстовых инструментов (Добавить текст, Удалить определенные символы, ...) |50+ типов диаграмм (Диаграмма Ганта, ...) |40+ практических формул (Расчет возраста на основе даты рождения, ...) |19 инструментов вставки (Вставить QR-код, Вставить изображение по пути, ...) |12 инструментов преобразования (Преобразовать в слова, Конвертация валюты, ...) |7 инструментов для объединения и разделения (Расширенное объединение строк, Разделить ячейки, ...) | ... и многое другое

Ускорьте работу в Excel с Kutools для Excel и ощутите новую степень эффективности. Kutools для Excel предлагает более300 расширенных функций для повышения продуктивности и экономии времени. Нажмите здесь, чтобы выбрать нужную вам функцию...


Office Tab добавляет вкладки в Office и делает вашу работу намного проще

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