Excel VBA开发自动发送邮件

一、.设置Outlook邮箱帐(略不是本文章的重点)

二、.设置Outlook信任中心如下步骤

        若没有做如下操作设置,则Excel VBA调用Outlook自动发送邮件时提示如下

2.1 Outlook->工具->信任中心

2.2 编程访问->选中”从不向我发出可疑活动警告(不推荐)“,注意:建议使用Excel VBA自动发送邮件启用该功能

三、启用Excel 宏

 

3.1 启用宏操作如下:

打开Excel点击Office按钮->Excel选项,如下图

选择”Excel 选项“窗体中左边的”信任中心“->信任中心设置,如下图:

在”信任中心“窗体中->宏设置,选如下图二个选项

然后关闭Excel重新打开就可以启用宏和VBA编程开发了。

四、Excel VBA开发

 

4.1 创建模类:clsModel,写如下代码:

Public Declare Function SetTimer Lib "user32" _(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long
Public Declare Function KillTimer Lib "user32" _(ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub AutoMail()GB_EMPSALARY.Show
End Sub'Function WinProcA(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal SysTime As Long) As Long
'    KillTimer 0, idEvent
'    DoEvents
'    Sleep 100
'    '使用Alt+S发送邮件,这是本文的关键之处,免安全提示自动发送邮件全靠它了
'    Application.SendKeys "%s"
'End Function' 发送单个邮件的子程序
Sub SendMail(ByVal to_who As String, ByVal SubJect As String, ByVal body As String, ByVal cell As String)Dim objOL As ObjectDim itmNewMail As Object'引用Microsoft Outlook 对象Set objOL = CreateObject("Outlook.Application")Set itmNewMail = objOL.CreateItem(olMailItem)On Error GoTo Err_HandleWith itmNewMail.SubJect = SubJect  '主旨.htmlBody = body    '正文本文'.body = body   '正文本文.To = to_who  '收件者'.Attachments.Add attachement '附件,如果你不需要发送附件,可以把这一句删掉即可,Excel中的第四列留空,不能删哦.Display  '启动Outlook发送窗口'SetTimer 0, 0, 0, AddressOf WinProcA.Send'Application.Wait (Now + TimeValue("0:00:03"))'Application.SendKeys "%s"End WithWorksheets("Sheet1").Range(cell).Value = "Y"Set objOL = NothingSet itmNewMail = Nothing
Err_Handle:Set objOL = NothingSet itmNewMail = NothingOn Error Resume Next
End Sub

4.2 创建自动发送邮件界面,方便用户可以看到操作Excel表格哪一行。

主要代码如下:

 

Private Sub butSend_Click()On Error Resume NextDim i As IntegerDim EmpName, eMail, mailSubJect, mailBody, cell, sendFlag As Stringi = CInt(txtStartRow.Text)If (i < 3) Theni = 3End If'邮箱主题mailSubJect = "某某公司" & Worksheets("Sheet1").Range("C1").Value & "工资条"'员工姓名EmpName = Worksheets("Sheet1").Range("E" & i).Value'员工姓名为空退出停止发送邮件Do While EmpName <> ""'是否发送邮件标志位sendFlag = Worksheets("Sheet1").Range("A" & i).Value'邮箱地址eMail = Worksheets("Sheet1").Range("AH" & i).Value'邮件是否发关,邮箱地址是否为空If (sendFlag <> "Y" And eMail <> "") Then'邮箱内容mailBody = SalaryContext(EmpName, i)'是否发送标志单元格cell = "A" & iSendMail eMail, mailSubJect, mailBody, cellEnd Ifi = i + 1'获得下一行的员工姓名EmpName = Worksheets("Sheet1").Range("E" & i).ValueDoEventsSleep 300txtSend.Text = iLoop
End Sub
'工资条表格明细
Function SalaryContext(ByVal EmpName As String, ByVal Row As Integer) As StringDim htmlBody, tableHeader, tableBody As StringhtmlBody = "<html>" & _"<head>" & _"<meta http-equiv=""Content-Type"" contentType=""application/vnd.ms-excel;charset=gb2312"">" & _"   <STYLE type=text/css>" & _"   .sub_title{" & _"      FONT-WEIGHT: bold;" & _"      FONT-SIZE: 4mm;" & _"      VERTICAL-ALIGN: middle;" & _"      TEXT-ALIGN: center" & _"      background-color: #ffff66//" & _"      }"htmlBody = htmlBody & "   .context {" & _"      font-size: 12px;" & _"      BORDER-TOP-WIDTH: 0.6mm;" & _"      PADDING-RIGHT: 1mm;" & _"      PADDING-LEFT: 1mm;" & _"      BORDER-LEFT-WIDTH: 0.6mm;" & _"      BORDER-BOTTOM-WIDTH: 0.6mm;" & _"      PADDING-BOTTOM: 0mm;" & _"      PADDING-TOP: 0mm;" & _"      BORDER-COLLAPSE: collapse;" & _"      BORDER-RIGHT-WIDTH: 0.6mm" & _"      }"htmlBody = htmlBody & "   .context td{" & _"      border:1px solid #009900;" & _"      }" & _"   .page {" & _"      page-break-after: always;" & _"      }" & _"  </STYLE>" & _"</head><body>Dear " & EmpName & Chr(13)htmlBody = htmlBody & "<table class=""context"" borderColor=""#669933"" border=1>"'MsgBox htmlBody'表头tableHeader = "<tr bgcolor=""#FFE66F""><td align=""center"">固定工<br>资基准</td>" & _"<td align=""center"">浮动绩<br>效基准</td><td align=""center"">应勤<br>时数</td>" & _"<td align=""right"">实际<br>出勤</td><td align=""center"">节<br>假日</td><td align=""center"">考核<br>系数</td>" & _"<td align=""center"">固定<br>工资</td><td align=""center"">浮动<br>绩效</td><td align=""center"">外宿<br>补贴</td>" & _"<td align=""right"">伙食&补贴</td><td align=""center"">奖金</td><td align=""center"">提成</td>" & _"<td align=""right"">补贴</td><td align=""center"">补发</td><td align=""center"">其他<br>补贴</td>" & _"<td align=""right"">应发<br>合计</td><td align=""center"">迟到</td><td align=""center"">伙食</td>" & _"<td align=""right"">社保</td><td align=""center"">公<br>积金</td><td align=""center"">房租</td>" & _"<td align=""right"">水电</td><td align=""center"">个税</td><td align=""center"">话费</td>" & _"<td align=""right"">代扣学费</td><td align=""center"">其他</td><td align=""center"">代扣<br>合计</td>" & _"<td align=""right"">实发工资</td></tr>"'MsgBox Worksheets("Sheet1").Range("F" & i).Value'表格内容tableBody = "<tr>" & _"<td>" & Worksheets("Sheet1").Range("F" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("G" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("H" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("I" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("J" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("K" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("L" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("M" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("N" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("O" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("P" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("Q" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("R" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("S" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("T" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("U" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("V" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("W" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("X" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("Y" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("Z" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("AA" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("AB" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("AC" & Row).Value & "</td>"tableBody = tableBody & "<td>" & Worksheets("Sheet1").Range("AD" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("AE" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("AF" & Row).Value & "</td>" & _"<td>" & Worksheets("Sheet1").Range("AG" & Row).Value & "</td>" & _"</tr>"'MsgBox tableBodyhtmlBody = htmlBody & tableHeader & tableBody & "</table></body></html>"SalaryContext = htmlBody
End Function

Excel表格中的内容如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39151.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Excel和OutLook实现自动发送邮件

参考我的资源: https://download.csdn.net/download/paul50060049/11805973 问题的产生 我们在平时工作中可能会遇到要批量发送邮件的工作&#xff0c;例如财务部根据每个人的工资情况发放工资条到个人的邮箱&#xff0c;因为邮件因人而异&#xff0c;所以需要完成大量而细致…

模拟人生显示无法连接服务器,模拟人生总是显示无法连接网络

模拟人生中不少玩家反馈都会遇到模拟人生总是显示无法连接网络的问题&#xff0c;那么怎么解决这个问题呢&#xff0c;这边ourplay小编为大家分享几个解决方案。 模拟人生游戏简介 《模拟人生移动版》The Sims Mobile)是EA推出的系列作品。玩家可以操作自己的人物完成工作、与他…

编辑合成图片怎么做?手把手教你合成

小伙伴们平时喜欢拍完照片后&#xff0c;将这些照片分享在社交平台上吗&#xff1f;有时我们拍摄的照片会有一些瑕疵&#xff0c;我们可以通过对这些照片进行编辑、合成&#xff0c;以此来填补瑕疵&#xff0c;提高照片的观感。那你们知道如何编辑图片并合成吗&#xff1f;还不…

NFT批量图片合成制作

这是拼接教学&#xff0c;如有兴趣&#xff0c;请扫描底部二维码加群交流 1 按照目前最火的头像来说&#xff0c;一般分为算法生成和拼接图片两种。 2 算法生成相对于普通人来说比较难&#xff0c;拼接图像无疑是一种更好的选择 3 如何批量制作NFT图片呢。 ① 准备组合元素…

chatgpt赋能python:Python图片合成:快速合成图片的最佳选择

Python图片合成&#xff1a;快速合成图片的最佳选择 图片合成是数字图像处理领域的一项关键技术。在很多场景下&#xff0c;我们需要把多个图片合成成一个整体&#xff0c;以达到更好的效果。Python是一种强大而灵活的编程语言&#xff0c;因此也成为了许多开发者进行图片合成…

全民AI计划:通过langchain给LLM接上落地的大腿

langchain是一个开源项目 github.com/hwchase17/l… 。这个项目在GitHub上已经有45.5K个Star了。此项目由一位叫hwchase17的国外小哥在2022年底发布。 我有理由相信&#xff0c;这个项目是为了对接大语言模型才搞的。 一、企业困境: 如何应用大语言模型 大语言模型(Large La…

币圈“土狗”万倍狂欢:一面暴富 一面归零

在币圈&#xff0c;有一类奇葩的虚拟代币项目颇受追捧&#xff0c;人们通常叫它“土狗”。这些项目一般团队匿名&#xff0c;没啥技术含量&#xff0c;强调草根文化&#xff0c;甚至会明说“代币没有价值”。它们身上具有浓厚的meme基因&#xff0c;项目logo有时候就是个表情包…

巴比特 | 元宇宙每日必读:欧洲议会投票通过《人工智能法案》,基础模型供应商要声明训练AI的数据的版权,违规行为或将面临高额罚款...

摘要&#xff1a;据澎湃新闻报道&#xff0c;当地时间6月14日&#xff0c;欧洲议会投票通过了《人工智能法案&#xff08;AI Act&#xff09;》&#xff0c;禁止实时面部识别&#xff0c;并对ChatGPT等生成式人工智能工具提出了新的透明度要求。例如&#xff0c;基础模型的供应…

HTTP文件断点续传原理解析(源码)

生活中&#xff0c;有许多事物&#xff0c;在没有被揭开面纱之前&#xff0c;我们往往会觉得很神秘很高深&#xff0c;认为它一定很难&#xff0c;进而望而却步&#xff0c;失去了解它的机会。然而&#xff0c;很多事&#xff0c;只要我们自己能沉下心来&#xff0c;细细研究&a…

Android断点续传

最近看了一些大佬去面试的时候都提到了断点续传&#xff0c;所以自己也写一个记录下来&#xff0c;断点续传的原理就是通过数据库实时的去保存当前下载的长度&#xff0c;然后下次再次下载的时候通过setRequestProperty告诉服务端我需要这个文件从什么地方开始下载&#xff0c;…

Android笔记--断点续传

断点续传就是在下载资源过程中&#xff0c;网络出现中断后&#xff0c;下一次下载的时候能够接着上一次下载的地方继续下载&#xff0c;以达到节省流量及时间的效果。在Http1.1协议中默认支持获取文件的部分内容&#xff0c;这其中主要是通过头部的两个参数:Range和Content Ran…

Linux断点续传

Linux断点续传 之前使用cp命令拷数据很慢&#xff0c;中途有一次服务器突然关机导致数据拷盘中断&#xff0c;后台发现了rsync命令后速度&#xff0c;工作效率大大提升了。rsync支持断点续传 断点续传测试&#xff1a; rsync -avzP --progress --rshssh /nfs1/public1 root1…

Android 多线程下载以及断点续传

多线程下载 在日常开发中&#xff0c;我们不可避免的会接到类似这样的需求&#xff0c;下载一个比较大的素材文件或者安装包文件&#xff0c;以此实现APP的自动更新&#xff0c;APP内的素材替换等。由于一般此类文件都比较大&#xff0c;一般会在50M以上&#xff0c;如果我们不…

断点续传的实现

文章目录 从上次断开位置继续下载实现原理&#xff08;客户端&#xff09;&#xff1a;HTTP实现&#xff08;流程&#xff09;&#xff1a;图1&#xff1a; 客户端 Range头部信息图2&#xff1a;服务端Content-Range信息 客户端与服务端的请求与响应图解&#xff1a;获取文件 E…

断点续传的原理

断点续传是大型文件数据传输的核心。本文将以多线程技术和Socket技术为依托&#xff0c;介绍大型文件断点续传的实现方法。  基本实现思想  多线程断点续传实现的基本思想就是在发送端&#xff08;也称客户端&#xff09;将要传输的文件分割为大小相当的多块&#xff0c;用…

wget 断点续传

wget是Linux系统中的一个下载工具&#xff0c;最近因为要下载一个比较大的数据集&#xff0c;直接使用浏览器下载每次断开后都会从头开始下载&#xff0c;而wget支持的断点续传功能则可以在已经下载的部分数据的基础上继续下载剩余数据。 &#xff08;1&#xff09;wget安装 …

如何实现文件断点续传功能

本文章首发于公众号攻城狮客栈&#xff0c;有需要的朋友可文末扫描二维码。 相信大家都使用过迅雷、电驴、百度云网盘等一类的工具&#xff0c;所有这些支持上传或下载的工具都有一个功能&#xff0c;那就是断点续传&#xff0c;也就是在你网络不佳传输断开时&#xff0c;传输会…

python 断点续传

python 断点续传 1.前序2.技术原理2.1 Content-Range2.2 Range 3. 代码实现 1.前序 当下载突然断开后&#xff0c;断点续传就需要了&#xff0c;继续前面下载的内容下载。解决了不需要重复下载 2.技术原理 HTTP/1.1 开始支持断点续传&#xff0c;一般断点下载会用到 Range 和…

web前端Tips:断点续传如何实现?

在Web前端中实现断点续传功能的一种常见方式是使用HTTP Range请求和文件分片上传。 以下是一个简单的断点续传实现的步骤&#xff1a; 前端将要上传的文件分成多个固定大小的片段&#xff08;chunk&#xff09;&#xff0c;例如每个片段的大小为1MB。当用户选择上传文件时&am…

前段实现文件的断点续传

早就听说过断点续传这种东西&#xff0c;前端也可以实现一下 断点续传在前端的实现主要依赖着HTML5的新特性&#xff0c;所以一般来说在老旧浏览器上支持度是不高的 本文通过断点续传的简单例子&#xff08;前端文件提交后端PHP文件接收&#xff09;&#xff0c;理解其大致的实…