Skip to main content

Excel 教學 – 從 Excel 發送電子郵件

Author: Siluvia Last Modified: 2025-05-12

一般來說,我們會使用如 Outlook、Gmail 等郵件客戶端來發送郵件。但許多人會將資料儲存在 Excel 工作簿中,並在處理時需要將部分資料發送給他人。因此,他們需要直接從 Excel 工作簿發送郵件,這樣可以節省操作郵件客戶端的時間。本教學將以步驟說明如何根據不同情境從 Excel 發送電子郵件。

注意:在使用下列方法前,請先在電腦上設定 Outlook 郵件客戶端,並將其設為預設郵件客戶端。

目錄:[ 隱藏 ]

(點擊下方或右側目錄中的任一標題,即可跳轉至對應章節。)

1. 從 Excel 發送電子郵件的基本操作

本節將介紹從 Excel 發送電子郵件的基本方法。

1.1 使用 Excel內建函數從 Excel 發送電子郵件

如果您只需從 Excel 發送簡單的郵件,僅包含收件人、主旨、抄送和內容等欄位,Excel內建函數即可協助您完成。


1.1.1透過公式從 Excel 發送電子郵件

如下表所示,若需根據不同欄位從 Excel 發送不同郵件,您可以利用這些欄位的儲存格參照來建立不同的 Hyperlink公式。建立好郵件超連結後,只需點擊所需的超連結,即可自動發送郵件。

注意:若收件人或抄送欄位有多個地址,請以分號分隔。

本節分為四個部分,分別說明如何將電子郵件地址、抄送收件人、主旨及內容分別加入 Hyperlink公式。請依下列步驟操作。

「HYPERLINK」函數的語法與參數如下。

語法

HYPERLINK(link_location, [friendly_name])

參數說明

「Link_location」(必填):要開啟的文件路徑及檔名;
提示:在本教學中,所有郵件所需欄位(如收件人、抄送、主旨及內容)都應放在第一個參數「link_location」中。
「Friendly_name」(選填):在儲存格中顯示的跳轉文字。

1.1.1.1 在 Hyperlink公式中添加電子郵件地址

這裡我們在公式中使用「mailto:」來添加收件人。例如,第一位收件人的電子郵件地址在 B2 儲存格,因此需將「mailto:」與 B2參照結合。

“mailto:”&B2

1. 選擇要顯示超連結的儲存格,本例選擇 F2。

2. 然後在該儲存格輸入下列公式。

=HYPERLINK("mailto:"&B2)

注意:按下「Enter」鍵後,會建立一個超連結,如下圖所示。點擊該連結時,會自動建立一封 Outlook 郵件,並將收件人地址自動填入 To 欄位。

目前已將收件人電子郵件地址加入 Hyperlink公式。請繼續下列步驟,根據需要添加主旨、抄送收件人及內容。


1.1.1.2 在 Hyperlink公式中添加抄送(Cc)收件人

若要在 Hyperlink 函數中添加抄送收件人,請在公式中加入「?cc=」,如下所示。

"?cc=" & C2
其中 C2 儲存格包含抄送收件人的電子郵件地址。

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]。

本例中,我希望超連結儲存格顯示「Email to xx」的文字,其中 xx 為 A2 儲存格的收件人姓名。因此,F2 的公式應修改為:

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

按下「Enter」鍵即可取得結果。

選取此公式儲存格,然後拖曳「自動填滿控點」以建立其他郵件超連結。請參考下圖:


1.1.2 使用 Hyperlink 函數從 Excel 發送電子郵件

除了使用上述 Hyperlink公式外,您也可以手動透過 Excel 的「插入超連結」功能建立郵件超連結。本節將說明具體步驟。

1.於欲插入超連結的電子郵件儲存格上按右鍵,從右鍵選單選擇「連結」。

2. 在彈出的「插入超連結」對話框中,請依下列方式設定。

2.1) 在左側窗格選擇「電子郵件地址」。
2.2) 在「顯示文字」欄位中,輸入您希望在儲存格中顯示的文字;
提示:此對話框無法使用儲存格參照,因此郵件欄位需手動輸入,如下所示。
2.3) 在「電子郵件地址」欄位中,請輸入下列電子郵件地址。
mailto:email address
請將「email address」替換為您的實際電子郵件地址。若有多個地址,請以分號分隔。
2.4) 在「主旨」欄位中,您可直接指定郵件主旨及內容,請依下列方式設定:
Email subject&body=Email body
本例中,我輸入「Monthly sale&body=Hi,%0AEmail received」。
其中主旨為 Monthly sale;
以及
郵件內容為:
Hi,
Email received。(「%0A」為 Outlook 可識別的換行字元碼)
2.5) 點擊「確定」按鈕儲存超連結。請參考下圖:

當您點擊超連結時,會自動建立一封 Outlook 郵件,並將 To、主旨及內容等欄位填入,如下圖所示。

注意事項:

1) 使用此方法時,每個郵件超連結需手動建立。
2) 此方法無法添加 Cc 欄位。如需 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 for Excel」對話框。選取郵件地址清單並點擊「確定」。

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

注意事項:

1) 若不希望上述對話框彈出,並想直接在程式碼中指定郵件地址區域,請將下列程式碼:
Set xRg = Application.InputBox("Please select the addresses list:", "Kutools for 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

執行程式碼後,所選區域內的所有電子郵件地址都會顯示在郵件視窗的 To 欄位中。請參考下圖:

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


1.2.2 使用 VBA 腳本分別向儲存格中的每位收件人發送郵件

上述程式碼會將所選區域內所有電子郵件地址加入郵件視窗的 To 欄位。如果您希望分別發送郵件給每位收件人,且不讓彼此看到對方的郵件地址,可嘗試以下 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 for Excel」對話框。選取郵件地址清單並點擊「確定」。

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

注意事項:

1) 若不希望上述對話框彈出,並想直接在程式碼中指定郵件地址區域,請將下列程式碼:
Set xRg = Application.InputBox("Please select the addresses list:", "Kutools for 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 郵件視窗,每個 To 欄位分別填入對應的郵件地址,如下圖所示。

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

5. 最後,點擊「發送」按鈕,逐一發送郵件。


2. 在從 Excel 發送的郵件中插入附件或 Outlook 簽名(含 VBA 腳本)

本節將說明如何在從 Excel 發送的郵件中插入附件或 Outlook 預設簽名。

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 = " Please check and read this document."」這兩行修改郵件主旨與內容;
3) 在下列兩行:
.CC = "email address"
.BCC = "email address"
若需添加抄送和密送收件人,請將上述行中的「email address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。

3. 按下「F5」鍵執行程式碼,則當前工作表會另存為 Excel 工作簿並自動作為附件插入郵件視窗。請參考下圖:

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

注意:僅包含當前工作表的附件,其檔名與原始工作簿相同,並會加上執行程式碼的時間。


2.1.3 將當前工作簿作為附件發送郵件

學會將當前工作表作為附件發送郵件後,這裡提供另一段 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 = " Please check and read this document."」這兩行修改郵件主旨與內容;
3) 在下列兩行:
.CC = "email address"
.BCC = "email address"
若需添加抄送和密送收件人,請將上述行中的「email address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。

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"
若需添加抄送和密送收件人,請將上述行中的「Email Address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。
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"
若需添加抄送和密送收件人,請將上述行中的「Email Address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。
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 在從 Excel 發送的郵件中插入 Outlook 簽名

以上述案例為例,您已使用 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 用戶常在 Google 搜尋的條件,協助您自動從 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"
若需添加抄送和密送收件人,請將上述行中的「Email Address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。

從現在起,當 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 程式碼:當指定儲存格值變更時自動從 Excel 發送郵件

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"
若需添加抄送和密送收件人,請將上述行中的「Email Address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。

從現在起,當 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 程式碼:當儲存工作簿時自動從 Excel 發送郵件

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"
若需添加抄送和密送收件人,請將上述行中的「Email Address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。

從現在起,每當按下「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) 執行程式碼時會建立郵件。如不希望彈出郵件視窗並需直接發送,請移除 VBA 程式碼1 中的「.Display」行,並將「.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 使用 VBA 腳本從 Excel 發送一個區域的儲存格內容

假設在 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"
若需添加抄送和密送收件人,請將上述行中的「Email Address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。

4. 按下「F5」鍵執行程式碼,在跳出的「Kutools for 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"
若需添加抄送和密送收件人,請將上述行中的「email address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。

3. 按下「F5」鍵執行程式碼,在跳出的「Kutools for 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」視窗。在視窗中點擊「插入」>「模組」,然後將(用於將當前工作簿作為附件從 Excel 發送郵件的)VBA 程式碼貼到模組(程式碼)視窗中。

點此取得程式碼

注意:這裡您在第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 從指定的電子郵件帳戶發送郵件

一般情況下,透過 VBA 程式碼從 Excel 發送郵件時,寄件人帳戶會是 Outlook 的預設帳戶。若您在 Outlook 設定了多個帳戶,並希望指定某一帳戶發送郵件而非預設帳戶,可參考下列 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) 在您的程式碼中「On Error Resume Next」下方新增 VBA 程式碼2,並於 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 程式碼:透過指定的 Outlook 帳戶將當前工作簿作為郵件附件從 Excel 發送

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 程式碼:當到期日達成時自動從 Excel 發送郵件

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"
若需添加抄送和密送收件人,請將上述行中的「Email Address」替換為所需地址。
若不需要抄送和密送收件人,請在每行前加上單引號。

3. 按下「F5」鍵執行程式碼,若到期日符合條件,則會建立對應郵件。本例中會建立兩封郵件,如下圖所示。

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


5. 實用工具,輕鬆從 Excel 發送郵件

若您是 VBA 新手,上述方法可能較難操作。這裡推薦使用「Kutools for Excel」的發送電子郵件功能,透過此功能,您只需幾個點擊即可輕鬆從 Excel 發送郵件。請依下列步驟操作。

Kutools for Excel 提供超過 300 種進階功能,簡化複雜任務,提升創造力與效率。 結合 AI 能力,Kutools 能夠精準自動化任務,讓數據管理變得輕而易舉。Kutools for Excel 的詳細資訊...免費試用...
5.1 輕鬆建立包含所需郵件欄位的郵件清單

在使用發送電子郵件功能前,需先建立包含所需郵件欄位的郵件清單。這裡可利用建立郵件清單功能協助您完成。

1. 點擊「Kutools Plus」>「建立郵件清單」。

2. 在開啟的「建立郵件清單」視窗中,請依下列方式設定。

2.1) 在「選擇郵件清單需包含的欄位」區域勾選您郵件中所需欄位;
2.2) 在「如需添加附件請選擇」區域勾選所需附件;
2.3) 指定郵件清單的放置區域;
2.4) 點擊「創建」按鈕。請參考下圖:

系統會建立一份郵件清單示例表,如下圖所示。

3. 現在請將示例中的原始資料替換為您自己的欄位資料。

現在您已建立郵件清單表,請繼續使用「發送電子郵件」功能,根據所建立的欄位從 Excel 發送郵件。

Kutools for Excel - 超過 300 種必備工具,讓 Excel 功能更強大。永久免費享受 AI 功能!立即獲取


5.2 輕鬆發送包含郵件清單欄位的郵件

建立好包含所需郵件欄位的郵件清單(點此了解如何操作)後,即可利用這些欄位從 Excel 發送郵件。

1. 選取整個郵件清單,點擊「Kutools Plus」>「發送電子郵件」。

2. 在「發送電子郵件」對話框中,請依下列方式設定。

2.1) 各欄位會根據郵件清單自動填入對應欄位;
提示:若此時不需某欄位,請於下拉選單選擇空白選項。
2.2)「插入佔位符」(可選):如需在郵件內容中插入變數資訊。
例如,您可能需要向多位收件人發送郵件,並為每位收件人個別顯示姓名,請將游標放在郵件內容需插入佔位符的位置,選擇「E: 姓」(或郵件清單中的其他姓名欄位),然後點擊「插入佔位符」按鈕;
收件人收到郵件時,郵件內容相同但姓名各自不同。
2.3) 編輯郵件內容;
2.4) 請確認已勾選「使用 Outlook 發送」;
2.5) 點擊「發送」按鈕。請參考下圖:

3. 隨後會跳出「Kutools for Excel」對話框,告知已發送郵件數量,點擊「確定」關閉對話框。

提示:您可至 Outlook 的「已發送郵件」資料夾檢查已發送郵件。


5.3 輕鬆發送帶有 HTML內容(含超連結、圖片等)的郵件

發送電子郵件功能允許您建立 HTML 郵件,可包含超連結、圖片、不同字號與顏色等。

建立好包含所需郵件欄位的郵件清單後,在設定發送電子郵件對話框時,可利用工具列上的選項豐富郵件內容。

請參考下圖:


5.4 發送郵件時輕鬆插入 Outlook 預設簽名

上述方法中,我們已示範如何利用 VBA 程式碼發送帶有 Outlook 預設簽名的郵件。若使用發送電子郵件功能,只需勾選一個選項,即可自動在從 Excel 發送的郵件中插入 Outlook 預設簽名。

建立好包含所需郵件欄位的郵件清單後,在設定發送電子郵件對話框時,請點擊「選項」>「使用 Outlook 的簽名設定」。

注意:請確保「使用 Outlook 的簽名設定」選項前有勾選。

收件人收到郵件時,可在郵件內容結尾看到 Outlook 預設簽名。


5.5 輕鬆從指定電子郵件帳戶發送郵件

若需指定某一電子郵件帳戶從 Excel 發送郵件而非預設帳戶,發送電子郵件功能也可輕鬆實現。

建立好包含所需郵件欄位的郵件清單後,在設定發送電子郵件對話框時,請點擊「選項」>「發送自」,然後選擇所需的電子郵件帳戶。

注意:選擇電子郵件帳戶後,前方會顯示勾選標記。

點此了解更多發送電子郵件功能。

Kutools for Excel - 超過 300 種必備工具,讓 Excel 功能更強大。永久免費享受 AI 功能!立即獲取

總結來說,從 Excel 發送郵件在日常工作中非常實用。本文涵蓋了從 Excel 發送郵件的多種主題,若有其他主題或更簡單的解決方案,歡迎留言告知。

最佳辦公效率工具

🤖 Kutools AI 助手:基於智能執行方式革新數據分析:智能執行   |  生成代碼  |  創建自訂公式  |  分析數據並生成圖表  |  調用 Kutools 函數
熱門功能查找、標記重複值或識別重複項   |  刪除空行   |  合併列或單元格而不丟失數據   |   四捨五入無需公式 ...
高級 LOOKUP多條件 VLookup    多值 VLookup  |   多表查找   |   模糊查找 ....
高級下拉列表快速創建下拉列表   |  依賴下拉列表   |  多選下拉列表 ....
列管理器添加特定數量的列  |  移動列  |  切換隱藏列的可見狀態  |  比較區域和列 ...
特色功能網格聚焦   |  設計檢視   |   增強編輯欄    工作簿與工作表管理器   |  資源庫(自動文本)   |  日期提取器   |  合併資料   |  加密/解密儲存格    按列表發送電子郵件   |  超級篩選   |   特殊篩選(篩選粗體/斜體/刪除線...) ...
頂級 15 種工具集12 個文本工具添加文本刪除特定字符、...)   |   50+ 圖表 類型甘特圖、...)   |   40+ 實用 公式基於生日計算年齡、...)   |   19 個插入工具插入QR碼根據路徑插入圖片、...)   |   12 個轉換工具金額轉大寫匯率轉換、...)   |   7 個合併與分割工具高級合併行分割儲存格、...)   |   ... 還有更多

使用 Kutools for Excel 提升您的 Excel 技巧,體驗前所未有的高效。 Kutools for Excel 提供超過 300 種高級功能來提高生產力並節省時間。  點擊這裡獲取您最需要的功能...


Office Tab 將標籤式界面帶到 Office,讓您的工作更加輕鬆

  • 在 Word、Excel、PowerPoint、Publisher、Access、Visio 和 Project 中啟用標籤式編輯和閱讀。
  • 在同一窗口的新標籤中打開和創建多個文檔,而不是在新窗口中。
  • 將您的生產力提高 50%,每天為您減少數百次鼠標點擊!