如何使用Excel發(fā)送郵件匣缘?

假設(shè)你有一個Excel,其中列出了所有收件人的信息鲜棠,如下所示:

根據(jù)列表發(fā)送郵件

如果需要向列表中的每個用戶發(fā)送一封郵件肌厨,最好使用當(dāng)前記錄生成一個附件,并且格式如下:

姓名,
發(fā)送消息

你應(yīng)該怎么辦豁陆?一個一個拷貝發(fā)送柑爸?用python?
答案是盒音,都不用表鳍,Excel自己解決。
通過本文祥诽,你將知道以下問題的答案:

  1. 什么是VBA
  2. VBA能夠做什么
  3. 怎么編輯VBA
  4. 如何將VBA保存到Excel文件
  5. 為你的VBA腳本創(chuàng)建一個快捷鍵
  6. VBA如何創(chuàng)建一個Excel文件
  7. VBA如何將本Excel中的數(shù)據(jù)讀出并寫到另一個文件
  8. VBA如何生成并發(fā)送一個郵件譬圣?
  9. 發(fā)送郵件過程總述

1. 什么是VBA

根據(jù)微軟官網(wǎng)的解釋:

Office Visual Basic for Applications (VBA) 是事件驅(qū)動的編程語言,可以借助它擴展 Office 應(yīng)用程序雄坪。

https://docs.microsoft.com/zh-cn/office/vba/api/overview/

根據(jù)官網(wǎng)定義厘熟,我們不難理解,VBA是用來擴展Office軟件功能的一門編程語言诸衔。并且VBA不僅僅可以用在Excel盯漂,還能用在Outlook颇玷,Access笨农,Word等Office軟件中。
這就為我們使用VBA讀取Excel內(nèi)容并發(fā)送郵件奠定了基礎(chǔ)帖渠。

2. VBA能夠做什么

作為一門編程語言谒亦,理論上講,VBA可以做到任何編程語言可以做到的事情空郊,比如:

  • 根據(jù)Excel中數(shù)據(jù)進行數(shù)據(jù)統(tǒng)計份招,并生成報表
  • 訪問網(wǎng)絡(luò),并進行數(shù)據(jù)采集(網(wǎng)絡(luò)爬蟲)
  • 進行數(shù)據(jù)遷移狞甚,過濾...

可以說锁摔,只要有Office軟件存在的地方,VBA都可以有用武之地哼审。

3. 怎么編輯VBA

編輯VBA的時候谐腰,通常使用Visual Basic編輯器進行孕豹。要訪問Visual Basic編輯器,需要到功能區(qū)的"開發(fā)工具"選項卡中查找十气。

在手動啟用"開發(fā)工具"選項卡之前励背,它默認(rèn)是禁用掉的,我們可以通過如下方式啟用"開發(fā)工具"選項卡:

  1. 在 “文件” 選項卡上砸西,選擇 “選項” 以打開 “選項” 對話框叶眉。
  2. 選擇該對話框左側(cè)的 “自定義功能區(qū)”。
  3. 在該對話框左側(cè)的 “從下列位置選擇命令” 下芹枷,選擇 “常用命令”衅疙。
  4. 在該對話框右側(cè)的 “自定義功能區(qū)” 下,從下拉列表框中選擇 “主選項卡”鸳慈,然后選中 “開發(fā)工具” 復(fù)選框炼蛤。
  5. 選擇“確定”。

備注:在 Office 2007 中蝶涩,顯示 “開發(fā)工具” 選項卡的方法是選擇 Office 按鈕理朋,選擇 “選項”,然后在 “選項” 對話框的 “常用” 類別中選中 “在功能區(qū)顯示‘開發(fā)工具’選項卡” 復(fù)選框绿聘。
https://docs.microsoft.com/zh-cn/office/vba/library-reference/concepts/getting-started-with-vba-in-office

啟用"開發(fā)工具"選項卡之后嗽上,要編輯VBA就很簡單了,只要切換到"開發(fā)工具"選項卡熄攘,點擊"Visual Basic"按鈕兽愤,就會彈出Visual Basic編輯器了:

  1. 點擊 "Visual Basic" 按鈕


    點擊 "Visual Basic" 按鈕
  2. 彈出Visual Basic編輯器


    彈出Visual Basic編輯器

在彈出的"Visual Basic" 編輯器中,我們可以看到挪圾,左側(cè)顯示了工程框和屬性框浅萧。
在工程框中,列出了當(dāng)前以打開的所有的Excel文件信息哲思,如圖所示洼畅,當(dāng)前,我打開了兩個Excel文件棚赔,分別為 "工作簿2.xlsx" 和 "工作簿4)帝簇。

雙擊左側(cè)"工作簿2.xlsx"節(jié)點下的 "Microsoft Excel 對象" -> Sheet1(Sheet1) ,在右側(cè)就會顯示編輯器的編輯區(qū):


顯示代碼編輯窗體

讓我們寫一行代碼靠益,打個招呼丧肴,復(fù)制如下代碼到編輯區(qū):

Sub SayHello()
    MsgBox "Hello"
End Sub

點擊工具欄的運行圖標(biāo),如圖所示:

編輯代碼

然后程序會彈出一個對話框胧后,讓你選擇一個宏芋浮,來執(zhí)行,如下:


選擇要運行的宏

在對話框中壳快,我們看到了我們定義的SayHello纸巷,選中它江醇,點擊右側(cè)的"運行"按鈕。
現(xiàn)在何暇,激動人心的時刻到來了陶夜,程序彈出了一個對話框:

彈出我們要的對話框

到此為止,我們已經(jīng)讓VBA彈出了一個對話框裆站,接下來保存文件条辟。
之后,我們發(fā)現(xiàn)宏胯,我們寫的代碼在"工作簿2.xlsx"中消失了羽嫡。

接下來,我們聊聊怎么把代碼保存到Excel中肩袍。

4. 如何將VBA保存到Excel文件

在默認(rèn)情況下杭棵,office 文件(.xls,.xlsx,*.doc...)不允許保存宏(VBA代碼),這個時候就需要將我們的文件保存為一種特殊的可以包含宏腳本的文件格式氛赐,對于Excel來說魂爪,執(zhí)行如下過程保存:

1. 點擊 "文件"-->"另存為"

文件另存為

2. 選擇文件格式為"Excel啟用宏的工作簿"

選擇文件格式為xlsm

3. 點擊"保存"

點擊保存之后,我們就得到了我們的目標(biāo)文件艰管。


保存后的文件

最后滓侍,我們發(fā)現(xiàn)广鳍,我們的文件擴展名變成了"xlsm"规哲,這就是我們要保存的目標(biāo)文件了,我們的腳本就保存在這個文件中抒线。

關(guān)閉當(dāng)前Excel缸浦,然后再打開新文件夕冲,我們發(fā)現(xiàn),我們的腳本已經(jīng)原樣保存了:


腳本已保存

5. 為你的VBA腳本創(chuàng)建一個快捷鍵

如果我們要運行一段代碼裂逐,每次都要打開代碼編輯器歹鱼,然后去點擊啟動按鈕,也太麻煩了絮姆。那么有沒有一種快速運行代碼的方法呢醉冤?答案當(dāng)然是肯定的秩霍,那就是為代碼設(shè)置一個快捷鍵篙悯。

設(shè)置快捷鍵的過程如下:

1. 在Excel中選擇"開發(fā)工具"面板,點擊"宏"按鈕

點擊宏按鈕

2. 在彈出的宏對話框中铃绒,選中要執(zhí)行的宏鸽照,這里為"Sheet1.SayHello",之后點擊右側(cè)的"選項"按鈕

選中添加快捷鍵的宏名

3. 在彈出的"宏選項"對話框中颠悬,在快捷鍵輸入快捷鍵矮燎,這里以 r 為例

輸入快捷鍵 r

點擊"確定"按鈕之后定血,激活當(dāng)前Excel窗體,按下 "Ctrl + r"快捷鍵诞外,我們發(fā)現(xiàn)彈出了我們要的消息框澜沟,如下:

點擊快捷鍵運行

6. VBA如何創(chuàng)建一個Excel文件

經(jīng)歷以上內(nèi)容,我們已經(jīng)可以打開Visual Basic編輯器峡谊,可以寫代碼茫虽,可以將代碼保存到文件,最終既们,我們還為我們的代碼執(zhí)行創(chuàng)建了快捷鍵濒析。
那么接下來,為了給我們的郵件添加一個附件啥纸,我們需要先創(chuàng)建一個新的Excel工作簿文檔号杏,怎么做呢?

在我們寫代碼之前斯棒,請先參考如下資料:

了解 Visual Basic 語法
https://docs.microsoft.com/zh-cn/office/vba/language/concepts/getting-started/understanding-visual-basic-syntax
Office VBA入門
https://docs.microsoft.com/zh-cn/office/vba/library-reference/concepts/getting-started-with-vba-in-office
Application 對象 (Excel Graph)
https://docs.microsoft.com/zh-cn/office/vba/api/excel.application-graph-object

在了解以上信息之后盾致,我們不難理解如下代碼:

Sub SayHello()
    ' 定義一個變量,用于引用新建的 Workbook
    Dim newWorkbook  As Workbook
    ' 新增一個 Workbook荣暮,并引用
    Set newWorkbook = Workbooks.Add
        On Error GoTo E
    ' 將新建的 Workbook 保存到 "D:\xx.xlsx" 路徑绰上。
    ' 這里如果文件已存在,會提示是否覆蓋.
    ' 路徑要使用 '\' 進行目錄隔離渠驼,使用'/'會報錯
    newWorkbook.SaveAs ("D:\xx.xlsx")
        On Error GoTo Dispose
Dispose:
    ' 最后蜈块,關(guān)閉新建的 Workbook。
    newWorkbook.Close
E:
End Sub

接下來迷扇,我們?yōu)樾陆ǖ?Workbook 新增一個 Worksheet百揭,用于寫入數(shù)據(jù):

Sub SayHello()
    ' 定義一個變量,用于引用新建的 Workbook
    Dim newWorkbook  As Workbook
    ' 定義一個變量蜓席,用于引用新增的 Worksheet
    Dim newWorksheet As Worksheet
    ' 新增一個 Workbook器一,并引用
    Set newWorkbook = Workbooks.Add
        On Error GoTo E
    
    ' 添加一個 Worksheet
    Set newWorksheet = newWorkbook.Sheets.Add
        On Error GoTo E
    ' 將新建的 Worksheet 命名為 'attachment'
    newWorksheet.Name = "attachment"
    
    ' 將新建的 Workbook 保存到 "D:\xx.xlsx" 路徑。
    ' 這里如果文件已存在厨内,會提示是否覆蓋.
    ' 路徑要使用 '\' 進行目錄隔離祈秕,使用'/'會報錯
    newWorkbook.SaveAs ("D:\xx.xlsx")
        On Error GoTo Dispose
Dispose:
    ' 最后,關(guān)閉新建的 Workbook雏胃。
    newWorkbook.Close
E:
End Sub

在這里请毛,我們主要是添加了一個工作表,并將工作包的名字命名為 'attachment'瞭亮,運行以上代碼方仿,我們看到在 D 盤下,生成了一個新文件 xx.xlsx,并且有一個工作表名字為 'attachment':

生成一個帶有attachment工作表的工作簿

7. VBA如何將本Excel中的數(shù)據(jù)讀出并寫到另一個文件

至第6節(jié)為止仙蚜,我們已經(jīng)可以使用VBA創(chuàng)建一個Excel文件了此洲,那么接下來,我們聊聊怎么向新增的文件中添加內(nèi)容委粉,將代碼修改為如下:

Sub SayHello()
    ' 定義一個變量呜师,用于引用新建的 Workbook
    Dim newWorkbook  As Workbook
    ' 定義一個變量,用于引用新增的 Worksheet
    Dim newWorksheet As Worksheet
    ' 定義一個工作表引用贾节,用于引用當(dāng)前工作簿的 'datasource' 工作表
    Dim srcWorksheet As Worksheet
    
    ' 分別定義數(shù)據(jù)源標(biāo)題的 Range 和數(shù)據(jù) Range匣掸,用于獲取數(shù)據(jù)
    Dim rgTitleSrc   As Range
    Dim rgDataSrc    As Range
    
    ' 分別定義目標(biāo)標(biāo)題的 Range 和數(shù)據(jù) Range,用于寫入數(shù)據(jù)
    Dim rgTitleDest  As Range
    Dim rgDataDest   As Range
    
    ' 標(biāo)記當(dāng)前選中行
    Dim selectedRow  As Integer
    
    ' 新增一個 Workbook氮双,并引用
    Set newWorkbook = Workbooks.Add
        On Error GoTo E
    
    ' 添加一個 Worksheet
    Set newWorksheet = newWorkbook.Sheets.Add
        On Error GoTo Dispose
        
    ' 將新建的 Worksheet 命名為 'attachment'
    newWorksheet.Name = "attachment"
    
    ' 獲取到當(dāng)前工作簿的 'datasource' 工作表引用
    Set srcWorksheet = ThisWorkbook.Worksheets("datasource")
        On Error GoTo Dispose
    
    ' 激活數(shù)據(jù)源工作表碰酝,以復(fù)制數(shù)據(jù)
    srcWorksheet.Activate
        On Error GoTo Dispose
    ' 設(shè)置當(dāng)前選中行
    selectedRow = Selection.Row
        On Error GoTo Dispose
    
    ' 選中標(biāo)題區(qū)域 title
    Set rgTitleSrc = srcWorksheet.Range("A1", "C1")
        On Error GoTo Dispose
    ' 選中數(shù)據(jù)區(qū)域,當(dāng)前選中行
    Set rgDataSrc = srcWorksheet.Range("A" & selectedRow, "C" & selectedRow)
        On Error GoTo Dispose
        
    With newWorksheet
        ' 復(fù)制數(shù)據(jù)源標(biāo)題
        rgTitleSrc.Copy
        ' 將復(fù)制內(nèi)容粘貼到 A1
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        
        Application.CutCopyMode = False
        ' 復(fù)制數(shù)據(jù)源數(shù)據(jù)
        rgDataSrc.Copy
        .Cells(2, "A").PasteSpecial Paste:=8
        .Cells(2, "A").PasteSpecial xlPasteValues, , False, False
        .Cells(2, "A").PasteSpecial xlPasteFormats, , False, False
        ' 激活并選中目標(biāo)工作表
        newWorkbook.Activate
        newWorkbook.Sheets(newWorksheet.Index).Select
        '最終選中 A1 單元格
        .Cells(1).Select
            On Error Resume Next
        
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
            On Error GoTo Dispose
    
    End With
    
    ' 將新建的 Workbook 保存到 "D:\xx.xlsx" 路徑戴差。
    ' 這里如果文件已存在送爸,會提示是否覆蓋.
    ' 路徑要使用 '\' 進行目錄隔離,使用'/'會報錯
    newWorkbook.SaveAs ("D:\xx.xlsx")
        On Error GoTo Dispose
Dispose:
    ' 最后暖释,關(guān)閉新建的 Workbook袭厂。
    newWorkbook.Close
E:
End Sub

好了,讓我們試試成果球匕,按照如下步驟操作纹磺,看看有沒有生成我們要的文件?

1. 選中我們源文件中要添加到目標(biāo)文件數(shù)據(jù)的那一行的任何一個單元格亮曹,如下:

選中一個有數(shù)據(jù)的單元格

2. 打開新生成的文件橄杨,可以看到數(shù)據(jù)已經(jīng)寫入了新文件

生成目標(biāo)文件

可以看到,我們需要的數(shù)據(jù)已經(jīng)放到目標(biāo)文件中去了照卦。怎么做到的呢式矫?看看代碼中以單引號開始的行吧,有說明
笑一笑十年少

役耕。

8. VBA如何生成并發(fā)送一個郵件采转?

到目前為止,雖然我們成功的生成了我們的目標(biāo)文件瞬痘,但是還沒有關(guān)系到郵件發(fā)送故慈。
本節(jié),我們將詳細(xì)討論發(fā)送郵件的過程框全。

首先察绷,讓我們給我們剛開始定義的子程序SayHello改個名,叫做GenerateAttachment竣况,如下:

Sub GenerateAttachment()
    ' 定義一個變量克婶,用于引用新建的 Workbook
    Dim newWorkbook  As Workbook
    ' 定義一個變量筒严,用于引用新增的 Worksheet
    Dim newWorksheet As Worksheet
    ' 定義一個工作表引用丹泉,用于引用當(dāng)前工作簿的 'datasource' 工作表
    Dim srcWorksheet As Worksheet
    
    ' 分別定義數(shù)據(jù)源標(biāo)題的 Range 和數(shù)據(jù) Range情萤,用于獲取數(shù)據(jù)
    Dim rgTitleSrc   As Range
    Dim rgDataSrc    As Range
    
    ' 分別定義目標(biāo)標(biāo)題的 Range 和數(shù)據(jù) Range,用于寫入數(shù)據(jù)
    Dim rgTitleDest  As Range
    Dim rgDataDest   As Range
    
    ' 標(biāo)記當(dāng)前選中行
    Dim selectedRow  As Integer
    
    ' 新增一個 Workbook摹恨,并引用
    Set newWorkbook = Workbooks.Add
        On Error GoTo E
    
    ' 添加一個 Worksheet
    Set newWorksheet = newWorkbook.Sheets.Add
        On Error GoTo Dispose
        
    ' 將新建的 Worksheet 命名為 'attachment'
    newWorksheet.Name = "attachment"
    
    ' 獲取到當(dāng)前工作簿的 'datasource' 工作表引用
    Set srcWorksheet = ThisWorkbook.Worksheets("datasource")
        On Error GoTo Dispose
    
    ' 激活數(shù)據(jù)源工作表筋岛,以復(fù)制數(shù)據(jù)
    srcWorksheet.Activate
        On Error GoTo Dispose
    ' 設(shè)置當(dāng)前選中行
    selectedRow = Selection.Row
        On Error GoTo Dispose
    
    ' 選中標(biāo)題區(qū)域 title
    Set rgTitleSrc = srcWorksheet.Range("A1", "C1")
        On Error GoTo Dispose
    ' 選中數(shù)據(jù)區(qū)域,當(dāng)前選中行
    Set rgDataSrc = srcWorksheet.Range("A" & selectedRow, "C" & selectedRow)
        On Error GoTo Dispose
        
    With newWorksheet
        ' 復(fù)制數(shù)據(jù)源標(biāo)題
        rgTitleSrc.Copy
        ' 將復(fù)制內(nèi)容粘貼到 A1
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        
        Application.CutCopyMode = False
        ' 復(fù)制數(shù)據(jù)源數(shù)據(jù)
        rgDataSrc.Copy
        .Cells(2, "A").PasteSpecial Paste:=8
        .Cells(2, "A").PasteSpecial xlPasteValues, , False, False
        .Cells(2, "A").PasteSpecial xlPasteFormats, , False, False
        ' 激活并選中目標(biāo)工作表
        newWorkbook.Activate
        newWorkbook.Sheets(newWorksheet.Index).Select
        '最終選中 A1 單元格
        .Cells(1).Select
            On Error Resume Next
        
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
            On Error GoTo Dispose
    
    End With
    
    ' 將新建的 Workbook 保存到 "D:\xx.xlsx" 路徑晒哄。
    ' 這里如果文件已存在睁宰,會提示是否覆蓋.
    ' 路徑要使用 '\' 進行目錄隔離,使用'/'會報錯
    newWorkbook.SaveAs ("D:\xx.xlsx")
        On Error GoTo Dispose
Dispose:
    ' 最后寝凌,關(guān)閉新建的 Workbook柒傻。
    newWorkbook.Close
E:
End Sub

那么現(xiàn)在,GenerateAttachment存在的意義较木,就只剩下在"D:\xx.xlsx"生成附件文件了红符。

接下來,讓我們在GenerateAttachment上方添加一個函數(shù)伐债,如下:

Sub SendMail()
    GenerateAttachment
End Sub

從代碼我們可以看到预侯,SendMail子程序調(diào)用了GenerateAttachment子程序,經(jīng)過測試峰锁,這樣和只有一個GenerateAttachment子程序產(chǎn)生的結(jié)果是一樣的萎馅。

那么,接下來我們怎么辦呢虹蒋?

我們先創(chuàng)建一個Outlook進程糜芳,然后創(chuàng)建一個郵件消息,然后從我們的Excel中讀取消息魄衅,設(shè)置新建郵件消息的內(nèi)容以及將之前生成的附件添加到郵件中耍目,修改SendMail代碼如下:

Sub SendMail()
    
    ' 聲明一個引用,用于引用我們的 OutLook 實例徐绑。
    Dim mailApp      As Object
    ' 聲明引用邪驮,用于引用我們的郵件實例。
    Dim mail         As Object
    
    ' 用于訪問源工作表中數(shù)據(jù)
    Dim srcWorksheet As Worksheet
    ' 用于記錄當(dāng)前選中行
    Dim selectedRow  As Integer
    
    ' 生成附件
    GenerateAttachment
     
    
    ' 獲取到當(dāng)前工作簿的 'datasource' 工作表引用
    Set srcWorksheet = ThisWorkbook.Worksheets("datasource")
        On Error GoTo E
    
    ' 激活數(shù)據(jù)源工作表傲茄,以復(fù)制數(shù)據(jù)
    srcWorksheet.Activate
        On Error GoTo E
    ' 設(shè)置當(dāng)前選中行
    selectedRow = Selection.Row
        On Error GoTo E
    
    ' 生成 Outlook 程序?qū)ο?    Set mailApp = CreateObject("Outlook.Application")
        On Error GoTo Dispose
    ' 生成一個郵件信息
    Set mail = mailApp.CreateItem(olMailItem)
        On Error GoTo Dispose
    
    
    With mail
        ' 設(shè)置收件人為源工作表的當(dāng)前選中行的B列單元格的值
        .To = srcWorksheet.Cells(selectedRow, "B").Value
        ' 設(shè)置抄送人
        .CC = ""
        ' 設(shè)置密送人
        .BCC = ""
        ' 設(shè)置郵件標(biāo)題
        .Subject = "一封新郵件"
        ' 設(shè)置附件毅访,附件已經(jīng)由 GenerateAttachment 子程序放在
        ' D:\xx.xlsx,所以這里我們直接將其添加進來
        .Attachments.Add "D:\xx.xlsx"
        ' 設(shè)置郵件內(nèi)容文本盘榨,其中從A列取用戶名喻粹,C列取消息
        ' 然后合并,作為郵件體
        .Body = srcWorksheet.Cells(selectedRow, "A").Value & "," & vbNewLine & srcWorksheet.Cells(selectedRow, "C").Value
        ' 最后草巡,顯示郵件信息
        .Display
    End With
    
Dispose:
E:
    
End Sub

試運行守呜,我們發(fā)現(xiàn),生成了目標(biāo)附件,并且彈出了一個Outlook新建郵件的窗口查乒,如下:


顯示郵件發(fā)送窗口

嗯弥喉,看起來不錯,我們得到了郵件玛迄,然后我們再編輯快捷方式由境,將 SendMail的調(diào)用快捷方式改為 "Ctrl+r",那么每次我們選中一行數(shù)據(jù)蓖议,并且按下快捷鍵的時候虏杰,就會自動生成我們要發(fā)送的文件了。

注意:

  1. 這里為了演示方便勒虾,我們將生成附件的路徑寫死了纺阔,請根據(jù)你的實際情況修改;
  2. 在運行宏的時候修然,有可能遇到宏被禁用的情況笛钝,這種情況下,打開Excel(xlsm)文件時低零,在Excel上方會顯示啟用宏的提示婆翔,只要點擊啟用就可以了。
  3. 在運行我們的程序的時候掏婶,目標(biāo)Excel(xx.xlsx)不能打開啃奴,否則會導(dǎo)致生成附件失敗。

9. 發(fā)送郵件過程總述

好了雄妥,我們總結(jié)一下使用Excel發(fā)送郵件的主流程:

  1. 使用 Workbooks.Add 方法最蕾,新建一個Excel附件工作簿;
  2. 使用 newWorkbook.Sheets.Add 方法老厌,新增一個工作表瘟则;
  3. 使用 newWorksheet.Name,設(shè)置新建工作表的名稱枝秤;
  4. 使用 newWorksheet.Range 方法醋拧,分別選中要添加到目標(biāo)文件的區(qū)域;
  5. 使用Range.Copy以及Cells.PasteSpecial.Paste等淀弹,將復(fù)制的區(qū)域復(fù)制到目標(biāo)工作表的指定位置丹壕;
  6. 使用newWorkbook.SaveAs方法,將工作表保存到我們預(yù)定義的位置薇溃;
  7. 使用 CreateObject("Outlook.Application") 調(diào)用菌赖,生成一個Outlook進程對象;
  8. 使用 mailApp.CreateItem(olMailItem)調(diào)用沐序,生成一個郵件對象琉用;
  9. 分別設(shè)置郵件對象的屬性堕绩;
  10. 調(diào)用mail.Display顯示郵件或者調(diào)用mail.Send發(fā)送郵件;

到了最后邑时,我們的全部代碼如下:

Sub SendMail()
    
    ' 聲明一個引用奴紧,用于引用我們的 OutLook 實例。
    Dim mailApp      As Object
    ' 聲明引用刁愿,用于引用我們的郵件實例绰寞。
    Dim mail         As Object
    
    ' 用于訪問源工作表中數(shù)據(jù)
    Dim srcWorksheet As Worksheet
    ' 用于記錄當(dāng)前選中行
    Dim selectedRow  As Integer
    
    ' 生成附件
    GenerateAttachment
     
    
    ' 獲取到當(dāng)前工作簿的 'datasource' 工作表引用
    Set srcWorksheet = ThisWorkbook.Worksheets("datasource")
        On Error GoTo E
    
    ' 激活數(shù)據(jù)源工作表到逊,以復(fù)制數(shù)據(jù)
    srcWorksheet.Activate
        On Error GoTo E
    ' 設(shè)置當(dāng)前選中行
    selectedRow = Selection.Row
        On Error GoTo E
    
    ' 生成 Outlook 程序?qū)ο?    Set mailApp = CreateObject("Outlook.Application")
        On Error GoTo Dispose
    ' 生成一個郵件信息
    Set mail = mailApp.CreateItem(olMailItem)
        On Error GoTo Dispose
    
    
    With mail
        ' 設(shè)置收件人為源工作表的當(dāng)前選中行的B列單元格的值
        .To = srcWorksheet.Cells(selectedRow, "B").Value
        ' 設(shè)置抄送人
        .CC = ""
        ' 設(shè)置密送人
        .BCC = ""
        ' 設(shè)置郵件標(biāo)題
        .Subject = "一封新郵件"
        ' 設(shè)置附件铣口,附件已經(jīng)由 GenerateAttachment 子程序放在
        ' D:\xx.xlsx,所以這里我們直接將其添加進來
        .Attachments.Add "D:\xx.xlsx"
        ' 設(shè)置郵件內(nèi)容文本觉壶,其中從A列取用戶名脑题,C列取消息
        ' 然后合并,作為郵件體
        .Body = srcWorksheet.Cells(selectedRow, "A").Value & "," & vbNewLine & srcWorksheet.Cells(selectedRow, "C").Value
        ' 最后铜靶,顯示郵件信息
        .Display
    End With
    
Dispose:
E:
    
End Sub

Sub GenerateAttachment()
    ' 定義一個變量叔遂,用于引用新建的 Workbook
    Dim newWorkbook  As Workbook
    ' 定義一個變量,用于引用新增的 Worksheet
    Dim newWorksheet As Worksheet
    ' 定義一個工作表引用争剿,用于引用當(dāng)前工作簿的 'datasource' 工作表
    Dim srcWorksheet As Worksheet
    
    ' 分別定義數(shù)據(jù)源標(biāo)題的 Range 和數(shù)據(jù) Range已艰,用于獲取數(shù)據(jù)
    Dim rgTitleSrc   As Range
    Dim rgDataSrc    As Range
    
    ' 分別定義目標(biāo)標(biāo)題的 Range 和數(shù)據(jù) Range,用于寫入數(shù)據(jù)
    Dim rgTitleDest  As Range
    Dim rgDataDest   As Range
    
    ' 標(biāo)記當(dāng)前選中行
    Dim selectedRow  As Integer
    
    ' 新增一個 Workbook蚕苇,并引用
    Set newWorkbook = Workbooks.Add
        On Error GoTo E
    
    ' 添加一個 Worksheet
    Set newWorksheet = newWorkbook.Sheets.Add
        On Error GoTo Dispose
        
    ' 將新建的 Worksheet 命名為 'attachment'
    newWorksheet.Name = "attachment"
    
    ' 獲取到當(dāng)前工作簿的 'datasource' 工作表引用
    Set srcWorksheet = ThisWorkbook.Worksheets("datasource")
        On Error GoTo Dispose
    
    ' 激活數(shù)據(jù)源工作表哩掺,以復(fù)制數(shù)據(jù)
    srcWorksheet.Activate
        On Error GoTo Dispose
    ' 設(shè)置當(dāng)前選中行
    selectedRow = Selection.Row
        On Error GoTo Dispose
    
    ' 選中標(biāo)題區(qū)域 title
    Set rgTitleSrc = srcWorksheet.Range("A1", "C1")
        On Error GoTo Dispose
    ' 選中數(shù)據(jù)區(qū)域,當(dāng)前選中行
    Set rgDataSrc = srcWorksheet.Range("A" & selectedRow, "C" & selectedRow)
        On Error GoTo Dispose
        
    With newWorksheet
        ' 復(fù)制數(shù)據(jù)源標(biāo)題
        rgTitleSrc.Copy
        ' 將復(fù)制內(nèi)容粘貼到 A1
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        
        Application.CutCopyMode = False
        ' 復(fù)制數(shù)據(jù)源數(shù)據(jù)
        rgDataSrc.Copy
        .Cells(2, "A").PasteSpecial Paste:=8
        .Cells(2, "A").PasteSpecial xlPasteValues, , False, False
        .Cells(2, "A").PasteSpecial xlPasteFormats, , False, False
        ' 激活并選中目標(biāo)工作表
        newWorkbook.Activate
        newWorkbook.Sheets(newWorksheet.Index).Select
        '最終選中 A1 單元格
        .Cells(1).Select
            On Error Resume Next
        
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
            On Error GoTo Dispose
    
    End With
    
    ' 將新建的 Workbook 保存到 "D:\xx.xlsx" 路徑涩笤。
    ' 這里如果文件已存在嚼吞,會提示是否覆蓋.
    ' 路徑要使用 '\' 進行目錄隔離,使用'/'會報錯
    newWorkbook.SaveAs ("D:\xx.xlsx")
        On Error GoTo Dispose
Dispose:
    ' 最后蹬碧,關(guān)閉新建的 Workbook舱禽。
    newWorkbook.Close
E:
End Sub

最后的最后,不要忘了關(guān)注公眾號[編程之路漫漫]恩沽,碼途求知己誊稚,天涯覓一心。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罗心,一起剝皮案震驚了整個濱河市里伯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌协屡,老刑警劉巖俏脊,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肤晓,居然都是意外死亡爷贫,警方通過查閱死者的電腦和手機认然,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漫萄,“玉大人卷员,你說我怎么就攤上這事√谖瘢” “怎么了毕骡?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岩瘦。 經(jīng)常有香客問我未巫,道長,這世上最難降的妖魔是什么启昧? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任叙凡,我火速辦了婚禮,結(jié)果婚禮上密末,老公的妹妹穿的比我還像新娘握爷。我一直安慰自己,他們只是感情好严里,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布新啼。 她就那樣靜靜地躺著,像睡著了一般刹碾。 火紅的嫁衣襯著肌膚如雪燥撞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天教硫,我揣著相機與錄音叨吮,去河邊找鬼。 笑死瞬矩,一個胖子當(dāng)著我的面吹牛茶鉴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播景用,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼涵叮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伞插?” 一聲冷哼從身側(cè)響起割粮,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媚污,沒想到半個月后舀瓢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡耗美,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年京髓,在試婚紗的時候發(fā)現(xiàn)自己被綠了航缀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡堰怨,死狀恐怖芥玉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情备图,我是刑警寧澤灿巧,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站揽涮,受9級特大地震影響抠藕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绞吁,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一幢痘、第九天 我趴在偏房一處隱蔽的房頂上張望唬格。 院中可真熱鬧家破,春花似錦、人聲如沸购岗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喊积。三九已至烹困,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乾吻,已是汗流浹背髓梅。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绎签,地道東北人枯饿。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像诡必,于是被迫代替她去往敵國和親奢方。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容