告别996之最实用VBA办公自动化代码大全详解
简介
本人日常办公中使用VBA实现办公自动化已经有较长时间,积累了一定的经验,在此总结分享出来,希望对大家有所启发。
Excel的录制宏代码可以解决大部分的办公自动化需求,但是依然有很多录制下来的代码使用起来不是很方便,如果对某些片段进行修改,往往会隐藏各种各样的bug,因此需要对常见的语句进行学习和了解,后面对其进行修改和优化才能保证代码的稳定性。
本文尽量分享的是一些自动化办公中最常用的功能代码的使用方法,比如说打开文件、筛选区域,判断区域行数,动态选择区域、发送邮件等,以下为文章主要内容,后续会完善更新,还请多多收藏关注。
目录
- 自动化的起点之打开文件
- 使用 AutoFilter 对指定区域筛选
- 判断某区域第一行或最后一行的行号
- 使用 AutoFill 填充指定区域
- 窗口的激活、关闭以及工作表的选择
- 日期设置与Offset实现偏移
- 发送邮件这件事
打开文件
首先获取VBA代码执行文件的相对路径(一般是保存了宏代码的xlsm文件)
Path = ThisWorkbook.Path
打开文件
Workbooks.Open ("" & Path & "\" & "我的工作簿.xlsx")
该方法实际有两个参数:
FileName String 类型,必需。要打开的工作簿的文件名。
UpdateLinks Variant 类型,可选。指定文件中链接的更新方式。如果省略本参数,则提示用户选择链接的更新方式。否则,该参数的取值应为下表中的某个值。
UpdateLinks值含义:
0 不更新任何引用。
1 更新外部引用,但不更新远程引用。
2 更新远程引用,但不更新外部引用。
3 同时更新远程引用和外部引用。
但是有时候我们希望能打开模糊匹配的文件,可以借助通配符*,像下面这样。
Workbooks.Open ("" & Path & "\" & Dir("" & Path & "\" & "我的*.xls"))
有时候我们打开一个Excel文件 ,提示“此工作簿包含到一个或多个可能不安全的外部数据源的链接……”,问你是否更新,这个弹窗会阻断我们的VBA进程,我们可以在打开文件的时候设定不更新
Dim wb As Workbook
'UpdateLinks:=0 不更新链接
Set wb = Workbooks.Open(Filename:="" & Path & "\" & Dir("" & Path & "\" & "我的*.xls"), UpdateLinks:=0)
对指定区域进行筛选
很多时候,我们要处理的数据需要先进行一个筛选,创建一个筛选的代码长这样:
ActiveSheet.Range("$A$1:$W$100" ).AutoFilter Field:=1, Criteria1:= _">=10" Operator:=xlAnd, Criteria2:="<=100"
这段代码的含义是,筛选活动表的"A1:W100"这个区域," Field:=1"表示筛选条件位于所选区域的第一列。Criteria后面跟的是一系列条件。这种筛选语句可以有多条,则选取需要满足多条筛选语句。
判断某区域的最后一行(行号)
判断一般区域
如果判断普通区域(非筛选状态),没有隐藏行,可以用下面的语句简单判断最后一行数据行号:
思路是先取消可能存在的筛选,然后选择一个单元格(选择的单元格需保证到该列的最后一行之间不存在间断,否则会出错)
'清除筛选
ActiveSheet.AutoFilterMode = False
'计算需要填充行数
Range("A2").Select
'跳到该单元格所在列的最后一行
Selection.End(xlDown).Select
a = ActiveCell.Row()
b = CStr(a) '数字转文本类型,即为选取最后一行行号
判断筛选状态区域第一行行号
更多的情况下,我们需要判断筛选后的第一行的行号才可以对该区域进行操作(一般是执行复制),可以采用以下代码:
n = Rows("2:" & Rows.Count).SpecialCells(12).Row
此句拆分一下,Rows(“2”&Rows.Count)选择从第2行开始到最后一行的区域,后面加上.specialCells(12)表示只选可见行,最后在加上区域的Row属性。返回可见区域第一行的行号。
填充指定区域
有时候需要填充指定区域(很多时候是类似公式的下拉操作)
'选择填充开始位置
Range("U2:W2").Select
Application.CutCopyMode = False
'填充到最后一行
Selection.AutoFill Destination:=Range("U2:W100" )
窗口激活、关闭,工作表的选择
'激活"我的工作簿.xlsx“窗口(前提是已经打开改文件)
Windows("我的工作表.xlsx").Activate
'关闭活动窗口的文件
ActiveWindow.Close
'选择指定工作表
Sheets("Sheet1").Select
'或者另一种方式,选“第1个“”sheet
Sheets(1).Select
有时我们需要判断一个工作簿里面的哪个子表才是我们需要的,我们可以遍历选择每个子表以此判断。
'判断子sheet是否为需要的
For i = 1 To Worksheets.Count
Sheets(i).Select
'写判断条件,满足了就退出循环不继续切换子表,否则一直看到最后一个子表
If Range("A1") = "日期_day" Then Exit For
Next
日期选择与偏移位置
有时候,我们需要动态更改报表里面的日期,需要用到日期函数,以及对日期进行偏移(一周,一月等)。
下面有一个案例:
'今日日期
td = Date
'设置基础日期
basedate = CDate("2021-11-1")
Sheets("累计").Select
'在基础日期上偏移当前日期的天数
Range(Range("GD1").Offset(0, DateDiff("D", basedate, td) - 1), Range("GD1").Offset(0, DateDiff("D", basedate, td) - 1).Offset(72, 0)).Select
Selection.Copy
Range("GD1").Offset(0, DateDiff("D", basedate, td) - 1).Select
Date函数可以返回当前日期,而借助Datediff函数可以计算出偏移后的日期,最后再借助offset函数,即可实现对指定选区的偏移操作。
发送邮件
发送邮件模块可以这样写:
'发邮件模块
Sub SendEmail(To_Addr As String, Cc_Addr As String, Bcc_Addr As String, SubjectText As String, BodyText As String, AttachedObject As String)Dim OutlookObj As ObjectDim OutlookNewMail As Object'创建Outlook对象Set OutlookObj = CreateObject("Outlook.Application")Set OutlookNewMail = OutlookObj.CreateItem(olMailItem)'错误异常处理On Error GoTo SendEmail_FailedWith OutlookNewMail.To = To_Addr '收件人地址.cc = Cc_Addr '抄送人地址.BCC = Bcc_Addr '密送人地址.Subject = SubjectText '邮件主题.htmlBody = BodyText '邮件内容.Attachments.Add AttachedObject '粘贴附件'.Send '若采用.Send方式发送邮件,则Outlook容易出现“有一个程序正试图以您的名义发送电子邮件”提示,比较招人讨厌。'若坚持采用此种方式发送邮件,又不想Outlook出现讨厌的提示,则需对Outlook进行如下设置:'"工具" -> "信任中心" -> "编程访问" -> 选择"从不向我发出可疑活动警告"End With'以下是采用通过激活Outlook,然后模拟按键方式进行邮件发送SendEmail_Sending:'显示发送邮件窗口OutlookNewMail.display'以下目的是留给系统充分的时间点击发送键For j = 1 To 200DoEventsNext'点击邮件发送SendKeys "%s", Wait:=True'遗憾的是,这里无法显示服务器发送状态,只能返回Excel发送的结果MsgBox "邮件已发送!"Exit SubSendEmail_Failed:MsgBox "发送失败,原因为:" & Err.DescriptionExit SubEnd Sub
'调用部分'简单调用示例,调用中各参数分别为:"收件人","抄送人","密送人","主题","正文","附件"。
SendEmail "12345678@qq.com", "", "", "数据表", "本月数据表,请查收!", "D:\Users\lindada\Desktop\我的工作表.xlsx"
以上邮件模块已经可以发送简单的文字邮件+附件了,但是我们日常工作中发的邮件一般是数据日报,不仅文字需要带一定的格式,邮件还会附带图片,这种需要将正文内容以HTML文档的格式编辑好放进正文里即可。
如下面一段HTML格式的正文:
<body style='font-family:微软雅黑;font-size:13px;'>各位领导好,数据达成如下:<br/>1、整体情况,XXXXX;<br/>2、产品维度,XXXX;<span style='color:red'>达成较差的为:张三、李四、王五;</span><br/><img src='D:\Users\test\日报截图.jpg'>
</body>
图文都有了,也有了格式设置,那么每次还需要将报表图片导出,就非常的麻烦,下面一段代码则可以将指定区域的内容提取为图表并导出:
a = ThisWorkbook.Path'打开当前文件路径下的看板Workbooks.Open ("" & a & "\" & "日报看板.xlsx")选择看板窗口Windows("日报看板.xlsx").Activate
'选择要发邮件的图表在的子表Sheets("邮件").Select'有时候会发现截出来的图片很大,可以模拟滚轮操作,将图片缩放到35%ActiveWindow.Zoom = 35'选择要导出为图片的区域Range("B2:V79").SelectSelection.CopySelection.CopyPictureWith ActiveSheet.ChartObjects.Add(0, 0, Selection.Width, Selection.Height).Chart.Parent.Select.Paste.Export "D:\test\日报看板.jpg", "JPG".Parent.DeleteEnd With
小结
以上是本人办公自动化用到最多的结构,其余的常见用法,比如说跳转单元格的位置,复制,粘贴等均可以通过录制宏代码后进行稍加改进,本文暂时写到这里,后续有新的感想会更新,感谢各位!
告别996之最实用VBA办公自动化代码大全详解相关推荐
- Eclipse编译运行Native代码步骤详解
Eclipse编译运行Native代码步骤详解 标签: android jni层 android jni步骤 android jni接口 转自: http://blog.csdn.net/ ...
- java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...
本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...
- java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...
这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...
- 编程 ul 不能一行显示 跳到下行_史上最全的数控G代码编程详解
一.G代码功能简述 G00------快速定位 G01------直线插补 G02------顺时针方向圆弧插补 G03------逆时针方向圆弧插补 G04------定时暂停 G05------通 ...
- xilinxFPGA-VGA时序+代码实现详解
xilinxFPGA-VGA时序+代码实现详解 VGA时序详解 VGA接口定义 VGA时序说明 行同步信号HYSNC 场同步信号VYSNC VGA时序查找 HYSNC VYSNC BLANK RGB ...
- (机器学习)随机森林填补缺失值的思路和代码逐行详解
随机森林填补缺失值 1.使用0和均值来填补缺失值 2.用随机森林填补缺失值的思路 3.使用随机森林填补缺失值代码逐行详解 3.1导包,准备数据,以及创造缺失的数据集 3.2数据集中缺失值从少到多进行排 ...
- x264 代码重点详解 详细分析
eg mplayer x264 代码重点详解 详细分析 分类: ffmpeg 2012-02-06 09:19 4229人阅读 评论(1) 收藏 举报 h.264codecflv优化initializ ...
- 强化学习教程(四):从PDG到DDPG的原理及tf代码实现详解
强化学习教程(四):从PDG到DDPG的原理及tf代码实现详解 原创 lrhao 公众号:ChallengeHub 收录于话题 #强化学习教程 前言 在前面强化学习教程(三)中介绍了基于策略「PG」算 ...
- 如何在Python中获取图片分辨率?——Python实现获取图片分辨率的代码及详解。
如何在Python中获取图片分辨率?--Python实现获取图片分辨率的代码及详解. 在进行图片处理或者图片分析的时候,获取图片的分辨率信息是必不可少的.Python提供了许多库可以方便地获取图片的分 ...
最新文章
- 电脑如何恢复声音_电脑文件剪切丢失如何恢复?99%数据都能恢复
- 微生物组核心OTU鉴定usearch otutab_core
- 语义匹配(一)【NLP论文复现】Sentence-BERT 句子语义匹配模型的tensorflow实现以及训练Trick
- 3000元电脑配置_2019年全新九代i59400F配RTX2060打游戏的装机电脑配置清单及价格...
- Cobbler体验小记
- .NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?
- 领诵员冯琳最新消息!保研复旦、主持卫视跨年晚会
- Linux 大文件拷贝失败,linux – Rsync失败,“文件太大”
- 前端面试题汇总(css基础篇)
- 一个使用Jmeter做接口性能测试的实战案例
- 二、bootstrap table 父子表和行列调序
- Picasso源码阅读笔记六
- NPN与PNP的区别与判别
- 关于数学计算机手抄报简单的,数学手抄报简单又漂亮图片
- 猩猩艾艾吸烟_艾艾在墙上谁是最公平的
- 访问文件或图片报403的处理方式
- 假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?()
- python attributeerror_Python 入门 错误显示 AttributeError: apos;moduleapos; object has no attribute apo...
- NOIP2016提高组初赛难点整理
- 计算机专业课程知识目标,计算机应用专业课程教学计划
热门文章
- 产品做了企业标准备案有什么用
- JavaScript——面向对象编程
- k8s集群部署二进制(一)
- SpringBoot 重定向和转发
- css控制页面打印(分页、屏蔽不需要打印的对象)
- 函授大专计算机应用和电子商务选哪个,函授大专该如何选择专业
- Android 图片选择对话框,通过本地相册或照相机获得图片,可单选或多选,单选可设置是否裁剪
- python分布式日志收集系统_分布式日志收集系统Scribe原理
- 计算机在材料化学中的应用大纲,2021南开大学819材料科学基础考试范围(大纲)和参考书目...
- 这段在vue官网能成功运行的代码,在codepen里也没能运行,说vue没被定义Uncaught ReferenceError: Vue is not defined