vb表格控件_(超级干货)ExcelVBA拆分表格并分别发送邮件增强版
這是POINT小數點的第?339?篇文章
點點寫在前面:
之前我們有分享過一個場景1:你制作了一份總表你想要拆分成各個分公司,并且你需要對分公司的多個同事發送郵件。如果有20幾個分公司,你要拆分+寫郵件+選擇接收者=20多次。
場景2:收集不同分公司的發過來的郵件進行整合匯總,同樣的,如果你有20幾個分公司發過來,你需要做20幾次匯總。
power BI是能解決其中的匯總與拆分,但是很多特定的場景,還是需要由VBA定制解決。
所以我們經過大家反映,重新寫了VBA代碼,讓大家更加智能化去運用這些場景。并且我們也對代碼結構進行了通俗易懂地講解。
這些都會更新在VBA代碼長期分享文件夾里面。就讓我們先來看下視頻吧,一篇干貨哦
干貨篇幅較長,先給大家看結果
具體如何完成呢?正式走進文章一起練習啦
—?1?—VBA是什么電腦和人腦有很大的差別,有些事情人腦處理的很快,但是電腦處理的就慢,比如對圖像的識別,人一眼就能看出來一張照片上有什么內容,可電腦對圖像的識別也只是最近幾年才剛剛能實現的新技術,還經常會犯錯;但是有些工作電腦就比人腦厲害很多,比如大量的計算,比如重復做千百萬次同樣的操作。所以,當我們有些工作需要機械化的重復許多次的時候,把它教給電腦來處理就事倍功半,VBA就是這樣一個能讓電腦重復工作的神器!VBA是微軟基于VB語言開發的一種寄生于其他應用程序里的語言,最常用的就是在OFFICE套件里比如Excel、World、PowerPoint都集成了VBA的開發環境,還有些其他軟件也可以使用VBA,例如AutoCAD等。當然,VBA被使用最多的還是在Excel里,它可幫助我們處理各種需要大量重復的機械化操作。—?2?—VBA和Python對比的優點另外提一下,近幾年也有不少人用比較熱門的Python語言來處理Excel表,不可否認,Python是一門強大的語言,處理表格也能又快又好。不過VBA在處理Excel表格上比起Python還是有很多很多的優勢的,這里簡單的說幾條:1、例如,VBA不需要再安裝軟件部署開發環境,只要安裝了Office的Excel軟件就能直接使用,而想用Python還需要進行復雜的安裝設置;2、VBA與Excel結合的非常好,可以直接調用絕大多數的Excel功能,比如復制、粘貼、篩選、填充公式等;3、VBA可以直觀的看到每段代碼的運行效果,可以一步一步的看你的原始表格是怎么被轉換運算的,編寫調試非常直觀;4、VBA還有個錄制宏的逆天功能,可以錄下來你的操作步驟,經過簡單的修改就能使用。—?3?—案例介紹這次,我就帶來了兩段VBA代碼的解析,如何把一張表根據某列的內容拆分成多個文件,并且可以把這些文件分別發送E-Mail給不同的人。這段代碼適合什么做什么用呢?比如有些銷售數據需要分別發送給不同的分部,比如工資表需要分別發送給不同的部門或員工等等情形。手工操作需要進行篩選、復制、新建一張表、另存、編寫郵件填寫內容和標題、添加附件、發送郵件。好了,終于完成了一個文件的發送,然后以上步驟再重復操作幾十次,煩死了!這種機械化的重復勞動交給VBA來啊,幾十秒就能全部完成了!本次案例是對一個銷售的明細表按照F列的城市名進行拆分,然后把每個文件分別發送給不同的城市經理。—?4?—拆分文件案例解析用VBA編程其實還挺容易的,其實編程的框架已經出來了,就是上面我們那些手工操作的步驟,我們用計算機的代碼一步一步實現這些步驟,并讓電腦自己重復干幾十次就好了。那么第一個步驟是什么呢?首先,我們需要給經常用的工作簿、工作表、單元格起個昵稱,這樣就不用每次都寫全名了:1.? '設定本工作表為Wb1,設定要拆分的表為Sht,設定要拆分的列的表頭單元格為Fie?? 2.? Set?Wb1?=?ThisWorkbook?? 3.? Set?St1?=?Wb1.Sheets("銷售明細表")?? 4.? Set?Fie?=?St1.Range("F1")?? |
5.? '建立一個拆分關鍵字的字典?? 6.? Set?Dic?=?CreateObject("Scripting.Dictionary")?? 7.? '對表頭下的所有單元格進行循環?? 8.? For?Each?Rng?In?St1.Range(Fie.Offset(1,?0),?Fie.End(xlDown))?? 9.? ????'判斷當前表格的值是否在字典內,如果不在,就添加到字典內?? 10.????If?Not?Dic.exists(Rng.Value)?Then?? 11.????????Dic.Add?Rng.Value,?""?? 12.????End?If?? 13.Next?? 14.? |
15.'針對字典內的每個值進行一次操作?? 16.For?Each?Itm?In?Dic.Keys??? 17.????......?? 18.Next?? 19.? |
20.'對拆分依據的列進行篩選?? 21.Fie.AutoFilter?Field:=Fie.Column,?Criteria1:=Itm?? 22.? 23.'新創立一個工作薄并設定為Wb2,其中第一個表設定為St2?? 24.Set?Wb2?=?Workbooks.Add?? 25.Set?St2?=?Wb2.Sheets(1)?? 26.? 27.'把當前表格區域所有沒隱藏的單元格區域設定為Rng?? 28.Set?Rng?=?Fie.CurrentRegion.SpecialCells(xlCellTypeVisible)?? 29.? 30.'把Rng區域復制并選擇性粘貼列寬到新表(保持新舊表列寬是一樣的)?? 31.Rng.Copy?? 32.St2.Range("A1").PasteSpecial?Paste:=xlPasteColumnWidths?? 33.'把Rng區域復制粘貼到新表?? 34.Rng.Copy?St2.Range("A1")?? 35.? 36.'把新工作簿另存一下?? 37.Wb2.SaveAs?Filename:=ThisWorkbook.Path?&?"\拆分\"?&?Itm?&?".xls"?_?? 38.????,?FileFormat:=xlExcel8,?Password:="",?WriteResPassword:="",?_?? 39.????ReadOnlyRecommended:=False,?CreateBackup:=False?? 40.'關閉新工作簿?? 41.Wb2.Close?? 42.'取消原表的篩選?? 43.Fie.AutoFilter?? |
44.Set?St1?=?ThisWorkbook.Sheets("城市經理郵箱")???? 45.Set?St2?=?ThisWorkbook.Sheets("發送結果")???? 46.???? 47.'獲取發送結果表沒使用過的列???? 48.If?St2.Range("A1").Value?=?""?Then???? 49.????Col1?=?1???? 50.Else???? 51.????Col1?=?St2.Range("XFD1").End(xlToLeft).Column?+?1???? 52.End?If??? |
53.'填寫發送結果列的表頭,設置列寬和居中???? 54.St2.Columns(Col1).ColumnWidth?=?25???? 55.St2.Cells(1,?Col1).HorizontalAlignment?=?xlCenter???? 56.St2.Cells(1,?Col1).Value?=?Date?&?Chr(10)?&?Time?&?Chr(10)?&?"?發送結果"???? |
57.n?=?0? |
58.'套路:獲取一個文件夾下的所有文件對象???????? 59.Dim?FS,?F,?FF,?Fil???????? 60.Set?FS?=?CreateObject("Scripting.FileSystemObject")???????? 61.Set?F?=?FS.GetFolder(文件夾路徑)???????? 62.Set?FF?=?F.Files???????? 63.For?Each?Fil?In?FF???????? 64.????......???????? 65.Next? |
在上面這段代碼里,FS就是控件,F就是獲取到了一個文件夾對象,FF就是文件夾里的所有文件,然后我們再用For循環對FF里的每一個文件進行操作,這樣我們就能獲取到每個文件啦。
3、獲取到文件之后再做什么呢,當時是找一下這個文件對應的收件人和郵箱啦,那怎么找呢?還記得文章最上面說的“VBA與Excel結合的非常好”這句特性嗎,在這里我們可以很簡單的利用Excel里的Match函數來搞定:
66.在通訊表的A列里用Excel的Match公式查找文件名所在行號?? 67.Row1?=?Application.Match(FN,?St1.Range("A:A"),?0)?? |
68.'用來記錄操作到第幾個文件了?? 69.n?=?n?+?1?? 70.'獲取文件的主文件名(不包含.xlsx等拓展名的文件名)?? 71.FN?=?FS.GetBaseName(Fil)?? 72.'在通訊表的A列里用Excel的Match公式查找文件名所在行號?? 73.Row1?=?Application.Match(FN,?St1.Range("A:A"),?0)?? 74.'判斷下如果Row1是個錯誤值,就是沒找到聯系人?? 75.If?IsError(Row1)?Then?? 76.????St2.Cells(n?+?1,?Col1).Value?=?"找不到“"?&?FN?&?"”的聯系人"?? 77.'判斷一下找到的聯系人的郵箱是否是*@*.*格式?? 78.ElseIf?Not?St1.Cells(Row1,?3).Value?Like?"?*@?*.?*"?Then?? 79.????St2.Cells(n?+?1,?Col1).Value?=?"“"?&?FN?&?"”郵箱地址不正確"?? 80.'如果找到聯系人,又獲取到了郵件地址,就開始發送郵件?? 81.Else?? |
82.Set?Cm?=?CreateObject("CDO.Message")????'創建郵件對象?? |
83.'設置發信人的郵箱、收件人郵箱、郵件主題、郵件正文?? 84.Cm.From?=?UserForm1.TextBox1?? 85.Cm.To?=?St1.Cells(Row1,?3).Value?? 86.Cm.Subject?=?FN?&?"銷售表"?? 87.Cm.TextBody?=?"親愛的領導和同事:"?_?? 88.&?Chr(10)?&?"????????附件為?"?&?FN?&?"?昨日的銷售情況表,請您查收。"?&?Chr(10)?&?"謝謝!"?? 89.'郵件添加附件?? 90.Cm.AddAttachment?Pth?&?Fil.Name?? |
91.'對發件服務器進行配置?? 92.stUl?=?"http://schemas.microsoft.com/cdo/configuration/"?? 93.With?Cm.Configuration.Fields?? 94.????.Item(stUl?&?"smtpusessl")?=?1?? 95.????.Item(stUl?&?"sendusing")?=?2?? 96.????.Item(stUl?&?"smtpserver")?=?UserForm1.TextBox3?'SMTP郵件服務器地址?? 97.????.Item(stUl?&?"smtpserverport")?=?UserForm1.TextBox4?'SMTP郵件服務器端口?? 98.????.Item(stUl?&?"smtpauthenticate")?=?1?? 99.????.Item(stUl?&?"sendusername")?=?UserForm1.TextBox1?'發件人郵箱?? 100.???.Item(stUl?&?"sendpassword")?=?UserForm1.TextBox2?'發件人密碼/授權碼???? 101.???.Update?? 102.End?With?? |
(3)?? 發送郵件這部就相當簡單啦:
103.'已完成設置,開始發送郵件?? 104.Cm.Send?? |
105.'發送后生成反饋信息?? 106.If?Err.Number?=?0?Then?? 107.????St2.Cells(n?+?1,?Col1).Value?=?"“"?&?FN?&?"”發送成功"?? 108.Else?? 109.????St2.Cells(n?+?1,?Col1).Value?=?"“"?&?FN?&?"”發送失敗"?? 110.????Err.Clear?? 111.End?If?? |
?再對代碼進行些簡單的修飾就可以啦!比如在代碼的最后,我們可以加上這么一句來通知我們發送完畢啦:
112.msgbox("發送完畢")?? |
下面就是本地案例的執行情況:
我的郵箱里也收到了一堆測試和演示時收到的郵件呢:
另外,成都的那個郵箱是我隨便敲的,所以不一會兒就收到了退信,但是這個就不是VBA代碼所關注的范疇啦,因為它當時真的發送成功了。
—?6?—尾聲好了,我們的案例講解到此就結束啦,講解的內容稍微有些長,不過當你把內容全都設置好,下次工作起來就很省心啦,運行一下“拆分”,再運行一下“發送”,等個幾十秒,工作就完成啦!附:如何開通QQ郵箱的第三方發件功能現在的免費郵箱為了安全起見,大部分都默認關閉了第三方發送功能,所以需要手工開通。進入到QQ郵箱的“設置”功能,打開“賬戶”的設置選項,找到下面的“POP3/IMAP……服務”這一項,把對應的“POP3/SMTP服務”開啟。然后跟著提示,可能需要編寫個短信發給騰訊,然后就能開通第三方發件功能啦。成功開通服務之后,QQ郵箱會顯示一個授權碼,要把這個授權碼保存一下,在發信的時候需要需要用到。這個授權碼是做什么呢的,其實它就是一個只能用來發郵件的密碼,不能登錄郵箱,也不能看到郵件內容。在早些年,用第三方軟件收發信件要把郵箱密碼保存到OutLook或者FoxMial軟件里的,像我們的VBA代碼也需要用明文存儲這個密碼,非常危險。所以騰訊有了這么個功能,保護你登錄郵箱的密碼,只能發信,這樣就算這個密碼被泄露了也沒什么損失,非常安全。當然,這個授權碼要是泄露也不太好呢,因為別人就可以用你的郵箱給其他人發垃圾或者詐騙郵件,所以還是盡量別告訴別人啦,所以我的案例里也把這個授權碼刪掉了,大家想使用請用自己的郵箱測試哦。開通服務之后,還需要獲取到發件服務器的地址和端口號,這個郵箱一般都有介紹,比如QQ郵箱就是點這里:點開文章里就會介紹相關的內容,比如這里,我們就能獲取到發件服務器地址和端口號,分別是smtp.qq.com和465,有了這兩個信息,我們就可以用VBA發送郵件啦!
求資源,迫不及待想練習了..關注微信公眾號:POINT小數點數據后臺輸入關鍵字:VBA長期分享你就會獲得練習所需表格《拆分郵寄案例.xlsm》,還有一些比較通用型的VBA代碼工作簿,比如拆分表格、分發郵件、合并各分公司數據等,注釋也幫你寫好了。小伙伴們,轉發這個利器給你的小伙伴們吧,因為我們會不斷更新腳本噠~大家要是遇到一些比較典型的Excel問題需要VBA解決,可以留言,我們老師會定期篩選出典型案例,分享腳本給大家(這是免費的哦)大家在后臺留言不知道怎么啟用宏,點點給大家錄了視頻了哦~同時很歡迎大家報名學習VBA課程可以讓你在實際處理Excel中大大提升工作效率!POINT.小數點Excel-VBA(第十期)正式預售點擊圖片加入看完覺得VBA太實用了!call王老師~總結
以上是生活随笔為你收集整理的vb表格控件_(超级干货)ExcelVBA拆分表格并分别发送邮件增强版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真人秀制作网站_[BoA] 出道20周年
- 下一篇: 其他系统 对外接口设计_领导:项目有个接