VBA操作OutLook批量发送工资条

论坛 期权论坛 期权     
VBA说   2019-7-13 08:08   1728   0
VBA操作OutLook
最近帮朋友做了类似功能,利用VBA操作OutLook批量发送工资条,极大节省了人力。正好来总结一下,希望为大家所用。(本篇文章默认读者电脑已经可以进行手动发送邮件,不讲解OutLook如何配置邮箱,设置发件人等信息)



先扔框架模板:VBA操作OutLook有一套固定的代码模板,可根据具体需求修改即可。


>>>>发送邮件完整模板

  1. [/code][code]Sub SendMail()
  2.     Set myOlApp = CreateObject("Outlook.Application")'//后期绑定
  3.     Set objMail = myOlApp.CreateItem(olMailItem)'新建一封邮件
  4.     With objMail
  5.         .To = "2199648674@qq.com"'//收件人
  6.         .Subject = "邮件主题" '//就是邮件标题
  7.         .Body = "邮件正文内容" '//正文具体内容
  8.         .cc = "vbatoday@163.com" '//邮件抄送人
  9.         '.BodyFormat = olFormatHTML  '//设置邮件格式 是否html 格式的,注意,在Excel中引用OutLook的时候,该参数要写成数字2
  10.         '.HTMLBody =RangetoHTML(单元格对象) '//RangetoHTML是自定义函数,见下面。
  11.         .Attachments.Add "C:\Users\Administrator\Desktop\派送单.xlsx" '//添加附件
  12.         .Display '//刷新显示效果的作用
  13.         .Send'//发送
  14.     End With
  15. End Sub
复制代码
几点注意事项:
①Display作用是把上述所有操作完成后,刷新显示OutLook软件界面,可以理解为预览。可省略。
②.BodyFormat = olFormatHTML这块注意,因为是Excel操作OutLook,所以不能直接写属性名称,而要替换成数字代号,否则会出错。正确写法:.BodyFormat = 2
这个2怎么得到的?去OutLook软件里面,Msgbox olFormatHTML。Word VBA也讲过类似注意点。
③BodyFormat=2和HTMLBody是同时出现的。




>>>>将表格内容转换为html格式的自定义函数
!!!需要注意的是:Excel默认情况下,网格线不会被识别。只有人为设置了边框线后,用该函数转化过,才会显示边框线。
  1. Public Function RangetoHTML(rng As Range)
  2.     Dim fso As Object
  3.     Dim ts As Object
  4.     Dim TempFile As String
  5.     Dim TempWB As Workbook
  6.     TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
  7.     rng.Copy
  8.     Set TempWB = Workbooks.Add(1)
  9.     With TempWB.Sheets(1)
  10.         .Cells(1).PasteSpecial Paste:=8
  11.         .Cells(1).PasteSpecial xlPasteValues, , False, False
  12.         .Cells(1).PasteSpecial xlPasteFormats, , False, False
  13.         .Cells(1).Select
  14.         Application.CutCopyMode = False
  15.         On Error Resume Next
  16.         .DrawingObjects.Visible = True
  17.         .DrawingObjects.Delete
  18.         On Error GoTo 0
  19.     End With
  20.     With TempWB.PublishObjects.Add( _
  21.         SourceType:=xlSourceRange, _
  22.         Filename:=TempFile, _
  23.         Sheet:=TempWB.Sheets(1).Name, _
  24.         Source:=TempWB.Sheets(1).UsedRange.Address, _
  25.         HtmlType:=xlHtmlStatic)
  26.         .Publish (True)
  27.     End With
  28.     Set fso = CreateObject("Scripting.FileSystemObject")
  29.     Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
  30.     RangetoHTML = ts.ReadAll
  31.     ts.Close
  32.     RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
  33.     "align=left x:publishsource=")
  34.     TempWB.Close savechanges:=False
  35.     Kill TempFile
  36.     Set ts = Nothing
  37.     Set fso = Nothing
  38.     Set TempWB = Nothing
  39. End Function
复制代码


直接上实战例子:案例里面邮箱均是作者小号,欢迎骚扰


>>>>以附件形式发送工资条

把每个人的工资条导出为图片,添加为附件发送。

模板页纯粹是为了粘贴数据导出图片,没有特殊含义






  1. Sub SendMail()
  2.     Set sht1 = Worksheets("邮件页")
  3.     Set sht2 = Worksheets("模板页")
  4.     sht1.Range("a1:d1").Copy sht2.Range("a1")
  5.     For Each rng In sht1.Range("a2:a" & sht1.Cells(Rows.Count, 1).End(3).Row)
  6.         rng.Resize(1, 4).Copy sht2.Range("a2")
  7.         Set rng2 = sht2.Range("a1:d2")
  8.         sht2.Range("a1:d2").CopyPicture Appearance:=xlScreen, Format:=xlBitmap '把选择范围内容转化为截屏图片信息
  9.         With ActiveSheet.ChartObjects.Add(0, 0, rng2.Width + 1, rng2.Height + 1).Chart '在A1处按图片尺寸稍大建立1个空白图表对象
  10.             .Paste '把刚才截屏的图片信息粘贴上去
  11.             .Export ThisWorkbook.Path & "\" & rng & ".png", "PNG"  '按指定图片路径及名称导出png格式图片……这个对于纯数据工作表来说更好
  12.             .Parent.Delete '删去该临时增加的图表对象
  13.         End With
  14.     Next
  15.     Set myOlApp = CreateObject("Outlook.Application")
  16.     Set objMail = myOlApp.CreateItem(olMailItem)
  17.     For a = 2 To sht1.Cells(Rows.Count, 1).End(3).Row
  18.         Set objMail = myOlApp.CreateItem(olMailItem)
  19.         With objMail
  20.             .To = sht1.Cells(a, 5).Value '//收件人
  21.             .Subject = "工资明细" '//主题
  22.             .Body = "这是您本月的工资明细" '//正文具体内容
  23.             .Attachments.Add ThisWorkbook.Path & "\" & sht1.Cells(a, 1) & ".png" '//添加附件
  24.             .send
  25.         End With
  26.         Set objMail = Nothing
  27.     Next
  28.     MsgBox "发送完成!"
  29. End Sub
复制代码


QQ邮箱发送效果






>>>>以HTML形式发送工资条



  1. Sub SendMail2()
  2.     Set sht1 = Worksheets("邮件页")
  3.     Set sht2 = Worksheets("模板页")
  4.     sht1.Range("a1:d1").Copy sht2.Range("a1")
  5.     For Each rng In sht1.Range("a2:a" & sht1.Cells(Rows.Count, 1).End(3).Row)
  6.         rng.Resize(1, 4).Copy sht2.Range("a2")
  7.         Set myOlApp = CreateObject("Outlook.Application")
  8.         Set objMail = myOlApp.CreateItem(olMailItem)
  9.         With objMail
  10.             .To = Cells(rng.Row, 5).Value '//收件人
  11.             .Subject = "工资明细" '//主题
  12.             .BodyFormat = 2
  13.             .HTMLBody = RangetoHTML(sht2.Range("a1:d2"))
  14.             .display
  15.             .send
  16.         End With
  17.         Set objMail = Nothing
  18.     Next
  19.     MsgBox "发送完成!"
  20. End Sub
  21. Public Function RangetoHTML(rng As Range)
  22.     Dim fso As Object
  23.     Dim ts As Object
  24.     Dim TempFile As String
  25.     Dim TempWB As Workbook
  26.     TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
  27.     rng.Copy
  28.     Set TempWB = Workbooks.Add(1)
  29.     With TempWB.Sheets(1)
  30.         .Cells(1).PasteSpecial Paste:=8
  31.         .Cells(1).PasteSpecial xlPasteValues, , False, False
  32.         .Cells(1).PasteSpecial xlPasteFormats, , False, False
  33.         .Cells(1).Select
  34.         Application.CutCopyMode = False
  35.         On Error Resume Next
  36.         .DrawingObjects.Visible = True
  37.         .DrawingObjects.Delete
  38.         On Error GoTo 0
  39.     End With
  40.     With TempWB.PublishObjects.Add( _
  41.         SourceType:=xlSourceRange, _
  42.         Filename:=TempFile, _
  43.         Sheet:=TempWB.Sheets(1).Name, _
  44.         Source:=TempWB.Sheets(1).UsedRange.Address, _
  45.         HtmlType:=xlHtmlStatic)
  46.         .Publish (True)
  47.     End With
  48.     Set fso = CreateObject("Scripting.FileSystemObject")
  49.     Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
  50.     RangetoHTML = ts.ReadAll
  51.     ts.Close
  52.     RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
  53.     "align=left x:publishsource=")
  54.     TempWB.Close savechanges:=False
  55.     Kill TempFile
  56.     Set ts = Nothing
  57.     Set fso = Nothing
  58.     Set TempWB = Nothing
  59. End Function
复制代码


QQ邮箱发送效果


这两种批量发送邮件的方法基本能满足九成以上人的需求,再复杂的,不再深入研究。



看都看到最后了,如果觉得不错,希望大家分享一下,或者点一下右下角的"在看" 按钮。







=  推荐阅读  =
提取Word数据  | 操作Txt   | VBA学习经验   | 合并拆分  |   字符串函数   |   循环知识 |   封装Dll |   进度条 |   生成二维码   | 联想输入 |  批量打印 |

加入VBA学习交流群,与众多VBA爱好者互动答疑




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:10
帖子:2
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP