Excel 2010 VBA 入门 102 利用VBA批量发送邮件
目录
示例
代码
CDO组件
CDO. Message. Configuration对象
前期绑定与后期绑定
New关键字创建对象
添加邮件的附件
示例
如图所示,该表为某公司员工工资单。现需要将该表中每个人的工资信息根据Q列的邮箱地址发送到每个人的邮箱中。
员工编号 | 姓名 | 部门 | 应发合计 | 基本工资 | 加班工资 | 补贴 | 奖金 | 病事假扣款 | 养老保险 | 医疗保险 | 失业保险 | 公积金 | 税前小计 | 个人所得税 | 工资实发 | 邮箱地址 |
0042 | 齐光 | 市场部 | 5967.5 | 5967.5 | 0 | 0 | 0 | 0 | 716.1 | 119.4 | 59.7 | 417.7 | 4654.6 | 34.64 | 4619.96 | 0042@exceltip.net |
0374 | 高波 | 总经办 | 6820 | 6820 | 0 | 0 | 0 | 0 | 818.4 | 136.4 | 68.2 | 477.4 | 5319.6 | 76.96 | 5242.64 | 0374@exceltip.net |
0018 | 骈永富 | 管理部 | 3135 | 3135 | 0 | 0 | 0 | 0 | 376.2 | 62.7 | 31.4 | 219.5 | 2445.2 | 0 | 2445.2 | 0018@exceltip.net |
0023 | 陈亚菁 | 管理部 | 3806 | 3806 | 0 | 0 | 0 | 0 | 456.7 | 76.1 | 38.1 | 266.4 | 2968.7 | 0 | 2968.7 | 0023@exceltip.net |
0371 | 郭建 | 销售部 | 1728.1 | 1728.1 | 0 | 0 | 0 | 0 | 207.4 | 34.6 | 17.3 | 121 | 1347.8 | 0 | 1347.8 | 0371@exceltip.net |
0327 | 郦锡文 | 销售部 | 2103.2 | 2103.2 | 0 | 0 | 0 | 0 | 252.4 | 42.1 | 21 | 147.2 | 1640.5 | 0 | 1640.5 | 0327@exceltip.net |
0391 | 赵秀池 | 销售部 | 2695 | 2695 | 0 | 0 | 0 | 0 | 323.4 | 53.9 | 27 | 188.7 | 2102 | 0 | 2102 | 0391@exceltip.net |
0016 | 袁志刚 | 财务部 | 3875.3 | 3875.3 | 0 | 0 | 0 | 0 | 465 | 77.5 | 38.8 | 271.3 | 3022.7 | 0 | 3022.7 | 0016@exceltip.net |
0399 | 罗卉宁 | 销售部 | 1980 | 1980 | 0 | 0 | 0 | 0 | 237.6 | 39.6 | 19.8 | 138.6 | 1544.4 | 0 | 1544.4 | 0399@exceltip.net |
代码
使用CDO组件创建一个Message对象实现邮件的发送。
Option ExplicitSub 批量发送邮件()Dim objCDO As Object 'CDO对象Dim strBody As String '邮件内容变量Dim shtData As WorksheetDim arrDataDim rowData As LongDim colData As Long'常量Const sSchema = "http://schemas.microsoft.com/cdo/configuration"'发送方式Const cdoSendUsingPort = 2'定义原始数据工作表Set shtData = Sheets("sheet1")'获取原始数据数组arrData = shtData.Range("A1").CurrentRegion.Value'创建CDO对象Set objCDO = CreateObject("CDO.Message")'操作CDO对象With objCDO.Configuration.Fields'发送方式.Item(sSchema & "sendusing") = cdoSendUsingPort'发送邮件服务器.Item(sSchema & "smtpserver") = "smtp.163.com"'发送超时.Item(sSchema & "smtpconnectiontimeout") = 10'验证方式.Item(sSchema & "smtpauthenticate") = 1'邮件账户用户名.Item(sSchema & "sendusername") = "excel_test@163.com"'邮件账户密码.Item(sSchema & "sendpassword") = "excel_test123456"'更新设置.UpdateEnd With'遍历所有的原始数据For rowData = 2 To UBound(arrData, 1)strBody = ""For colData = 1 To UBound(arrData, 2) - 1strBody = strBody & vbTab & arrData(1, colData) & ":" & arrData(rowData, colData) & vbCrLfNext colDataWith objCDO'收件人.to = arrData(rowData, 17)'发件人.from = "exceltip_text@163.com"'主题.Subject = "工资单"'纯文本邮件内容.textbody = strBody'发送.sendEnd WithNext rowDataSet objCDO = Nothing
End Sub
CDO组件
CDO组件的全称是Microsoft Collaboration Data Objects,该组件位于Windows安装目录下的System32下,名称为Cdosys. dll。CDO组件可以用来发送邮件,而无须使用任何本机
的邮件客户端。因而,相对于Outlook来说,CDO组件具有更高的移植性。
CDO.Message对象
使用CDO组件发送邮件需要创建一个CDO下的Message对象,然后利用该对象完成设置邮箱、邮件、发送等一系列操作。CDO. Message对象有一些非常常用的属性,见表。
CDO. Message对象的常用属性
属 性 |
类 型 |
说 明 |
To |
文本 |
收件人邮件地址。当有多个收件人时使用逗号(,)隔开 |
BCC |
文本 |
抄送收件人邮件地址。当有多个抄送收件人时使用逗号(,)隔开 |
CC |
文本 |
密件抄送收件人邮件地址。当有多个收件人时使用逗号(,)隔开 |
From |
文本 |
发件人的邮件地址。当需要使用别名进行发送时,则将邮件地址写入括号内,如: John(excel@excel.com)。当邮件送达后,在收件人的邮件中会显示发件人为John |
Subject |
文本 |
邮件的主题 |
TextBody |
文本 |
邮件的内容(文本形式,不具有任何格式) |
HTMLBody |
文本 |
邮件的内容(HTML格式,可以设置格式) |
Configuration |
对象 |
configurarion对象,用于邮箱的各种设置 |
CDO. Message. Configuration对象
Configuration对象可以用来配置邮件发送的各种设置,如服务器等。在Configuration中的设置是通过其下的各个字段(Field)完成的,设置某个字段采用以下表达式进行:
Configuration.Fields.Item(fieldfullname)=fieldvalue
参数fieldfullname为完整的字段名,
参数fieldvalue为字段设置的值。
Configuration可使用的字段名称较长,但所有的字段均以固定的内容开头,这个固定的内荦翠为“http://schemas. microsoft. com/cdo/configuration/”。若将该固定的内容赋值在常数schema,则字段名称可以表示为
schema & fieldname
表3 CDO. Message.Configuration对象的常用字段
字段(Fieldname) |
类 型 |
说 明 |
smtpserver |
文本 |
邮件发送服务器(SMTP)的地址 |
sendusing |
整数 |
SMTP的发送方式,取值如下。 1:使用邮件服务器的目录发送; 2:使用网络端口进行发送(常用的免费邮箱选择该设置) |
smtpserverpickupdirectory |
文本 |
当sendusing设置为1时,本字段有效,表示邮件服务器目录 |
smtpserverport |
文本 |
当sendusing设置为2时,本字段有效,表示邮件服务器网络端口。(常 用的免费邮箱选择该设置) |
smtpconnectiontimeout |
文本 |
SMTP服务器连接超时,默认为30秒 |
smtpautheuticate |
文本 |
SMTP的验证方式,可以为: 0:匿名方式 1:基本方式C一般选用该设置). 2:TLM方式 |
sendusername |
对象 |
发送邮件的账号 |
sendpassword |
对象 |
发送邮件账号的密码 |
当设置完以上信息之后,即可以使用Message对象的Send方法进行邮件的发送。一般地,发送多个邮件总是使用相同的账号发送。因而对于Configuration对象的设置是一次性的。之后可以使用循环,不断改变邮件的主题和内容,然后使用Send方法则可以发送多封不同内容的邮件,从而实现邮件的批量发送。
前期绑定与后期绑定
本例中使用了CreateObject函数创建CDO. Message对象。而实际上,创建这两个对象的方法是非常简单的。只需要在VBA工程中添加对该对象类库的引用,即可使用Dim语句创建对
象。以CDO对象为例,其步骤如图所示。
以上两种方式中,前者(CreateObject)称为后期绑定,而后者(添加引用)称为前期绑定。使用前期绑定后,在实际使用对象时,会出现成员提示,而后期绑定则没有。前期绑定的程序运行速度要略快于后期绑定。但是,前期绑定有一个致命的弱点:兼容性差。
一般而言,Windows系统总是安装在C盘中,大部分VBA工程所引用的运行库都在该盘符中Windows目录下的System32下。当使用前期绑定之后,VBA工程记录下了该引用文件的路径。当打开Excel时,VBA工程会使用该路径寻找文件。若所添加的引用在默认的C盘中,但对在Windows系统中安装在E盘下的计算机而言,就无法找到该引用,从而造成程序无法运行。
同样,64位系统的文件目录与32位系统的文件目录也是不相同的,当程序运行在这两种系统中时,可能会由于前期绑定而造成程序的无法运行。
而后期绑定则没有该问题发生。因而采用后期绑定可以使程序更加通用。对初学者来说,后期绑定的方式由于无法看见成员提示,可能会给编写代码造成一定困扰。一般地,在编写程
序时,可以使用前期绑定的方式编写和测试程序代码。待发布程序前,则将绑定方式改为后期绑定即可。
New关键字创建对象
当使用前期绑定且需要创建对象时,则使用含有New关键字的Dim语句对对象进行声明。如创建一个Outlook程序,则使用以下语句:
Dim oCDO As New CDO.Message
或者可以带有New关键字的Set语句创建对象:
Dim oCDO As CDO.Message
Set oCDO=New CDO.Message
许多程序员初学者对于何时使用New关键字会有一点困惑。事实上,所有的对象变量在其使用Dim语句声明之后,仅仅是描述了一个变量及其类型。而就该变量本身而言没有任何意义,
直到使用Set语句指向某一个实际的对象。这个实际的对象可以是通过某个方法或函数返回的对象,也可以是使用New关键字新建的对象。
例如,当使用Dim语句声明一个类型为Workbook的对象变量Wbk。开发者无法执行该Wbk对象的任何方法,也无法访问其任何属性。因为该Wbk并不代表任何一个工作簿,VBA也并不
知道该变量指向哪个工作簿。只有当使用Set语句指定该Wbk对象变量为某个实际打开的工作簿,或是使用Add方法新建或用Open方法打开的工作簿,才能够对其进行操作。
事实上,New关键字是通过新建一个对象的方法把一个抽象的概念具体化、实例化,让变量有所指,这样才能够进行该变量的各种操作。如,若存在一个名为“人类”的对象类型,使用Dim语句声明一个类型为“人类”的变量person。在真正给该person变量赋值前,该person变量实际上谁也不是,仅仅是一个无意义的代号而己。而当该person变量被赋值一个叫“amulee”的人之后,就可以对该变量进行操作,对该变量的所有操作都将反映到那个叫做“amulee”的人身上。当然作为开发者,可以凭空创建一个人,此时就必须使用New关键字。
并非所有的对象都可以使用New关键字进行创建。一般而言,只有顶级对象(即不依赖于任何对象而存在的对象)才能够使用New关键字创建。如:可以使用New关键字创建一个Outlook程序,因为该程序是不依赖于当前程序或者其他程序而存在并运行的。但是无法使用New关键字创建一个工作簿Workbook,因为工作簿是依赖于Excel程序的,而在该程序的子对
象Workbooks已经提供了Add方法进行创建。
此处所谓的不依赖于任何对象而存在只是一个相对的概念,事实上,Office所有的程序都是依赖于操作系统的。但并不需要担心此事,因为操作早已在后台运行。
添加邮件的附件
当使用CDO对象发送邮件时,可以使用AddAttachment方法进行添加附件,其语法为
CDO.AddAttachment filepath
其中,参数filepath为文件的完整路径,包括路径、文件名和扩展名。
因而,本例也可以将工资单按姓名命名的工作簿进行拆分,然后将该工作簿作为附件发送至各个员工。
Excel 2010 VBA 入门 102 利用VBA批量发送邮件相关推荐
- Excel 2010 VBA 入门 103 利用VBA批量插入图片
目录 示例 代码: Shapes.Shape和 ShapeRange Shapes对象插入图形的方法 Excel的坐标 图形大小的调整 获取图片的原始大小 将图片按比例缩放至单元格 图片批量插入的步骤 ...
- Excel 2010 VBA 入门 104 利用VBA生成图表
目录 示例 代码 ChartObjects集合和ChartObject对象 数据系列(Series)对象 添加图表的其他方法 1.通过添加Chart对象添加图表 2.通过Shapes集合的AddCha ...
- Excel 2010 VBA 入门 044 用VBA进行四舍五入
目录 示例 实现代码 VBA的Round函数 VBA的Round函数与工作表Round函数的区别 在Office软件中使用自定义函数替代VBA的Round函数 示例 在实际工作中,经常需要对数据进行四 ...
- 个人永久性免费-Excel催化剂功能第87波-将批量发送邮件做到极致化,需借力Outlook...
在过往的功能中,已经实现过批量发送邮件的功能,但收到的反馈是部分企业邮箱不能用,原因是无解的,因为程序员能找到的公开的类库只能实现一些通用性的场景,太复杂的企业环境可能会失灵. 近期认真来学习Outl ...
- Excel 2010 VBA 入门 129 利用窗体向工作表中录入数据
目录 题 码 窗体控件与工作表的交互 窗体的事件 窗体中ControIs集合访问控件 控件的排列 使用控件数组进行赋值 题 如图所示,该表为某公司订单记录表,其中所有的列都是必填的,订单编号为自动生成 ...
- Excel 2010 VBA 入门 064 按照关键字批量创建超链接
目录 示例 实现代码 Hyperlink对象 创建超链接 删除超链接及访问超链接 创建超链接打开指定的宏代码 示例 如图所示,该表为某公司资产负债表以及关于报表的说明.为了方便阅读,现希望能够用VBA ...
- Excel 2010 VBA 入门 130 利用窗体创建实时筛选浮动工具栏
目录 题 码 DefauIt和CanceI按钮 提高单元格隐藏的速度 自制浮动工具栏 动态显示与隐藏窗体 题 如图所示,该表为某单位员工档案.现希望制作一个包含有文本框的浮动工具栏,当在文本框中输入字 ...
- Excel 2010 VBA 入门 135 利用窗体制作登录界面
题 使用窗体制作登录界面,实现当打开Excel时,隐藏工作簿,当登录完成后显示工作簿. 码 登录机制是将用户输入的用户名和密码与正确的用户名和密码进行比较,若相等,则表示登录成功,反之登录失败.本例的 ...
- Excel 2010 VBA 入门 132 利用复合框制作工作簿/表导航
目录 题 码 复合框(ComboBox)控件 利用复合框制作二级下拉列表 题 使用复合框制作一个工作表导航,以便实现工作簿及工作表的切换. 码 创建一个窗体,使用两个复合框制作二级下拉列表,其中一个作 ...
最新文章
- 电源适配器和充电器的区别和关系
- oracle datafile损坏,史上最全Oracle文件损坏处理办法(附实验步骤)
- (五)使用模型单元测试进行MLOps持续交付
- 1、Fiddler的基本介绍
- linux Shell入门
- Python算法教程:找出图的连通分量
- Web服务稳定性测试 负载测试 可靠性测试 方案 测试报告
- 打算考PMP,需要准备什么材料?
- 《Python与硬件项目案例》— 基于Python与指纹模块AS608的指纹识别签到考勤系统(上篇)(期末大作业、课程设计、毕业设计、结课项目)
- conda 小tips
- Windows PE(WinPE)
- C/C++和Lua混合编程
- 全球消费精品消博会亮相!科蒂、资生堂、欧莱雅、奔富、保乐力加、红牛、雀巢、拜耳、澳佳宝都来了 | 美通社头条...
- 如何使用阿里云搭建自己的云主机(超详细)
- 数据标注是什么,如何进行数据标注?
- Python: queue.Queue
- Java中使用es条件构造器BoolQueryBuilder
- 【STM32CubeIDE】将变量定义到指定地址
- <br>和<hr>标签
- c++实现快速气象格网数据成图: 风力图, 卫星云图,雷达反射图, 雨量图,温度图