本文共 2918 字,大约阅读时间需要 9 分钟。
VBA实用项目罗列:
https://zhuanlan.zhihu.com/p/172176111zhuanlan.zhihu.comhello大家好,今天开始本人将开设全新的专栏——《办公自动化》。本专栏旨在通过一些日常工作中比较常见的典型案例,向大家展示VBA在减少重复性工作上是多么简单有效。
本期案例:
单位领导给了你一份本学院所有同学的创新学分具体情况的名单,并要求你完成如下工作:
1.将每一位同学所申请的创新学分总数分别加和,并在表格上新增“创新学分总数”一列; 2.将创新学分总数低于3的标红; 3.表格顺序不得打乱,表格格式要求统一。
结果你一看,好嘛!学院有上千名同学,每一位同学又都至少申请了一个项目的创新学分,这要是一个个加和,费时费力且枯燥无味,整不好眼镜疲惫之时还会出现计算错误、表格选择错误等情况。
这个时候,就轮到我们的VBA上场了!先带大家简单认识一下这个工具。
01.什么是VBA?如何打开并使用VBA?
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。它也可说是一种应用程式视觉化的 Basic 脚本。
VBA的使用也较为简单,首先打开一个excel文件,然后找到“开发工具”:
接下来点击VisualBasic就会进入该界面:
在左侧空白处点击右键选择“插入”-“模块”,即可创建一个新模块:
接下来的编程都在这个新模块内进行,简单的介绍到此结束,由此正式进入案例分析。
02.案例分析
为了解决这个令人头大的局部案例,我们分步骤进行详细阐述:
①计算每一位同学的创新学分总数并写入新的一列:
计划将学分总数写在第N列,对相同“姓名”的不同“申请学分”进行加和,将结果写在每一位同学所申请的最后一个项目所在的行,如李四的总数将写在(N:11)单元格(张三在第4行)。
代码如下:
①Sub merge() ②Dim x As Integer ③Dim y As Integer ④For x = 4 To 1020 ⑤ If Range("b" & x) = Range("b" & x + 1) Then ⑥ y = y + Range("h" & x) ⑦ ElseIf Range("b" & x) <> Range("b" & x + 1) Then ⑧ y = y + Range("h" & x) ⑨ Range("n" & x) = y ⑩ y = 0 ⑪ End If ⑫Next ⑬End Sub
第一句是和第十二句是VBA代码必不可少的语句,相当于开头和结尾,只要打出了第一句,按下回车,最后一句就会自动出现。第一句中merge是对该代码的命名,可以随意更改。
第二、三句引入了x和y作为变量,并定义x、y为整数。在未规定变量的值的情况下,变量值默认为零。
第四至第十二句是核心代码。其中For是遍历的意思,要与Next一起使用,For与Next之间的代码就是遍历的具体操作,而If……Then/ElseIf……Then要与End If一起使用,二者之间的代码就是逻辑判断的具体操作。翻译过来就是:由张三这行(第四行)开始一行行地遍历,如果遇到的都是张三那么每遍历一行就将该行的申请学分值加到y上,直到遇到非张三的人名,这个时候将y值写入张三的最后一个项目那一行。以此类推,直至遍历完整个数据表。
点击如图黄色框框的按钮即可执行。
代码执行结果如下:
②在不更改数据顺序的情况下将创新学分总数低于3的标红:
代码如下:
①Sub merge() ②Dim a As Integer ③For a = 4 To 1020 ④ If Range("n" & a) <> "" Then ⑤ If Range("n" & a) < 3 Then ⑥ Range("n" & a).Select ⑦ With Selection.Font ⑧ .Color = -16776961 ⑨ .TintAndShade = 0 ⑩ End With ⑪ End If ⑫ End If ⑬Next ⑭End Sub
翻译过来就是:对第N列的元素进行遍历,当该单元格不为空且其值小于三时,将该单元格内容标红。标红的代码为第6-10行。
代码执行结果如下:
③整理格式:
事实上最右边的两列都没有黑色边框,这个可以整体选择一键配置,但每一位同学的学分总数只在该同学最后一个项目的那一行,正常来说应该连同其余冗余的单元格一起合并居中才对,如图所示。
代码如下:
[1]Sub merge() [2]Dim i As Integer [3]Dim j As Integer [4]Dim k As Integer [5]For j = 4 To 1020 [6] If Range("n" & j) = "" Then [7] i = i + 1 [8] ElseIf Range("n" & j) <> "" Then [9] k = j - i [10] Range("n" & k, "n" & j).Select [11] With Selection [12] .HorizontalAlignment = xlCenter [13] .VerticalAlignment = xlCenter [14] .WrapText = True [15] .Orientation = 0 [16] .AddIndent = False [17] .IndentLevel = 0 [18] .ShrinkToFit = False [19] .ReadingOrder = xlContext [20] .MergeCells = False [21] End With [22] Selection.merge [23] i = 0 [24] End If [25]Next [26]End Sub
翻译过来就是:对学分总数这一列进行逐行遍历,每遍历到一个空单元格,i的值就加一,直至遍历到不空的单元格,假设该单元格位于第j行,那么该单元格所对应的同学所占的行数必定为第j-i~第j行,这个时候选中这些行,进行合并居中处理即可。合并居中处理的代码为第10-22行。注意,在合并之后一定要将i归零,不然到下一位同学的时候计算行数会出现错误。
代码执行结果如下:
03.小结
其实本案例还是有一定难度的,不过其中有一些代码是不需要记忆与理解的,比如之前提到的标红的代码与合并的代码,这些都可以从VBA内部直接调出,具体方法我会在下一期进行讲解。
通过这个案例不难看出,当我们要处理成千上万份数据的时候,VBA的几十行代码可以大大提高我们的工作效率,减少很多不必要的重复性工作。对于本期的代码,大家有啥问题可以在评论区留言或私戳,如果本期内容对你的工作有帮助,记得点赞哟~
转载地址:http://elltx.baihongyu.com/