简介

本人日常办公中使用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办公自动化代码大全详解相关推荐

  1. Eclipse编译运行Native代码步骤详解

    Eclipse编译运行Native代码步骤详解 标签: android jni层   android jni步骤   android jni接口   转自: http://blog.csdn.net/ ...

  2. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...

    本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...

  3. java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...

  4. 编程 ul 不能一行显示 跳到下行_史上最全的数控G代码编程详解

    一.G代码功能简述 G00------快速定位 G01------直线插补 G02------顺时针方向圆弧插补 G03------逆时针方向圆弧插补 G04------定时暂停 G05------通 ...

  5. xilinxFPGA-VGA时序+代码实现详解

    xilinxFPGA-VGA时序+代码实现详解 VGA时序详解 VGA接口定义 VGA时序说明 行同步信号HYSNC 场同步信号VYSNC VGA时序查找 HYSNC VYSNC BLANK RGB ...

  6. (机器学习)随机森林填补缺失值的思路和代码逐行详解

    随机森林填补缺失值 1.使用0和均值来填补缺失值 2.用随机森林填补缺失值的思路 3.使用随机森林填补缺失值代码逐行详解 3.1导包,准备数据,以及创造缺失的数据集 3.2数据集中缺失值从少到多进行排 ...

  7. x264 代码重点详解 详细分析

    eg mplayer x264 代码重点详解 详细分析 分类: ffmpeg 2012-02-06 09:19 4229人阅读 评论(1) 收藏 举报 h.264codecflv优化initializ ...

  8. 强化学习教程(四):从PDG到DDPG的原理及tf代码实现详解

    强化学习教程(四):从PDG到DDPG的原理及tf代码实现详解 原创 lrhao 公众号:ChallengeHub 收录于话题 #强化学习教程 前言 在前面强化学习教程(三)中介绍了基于策略「PG」算 ...

  9. 如何在Python中获取图片分辨率?——Python实现获取图片分辨率的代码及详解。

    如何在Python中获取图片分辨率?--Python实现获取图片分辨率的代码及详解. 在进行图片处理或者图片分析的时候,获取图片的分辨率信息是必不可少的.Python提供了许多库可以方便地获取图片的分 ...

最新文章

  1. 电脑如何恢复声音_电脑文件剪切丢失如何恢复?99%数据都能恢复
  2. 微生物组核心OTU鉴定usearch otutab_core
  3. 语义匹配(一)【NLP论文复现】Sentence-BERT 句子语义匹配模型的tensorflow实现以及训练Trick
  4. 3000元电脑配置_2019年全新九代i59400F配RTX2060打游戏的装机电脑配置清单及价格...
  5. Cobbler体验小记
  6. .NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?
  7. 领诵员冯琳最新消息!保研复旦、主持卫视跨年晚会
  8. Linux 大文件拷贝失败,linux – Rsync失败,“文件太大”
  9. 前端面试题汇总(css基础篇)
  10. 一个使用Jmeter做接口性能测试的实战案例
  11. 二、bootstrap table 父子表和行列调序
  12. Picasso源码阅读笔记六
  13. NPN与PNP的区别与判别
  14. 关于数学计算机手抄报简单的,数学手抄报简单又漂亮图片
  15. 猩猩艾艾吸烟_艾艾在墙上谁是最公平的
  16. 访问文件或图片报403的处理方式
  17. 假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?()
  18. python attributeerror_Python 入门 错误显示 AttributeError: apos;moduleapos; object has no attribute apo...
  19. NOIP2016提高组初赛难点整理
  20. 计算机专业课程知识目标,计算机应用专业课程教学计划

热门文章

  1. 产品做了企业标准备案有什么用
  2. JavaScript——面向对象编程
  3. k8s集群部署二进制(一)
  4. SpringBoot 重定向和转发
  5. css控制页面打印(分页、屏蔽不需要打印的对象)
  6. 函授大专计算机应用和电子商务选哪个,函授大专该如何选择专业
  7. Android 图片选择对话框,通过本地相册或照相机获得图片,可单选或多选,单选可设置是否裁剪
  8. python分布式日志收集系统_分布式日志收集系统Scribe原理
  9. 计算机在材料化学中的应用大纲,2021南开大学819材料科学基础考试范围(大纲)和参考书目...
  10. 这段在vue官网能成功运行的代码,在codepen里也没能运行,说vue没被定义Uncaught ReferenceError: Vue is not defined