日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vb表格控件_(超级干货)ExcelVBA拆分表格并分别发送邮件增强版

發布時間:2025/4/5 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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")??

然后,我們要搞清楚有哪些城市需要拆分是吧,所以先獲取一個有哪些城市的名單。獲取名單這事在VBA里最適合的就是用字典功能了。我們可以對要拆分的F列從F2開始一直到表格最后一行,把每個單元格的值都拿出來,如果是個新內容就加入到字典里,如果重復了就不管了

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.?

VBA可以在零點零幾秒內對幾千個數據進行處理,然后我們就可以獲取到一個城市列表啦,這列表里有9個值,分別是北京、大連、上海……運行過程中我們可以監視一下字典,看看結果:

好了,有了這份清單,我們就可以讓VBA開始分別干活啦,就以這個清單為準運行9次,每次生成一個城市的文件,這時候我們就可以用到For循環功能了,對字典里的每個項目都運行一次生成表格的代碼,每次的城市名字就用Itm這個變量名稱呼它:

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??

好啦,到這里,我們第一步就搞定了,已經獲取這9張表啦:最后,只要對代碼進行些簡單的修改,例如可以用代碼把屏幕更新關閉,這樣運行的時候屏幕就不用更新顯示每步的運行結果,運算的速度就更快了。然后我們這段拆分文件的代碼就大功告成!—?5?發送郵件案例解析接下來,就到了分別發送郵件的環節了。到郵件這一步呢,操作涉及到的知識可能就多點了,不僅僅是要在Excel里操作單元格,還需要在硬盤里操作文件,然后還要發送E-mail。但其實只要把流程理順,知道每一步要干什么,然后一個知識點一個知識點的理順,就能完成啦!1、首先,我們設定一下郵箱聯系人的工作表以及用來存儲發送結果的工作表,然后找到發送結果表還沒被使用過的新列,用來存儲本次發送的結果

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?

2、我們的初步準備工作剛才已經做完了,第二步呢,就是指定一個文件夾,然后找出其中所有的Excel文件。這一步聽上去稍微有點復雜,不過其實是有套路可以用的,比如我們可以利用Windows系統自帶的文件ActiveX控件來實現這個功能:

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??

4、現在,已經做完所有的準備工作啦,要開始發郵件啦,激動嗎?不過,發送郵件之前呢,還需要獲取到一些郵箱的設置信息,文末附錄里會以QQ郵箱為例講解怎么開通用第三方工具發送郵件的方法。其他郵箱可以在網上搜一下該如何設置,企業郵箱問IT小哥哥要一下參數就好啦!發送郵件需要用到一個CDO.Message的控件,先聲明一個控件變量:

82.Set?Cm?=?CreateObject("CDO.Message")????'創建郵件對象??

然后,這個控件主要分為幾部分:(1)設置郵件的發件人郵箱、收件人郵箱、主題、正文、附件等內容(注,在我這個案例里,我用了一個窗口來顯示和記錄郵箱的一些設置信息,這樣可以比較方便的更換其他郵箱發送,代碼里的“UserForm1.TextBox*”就是這些郵箱信息):

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??

(2)設置發件服務器信息

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??

(4)發送之后,可以獲取到是否成功發送的反饋結果,寫入結果表:

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拆分表格并分别发送邮件增强版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。