博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
加color_01.VBA自动化办公——数据的局部加和
阅读量:5940 次
发布时间:2019-06-19

本文共 2918 字,大约阅读时间需要 9 分钟。

0b94317f7c86f13fe1aee5111cf66cfe.png

VBA实用项目罗列:

https://zhuanlan.zhihu.com/p/172176111​zhuanlan.zhihu.com

hello大家好,今天开始本人将开设全新的专栏——《办公自动化》。本专栏旨在通过一些日常工作中比较常见的典型案例,向大家展示VBA在减少重复性工作上是多么简单有效。


本期案例:

37979a539db38983fbf53961506981a3.png

单位领导给了你一份本学院所有同学的创新学分具体情况的名单,并要求你完成如下工作:

1.将每一位同学所申请的创新学分总数分别加和,并在表格上新增“创新学分总数”一列;
2.将创新学分总数低于3的标红;
3.表格顺序不得打乱,表格格式要求统一。

结果你一看,好嘛!学院有上千名同学,每一位同学又都至少申请了一个项目的创新学分,这要是一个个加和,费时费力且枯燥无味,整不好眼镜疲惫之时还会出现计算错误、表格选择错误等情况。

这个时候,就轮到我们的VBA上场了!先带大家简单认识一下这个工具。

01.什么是VBA?如何打开并使用VBA?

VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。它也可说是一种应用程式视觉化的 Basic 脚本。

VBA的使用也较为简单,首先打开一个excel文件,然后找到“开发工具”:

0f6878f717f9250a8d1c3c3df0baa304.png

接下来点击VisualBasic就会进入该界面:

6ee2d79894ffeed35a455a67c911d431.png

在左侧空白处点击右键选择“插入”-“模块”,即可创建一个新模块:

a5ca67fa0442cc1c851086a21fccd552.png

接下来的编程都在这个新模块内进行,简单的介绍到此结束,由此正式进入案例分析。

02.案例分析

为了解决这个令人头大的局部案例,我们分步骤进行详细阐述:

①计算每一位同学的创新学分总数并写入新的一列:

37979a539db38983fbf53961506981a3.png

计划将学分总数写在第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值写入张三的最后一个项目那一行。以此类推,直至遍历完整个数据表。

点击如图黄色框框的按钮即可执行。

18c544544148129aafdfdffdb47b7ff9.png

代码执行结果如下:

d0f617477563035ce90aa34e54344ff8.png

②在不更改数据顺序的情况下将创新学分总数低于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行。

代码执行结果如下:

836ea9ae19decffb9ceb9d97e57b3cb4.png

③整理格式:

事实上最右边的两列都没有黑色边框,这个可以整体选择一键配置,但每一位同学的学分总数只在该同学最后一个项目的那一行,正常来说应该连同其余冗余的单元格一起合并居中才对,如图所示。

b64ff0157bd4326fe394f82d77927bad.png

代码如下:

[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归零,不然到下一位同学的时候计算行数会出现错误。

代码执行结果如下:

9869dc283a4303c34a80e0b8699f2e01.png

03.小结

39ebd1a284dbf704f669a520c87f4506.png
代码完整版

其实本案例还是有一定难度的,不过其中有一些代码是不需要记忆与理解的,比如之前提到的标红的代码与合并的代码,这些都可以从VBA内部直接调出,具体方法我会在下一期进行讲解。

通过这个案例不难看出,当我们要处理成千上万份数据的时候,VBA的几十行代码可以大大提高我们的工作效率,减少很多不必要的重复性工作。对于本期的代码,大家有啥问题可以在评论区留言或私戳,如果本期内容对你的工作有帮助,记得点赞哟~

转载地址:http://elltx.baihongyu.com/

你可能感兴趣的文章
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
基础复习-算法设计基础 | 复杂度计算
查看>>
debian、ubuntu系统下,常用的下载工具
查看>>
带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
查看>>
如何解压缩后缀名为zip.001,zip.002等的文件
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>
微信公众平台图文教程(二) 群发功能和素材管理
查看>>
关于System.Collections空间
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
Centos 7.5 部署DNS
查看>>
yum简介
查看>>
cp讲解
查看>>
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
查看>>
如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
查看>>
论代码审查的重要性
查看>>
「docker实战篇」python的docker爬虫技术-导学(一)
查看>>
linux日志基础介绍
查看>>
如何关闭SElinux
查看>>