本文包含一丟丟的搞笑成分,如果觀看途中出現在工作崗位上笑出聲音的情況,請立刻馬上直接右上角小點點收藏後在無人時觀看,不然引發的各種後果本作者將不負任何法律責任,切記!
最近在ITgo發表了《日文郵件書寫方式及注意點》《excle快捷鍵篇》《excle常用函數篇》等乾貨文章的資深程式設計師「罐裝知識」又親手書寫了一篇專稿《用excel製作快速群發郵件的VBA小工具》,一行一碼純手工製作。
為了證明這是個有效的小工具,先上一下小go親測效果圖:
作為準備工作需要Excel跟Outlook,版本還是爭取最新吧,今天就拿這組CP來實現小go姐姐的要求吧,希望她能滿意。
閒白兒說到這兒,那麼我們開始吧。
首先,打開Excel,這裡需要先確認下有沒有打開【開發工具】選項卡。如果已經打開了,請跳過後面的309個字跟3張圖片(不信你數);如果沒有,那就接著看。
打開【文件】>【選項】,在彈出的窗口悄悄點一下【自定義功能區】,或者在功能區任意區域點滑鼠右鍵,選擇【自定義功能區】,然後在右面的列表裡面把【開發工具】前面的勾點上,這樣我們就可以在Excel的菜單的最右看到重出江湖的【開發工具】。
當然為了給這篇文章撐撐場面,這裡照例得來幾張圖。
小go注釋:
本文作者是用中文版excel操作的,如果是日本版excel設置開發者工具的圖片如下:
日文版excel的開發工具設置好後,按照接下來中文版excel的教程繼續操作就可以啦。
這樣準備工作就做好了,下面正式開始工具的開發。
※:Mac系統的Excel請按照【Excel】>【偏好設置】,在彈出的窗口選擇【功能區和工具欄】,點擊之後在右側的【自定義功能區】勾選【開發工具】。為免小go姐姐懷疑我騙稿費我這裡就不放圖了。
打開我們好不容易解放的【開發工具】選項卡,眼神好的話應該能發現一個【插入】,OMG點它點它!然後在出現的控制項選項裡面選下面【ActiveX控制項】那組裡面的頭牌,然後在下面的工作表上面用滑鼠左鍵拖拽出一個豪邁的按鈕。依照甲方爸爸的習慣,字體要大!按照慣例這裡是需要配圖的。
然後呢,在這個按鈕上滑鼠右鍵,選擇【屬性】,在裡面設置你喜歡的值。*小go旁白:就是輸入你喜歡的名字
這裡我把按鈕的顯示內容設定成一個高端大氣的動賓短語「走你」,希望大家能夠喜歡。同樣,該配的圖不能少。
剩下的呢,我們就開始編寫這個小工具吧,功能什麼的咱一點兒點兒補,敏捷開發麼,ITgo,go,go!
雙擊【走你】按鈕,自動把VBA界面打開了,同時,自動生成了按鈕的函數。驚不驚喜意不意外?
用Outlook發送郵件呢,我們得先在Excel裡面定義一個Outlook。然後呢,還得有郵件不是?所以呢,郵件我們也得定義一個。然後呢,郵件得發送是不是,發送的函數也得給配上,當然,啥都沒寫也沒啥發的,那我們就先看看郵件的樣子吧,就像下面這樣。
Private Sub CommandButton1_Click()
'Outlook程序實例
Dim emailObject As Object
Set emailObject =
CreateObject("Outlook.Application")
'郵件對象
Dim emailItem As Object
Set emailItem = emailObject.CreateItem(0)
'郵件顯示
emailItem.Display
End Sub
小go旁白:綠色帶單引號部分為注釋,本文中出現的所有注釋均為中文。
這時候我們回到Excel工作表,點一下【走你】,看看效果~PS:如果這裡點了沒反應,大可不必放心是你人品問題,你只要再點一下【開發工具】選項卡下面的【設計模式】就好。
看見了吧,一個白白胖胖的郵件出來了,雖然啥也沒有,不過至少出來了不是?中午雞腿沒有也能加個雞爪子了。當然不能止步於此,不然小go姐姐會嚴厲譴責我的,所以得往上多加點兒東西。PS2:如果這裡你出現了Outlook設置嚮導,出門左拐把配套的Outlook加完帳戶您再回來。當然,你在這裡加上也許也行。。。。。。
至於發送郵件需要的東西呢,之前郵件那篇文章可能大家還有印象,不用複習直接把答案抄給大家吧:
收件人
抄送(可選)
密送(BCC,可選)
郵件名
郵件正文
郵件發送方式(可選)
籤名(可選)
附件
基本上就是這些。
本著寧殺錯勿放過的原則,今兒個都給它設置上,不要了再刪。先加前六個看看。
Private Sub CommandButton1_Click()
'Outlook程序實例
Dim emailObject As Object
Set emailObject =
CreateObject("Outlook.Application")
'郵件對象
Dim emailItem As Object
Set emailItem = emailObject.CreateItem(0)
'郵件項目設定
With emailItem
'收件人
.To = "aaaa@test.com"
'抄送
.cc = "bbbb@test.com"
'密送
.BCC = "cccc@test.com"
'標題
.Subject = "用來給標題撐場面的"
'郵件正文
.body = "隨便寫點兒東西用來顯示郵件內容的"
& vbCr & "簡簡單單弄個不換行不換色不顯眼的籤名"
'HTML方式發送
.BodyFormat = 2
End With
'添加附件'
Call emailItem.Attachments.Add("D:\1.png")
'郵件顯示
emailItem.Display
End Sub
*小go旁白:第26行的附件:填你要發送的文件在你本地電腦的路徑以及文件名帶後綴
有時候這郵件裡的信息,比如說日期啊名字啊,這些信息在定例要發的郵件裡比較麻煩,每次都要改,還怕改的不徹底或者沒改對。這時候呢,咱們就把這些東西拿出來,大家覺得如何?就像下面這樣,調調格式,寫寫內容啥的。
小go旁白:是注意看這次表格裡多了很多項目,小白請嚴格按照圖中excle的行列輸入,尤其是這個{0}絕對不能忘。以免在後續的動態取值時發生錯誤不知所措。
Private Sub CommandButton1_Click()
'Outlook程序實例
Dim emailObject As Object
Set emailObject =
CreateObject("Outlook.Application")
'郵件對象
Dim emailItem As Object
Set emailItem = emailObject.CreateItem(0)
'郵件項目設定
With emailItem
'收件人
.To = Cells(8, 2).Value
'抄送
.cc = Cells(8, 3).Value
'密送
.BCC = Cells(8, 4).Value
'標題
.Subject =Cells(8, 5).Value
'郵件正文
.body =Replace(Cells(8, 6).Value, "{0}",
Cells(8, 9).Value) & vbCr & Cells(8, 7).Value
'HTML方式發送
.BodyFormat = 2
End With
'添加附件'
Call emailItem.Attachments.Add(Cells(8, 8).Value)
'郵件顯示
emailItem.Display
End Sub
小go旁白:這裡的第26行你要發送的附件在本地電腦中的本地路徑以及文件名帶後綴,需保存在excel的第8行8列中。
雖然目前為止這個工具,收件人,抄送,密送都可以跟Outlook裡面一樣加個分號來多人發送,但是也不能一次就發一封郵件不是?那樣局限性也太大了,比如說用工具給第一部門發個通知,難不成還得等著發完了再填第二部門的再點一次?NoNoNo,小姐姐要的是能解放雙手,一個按鈕分分鐘幾百封垃圾郵件嗖嗖嗖的發出去的,那咱就得加個循環了~
小go旁白:小白同學請再次嚴格按照圖片中excle的行列輸入數據。
當然,代碼還是得收拾一下,就像下面這樣,在最外層加一個大循環:
Private Sub CommandButton1_Click()
'取得有數據的最後一行
Dim maxRow As Long
maxRow = Cells(Rows.Count, 1).End(xlUp).Row
'有數據的行循環
For i = 8 To maxRow
'Outlook程序實例
Dim emailObject As Object
Set emailObject =
CreateObject("Outlook.Application")
'郵件對象
Dim emailItem As Object
Set emailItem = emailObject.CreateItem(0)
'郵件項目設定
With emailItem
'收件人
.To = Cells(8, 2).Value
'抄送
.cc = Cells(8, 3).Value
'密送
.BCC = Cells(8, 4).Value
'標題
.Subject =Cells(8, 5).Value
'郵件正文
.body =Replace(Cells(8, 6).Value, "{0}",
Cells(8, 9).Value) & vbCr & Cells(8, 7).Value
'HTML方式發送
.BodyFormat = 2
End With
'添加附件'
Call emailItem.Attachments.Add(Cells(8, 8).Value)
'郵件顯示
emailItem.Display
Next i
End Sub
到這裡這個工具已經可以用了,最後附贈一個機能吧。考慮到不是每次都發送同樣的人,但是呢,有些郵件的設定還是要保留以防將來用到,那麼我們就拿個東西過濾一下吧。正好,序列號這一列用處不太大,來改造一下。
把這一列改成數據驗證,來判斷發送還是不發送,這裡就以【Yes】【No】為例
加個過濾器
Private Sub CommandButton1_Click()
'取得有數據的最後一行
Dim maxRow As Long
maxRow = Cells(Rows.Count, 1).End(xlUp).Row
'有數據的行循環
For i = 8 To maxRow
If Cells(i, 1).Value = "Yes" Then
'Outlook程序實例
Dim emailObject As Object
Set emailObject =
CreateObject("Outlook.Application")
'郵件對象
Dim emailItem As Object
Set emailItem = emailObject.CreateItem(0)
'郵件項目設定
With emailItem
'收件人
.To = Cells(8, 2).Value
'抄送
.cc = Cells(8, 3).Value
'密送
.BCC = Cells(8, 4).Value
'標題
.Subject =Cells(8, 5).Value
'郵件正文
.body =Replace(Cells(8, 6).Value, "{0}",
Cells(8, 9).Value) & vbCr & Cells(8, 7).Value
'HTML方式發送
.BodyFormat = 2
End With
'添加附件'
Call emailItem.Attachments.Add(Cells(8, 8).Value)
'郵件顯示
emailItem.Display
End If
Next i
End Sub
這樣也許可能大概沒準兒似乎好像八成差不多能矇混過小go姐姐的需求了吧~
最後,把文件顯示改成發送,發送完把對象都釋放了吧,這樣就穩了,就像這樣:
Private Sub CommandButton1_Click()
'取得有數據的最後一行
Dim maxRow As Long
maxRow = Cells(Rows.Count, 1).End(xlUp).Row
'有數據的行循環
For i = 8 To maxRow
If Cells(i, 1).Value = "Yes" Then
'Outlook程序實例
Dim emailObject As Object
Set emailObject =
CreateObject("Outlook.Application")
'郵件對象
Dim emailItem As Object
Set emailItem = emailObject.CreateItem(0)
'郵件項目設定
With emailItem
'收件人
.To = Cells(8, 2).Value
'抄送
.cc = Cells(8, 3).Value
'密送
.BCC = Cells(8, 4).Value
'標題
.Subject =Cells(8, 5).Value
'郵件正文
.body =Replace(Cells(8, 6).Value, "{0}",
Cells(8, 9).Value) & vbCr & Cells(8, 7).Value
'HTML方式發送
.BodyFormat = 2
End With
'添加附件'
Call emailItem.Attachments.Add(Cells(8, 8).Value)
'郵件顯示也不顯示了
'emailItem.Display
'郵件發送
emailItem.Send
'對象該放手放手。。
Set emailObject = Nothing
Set emailItem = Nothing
End If
Next i
End Sub
最後的最後,一定要記得保存文件的時候保存成可啟用宏的文件格式(*.xlsm),不然重新打開這按鈕沒反應可別來找我~
這裡只是拋磚引玉,大家可以把自己想要的功能加上, 比如發郵件之前彈一個確認框詢問是否發送啊,在另外的工作表裡把郵件的模板寫好在這裡引用啊~大家自由發揮,做出滿足自己需要的工具吧!