文档详情

使用VBA实现EXCEL批量生成图表并发送#特选内容

8**
实名认证
店铺
DOC
105KB
约6页
文档ID:167150198
使用VBA实现EXCEL批量生成图表并发送#特选内容_第1页
1/6

使用EXCEL VBA实现图表批量生成并发送业务需求office word2007的邮件合并功能是财务、文秘类工作经常使用的功能之一,该功能可以生成包含可变内容的批量邮件文档,广泛适用于发送工资条、成绩单、通知书等,这里不再赘述笔者所在单位最近为加强员工考核管理工作力度,提出了一个类似于邮件合并功能,但使用邮件合并功能却不能实现的需求,下面用文字结合图表描述:1.将员工百分制考核结果批量以图表(折线图)反应出来,每一条员工数据均生成一个类似于下图右侧的图表图1)2.使用类似于邮件合并方式实现员工考核图表的批量发送,将生成的图表插入邮件正文分别发送给每位员工图2)解决思路思路一:使用VS.net+Sqlserver(或ACCESS等,下同)开发一个网站,设置好权限,允许员工查看自己的反馈结果思路评价:可行,但达不到设想中的推送效果思路二:使用VS.net+Sqlserver开发一个系统,内置图表模板,图表基于固定区域数据生成;为每位员工复制一份作为报表,将该员工数据填写到固定区域;将每位员工的报表作为附件发送给每位员工思路评价:可行,但开发量大,效果不直观思路三:使用VS.net+Sqlserver开发一个系统,使用VS2008版以上自带控件或第三方控件如dotnetcharting,为每位员工生成一张图片,将该图片插入邮件发送给每位员工。

思路评价:可行,但开发量大思路四:使用excel VBA为每位员工生成一张图片,将该图片插入邮件发送给每位员工这个思路一开始并没有列入考虑范围,主要原因是当时认为在excel中为每位员工生成一个图表是不可能的,即使能生成也没办法脱离excel工作薄,分别和员工对应起来并发送最终采用本思路,是缘于笔者发现VBA可以非常容易地把图表导出为图片思路评价:可行,事实证明,开发量比想象的小很多开发环境准备1.在运行该程序的电脑上安装Office Excel2007或以上版本;2.正确配置OUTLOOK使之能够正常发送邮件;3.打开Excel2007新建工作薄,把测试数据输入到sheet1工作表,把工作薄保存到工作目录(为方便后文描述,这里的目录设为“E:\excel-vba”),在该目录下新建“imgfile”子目录,以存放图片示例数据如下:姓名德能勤绩邮件主题邮件地址附件路径张三012023 16 20 员工考核反馈zhugq-zzu@E:\excel-vba\imgfile\张三01.jpg张四022520 23 23 员工考核反馈zhugq-zzu@E:\excel-vba\imgfile\张四02.jpg张五032416 25 18 员工考核反馈zhugq-zzu@E:\excel-vba\imgfile\张五03.jpg张三022520 23 23 员工考核反馈zhugq-zzu@E:\excel-vba\imgfile\张三02.jpg张四032520 23 23 员工考核反馈zhugq-zzu@E:\excel-vba\imgfile\张四03.jpg平均值2319 22 20    注意:附件路径是个公式:=concatenate(“E:\excel-vba\imgfile\”,A1,”.jpg”) 含义是图片以员工姓名命名,这意味着员工姓名不可重复。

4.完成宏安全设置,如图所示: (图3)实现过程这个业务需求实现包含两个难点,一是为每位员工生成对应的图片;二是批量发送带图片的邮件基于这两点,笔者在excel工作薄中设置了两个按钮,编写了两段代码,分别对应上述两个问题事实上,这两段代码完全可以整合到一起,这里为了方便理解,还是分开介绍笔者采取代码中加入注释的方式帮助大家理解代码含义第一步,在sheet1中加入两个按钮,分别命名为“批量生成图表”和“批量发送邮件”第二步,分别为两个按钮指定如下宏代码:Sub 批量生成图表() Dim myChart, Ra As ChartObject Dim myFileName As String Dim i, j As Integer With Sheet1 先虚加一个图表对象,解决下文循环开头删除空集问题 Set myChart = .ChartObjects.Add(520, 40, 400, 250) 取数据总行数,第一行为标题,最后一行为平均值 j = Sheet1.[b65536].End(xlUp).Row 从第2行开始循环,i代表第几行 For i = 2 To j - 1 清除原有图表 .ChartObjects.Delete .指定图表位置和大小 Set myChart = .ChartObjects.Add(520, 40, 400, 250) With myChart.Chart 第一个数据系列,员工各项考核值 .ChartType = xlLineMarkers .SeriesCollection.NewSeries .SeriesCollection(1).XValues = Sheet1.Range("b1:e1") .SeriesCollection(1).Values = Sheet1.Range("b" & i & ":e" & i) .SeriesCollection(1).Name = Sheet1.Range("a" & i) 第二个数据序列,各项考核平均值,位于sheet最后一行 .SeriesCollection.NewSeries .SeriesCollection(2).XValues = Sheet1.Range("b1:e1") .SeriesCollection(2).Values = Sheet1.Range("b" & j & ":e" & j) .SeriesCollection(2).Name = Sheet1.Range("a" & j) .指定图表生成的位置 .Location Where:=xlLocationAsObject, Name:="Sheet1" 显示标签值 .ApplyDataLabels ShowValue:=True 显示图表标题 .HasTitle = True .ChartTitle.Text = "员工考核反馈" .设置图表标题的字体 With .ChartTitle.Font .Size = 20 .ColorIndex = 3 .Name = "华文新魏" End With .设置图表区域的颜色 With .ChartArea.Interior .ColorIndex = 8 .PatternColorIndex = 1 .Pattern = xlSolid End With .设置绘图区域的颜色 With .PlotArea.Interior .ColorIndex = 35 .PatternColorIndex = 1 .Pattern = xlSolid End With .设置是否显示Y轴刻度 myChart.Chart.HasAxis(xlValue, xlPrimary) = True Set myChart = Sheet1.ChartObjects(1).Chart 使用第一列值命名图像,请勿重复 myFileName = Sheet1.Cells(i, 1) & ".jpg" On Error Resume Next .删除原有同名文件 Kill ThisWorkbook.Path & "\imgfile\" & myFileName .将图表转换为图像并输出到指定目录,使之与H列的值相对应 myChart.Export Filename:=ThisWorkbook.Path & "\imgfile\" & myFileName, Filtername:="JPG" End With .清空对象 Set myChart = Nothing Next i End WithEnd SubSub 批量发送邮件()要能正确发送并需要对Microseft Outlook进行有效配置On Error Resume NextDim rowCount, endRowNo要正常运行下面这句,要将工具/引用中的Microseft Outlook 12.0 Object Library选上Dim objOutlook As New Outlook.ApplicationDim objMail As MailItem取得当前工作表与Cells(1,1)相连的数据区行数endRowNo = Cells(1, 1).CurrentRegion.Rows.Count创建objOutlook为Outlook应用程序对象Set objOutlook = New Outlook.Application开始循环发送电子邮件For rowCount = 2 To endRowNo - 1创建objMail为一个邮件对象Set objMail = objOutlook.CreateItem(olM。

下载提示
相似文档
正为您匹配相似的精品文档