VBA实用项目罗列:

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

hello大家好,今天开始本人将开设全新的专栏——《办公自动化》。本专栏旨在通过一些日常工作中比较常见的典型案例,向大家展示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的几十行代码可以大大提高我们的工作效率,减少很多不必要的重复性工作。对于本期的代码,大家有啥问题可以在评论区留言或私戳,如果本期内容对你的工作有帮助,记得点赞哟~

检查一列数据的重复项 vba_01.VBA自动化办公——数据的局部加和相关推荐

  1. 【Excel】VBA自动化更新数据表格

    [博客地址]:https://blog.csdn.net/sunyaowu315 [博客大纲地址]:https://blog.csdn.net/sunyaowu315/article/details/ ...

  2. 检查一列数据的重复项 vba_提取重复值,但字典不是重点。

    本例的问题描述: 1:源数据与提取的结果在同一个工作表里面: 2:提取K.M.O.Q列里面不重复的数据(注意,数据列里面有空白的行): 3:把提取出来的结果放在A2单元格的下方,不能有空白行: 源数据 ...

  3. EXCEL使用公式去除一列中的重复项

    假设A列中数据如下,去除重复项后的结果数据如B列, 在B2单元格输入公式:=IFERROR(INDEX(A:A,MATCH(,COUNTIF(B$1:B1,IF(A$2:A$99="&quo ...

  4. python数据预处理 重复行统计_Python数据分析之数据预处理(数据清洗、数据合并、数据重塑、数据转换)学习笔记...

    1. 数据清洗 1.1 空值和缺失值的处理 ​空值一般表示数据未知.不适用或将在以后添加数据.缺失值是指数据集中某个或某些属性的值是不完整的. ​一般空值使用None表示,缺失值使用NaN表示 1.1 ...

  5. 判断表格中的一列是否有重复项

    //判部门是否为空var arr = [];$("[name^=departmentId_]").each(function(){if(!$(this).val()){isOk = ...

  6. tp(批量)插入数据忽略重复项

    我用的tp6,里面有一个replace,然而并没有什么用.(反正我是用这个没能弄出来) 但是,原生的sql有一个 insert ignore into 但是很不幸,tp没有.(我确实没有找到) 所以我 ...

  7. 一部分 数据 迁移_11项最佳实践,每次数据中心迁移都必不可少

    随着企业业务和应用的发展,现有基础架构已经无法保障时,数据中心迁移无法避免,企业可能需要迁移来增加容量或推出新功能和服务. 基础架构要求可能会随时间变化,并且可能会考虑使用托管服务提供商或云服务的选项 ...

  8. Excel VBA自动化办公:选择Excel文件合并订单数据生成订单汇总表、生成发货单并导出pdf文件、自动统计业绩生成业绩表

    基本需求: 让用户可以选择多个文件,根据用户选中的工作簿进行合并订单数据,按照预先设计好的订单模板写入数据. 对于同一个交易序号下面有多个订单的,需要计算该交易序号下所有订单的总金额.总票数.相同交易 ...

  9. 数据去重复_字典应用实例(每行每列都要去重复值)

    我的目标:让中国的大学生走出校门的那一刻就已经具备这些office技能,让职场人士能高效使用office为其服务.支持我,也为自己加油! 前面两节课中的去重复,不论是单张表里的去重复还是多张表里的去重 ...

最新文章

  1. SQL Server 数据库备份
  2. 揭晓飞桨平台提速秘诀:INT8量化加速实现“事半功倍”
  3. 网站改版后确保无误才能上线!
  4. 深入理解 SAP Fiori Elements 工作原理系列之二:如何给 SAP Fiori Elements 应用添加自定义按钮
  5. Java 8过滤器,地图,收集和流示例
  6. PostgreSQL的 initdb 源代码分析之二十一
  7. 【网站】 简单通用微信QQ跳转浏览器打开代码
  8. 50道编程小题目之【企业利润提成】
  9. 服务器文档读取不了,服务器读取不到内存
  10. 暑假集训-7.31总结
  11. 高效添加origin配色盘
  12. su灯光插件_V-Ray for SketchUp
  13. DMZ区域的作用与原理
  14. 小程序常用的十个入口
  15. gabor filters matlab,gabor filter matlab
  16. 根据地址返回经纬度 java_java 根据地址返回经纬度
  17. 计算机专业算理算工,计算机在高考时是算文还是算理啊
  18. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲
  19. 2022年CISP证书有啥用
  20. openstack 遇到的error

热门文章

  1. 重启centOS丢失nginx.pid导致无法启动nginx的解决方法
  2. 解决Git Revert操作后再次Merge代码被冲掉的问题
  3. 返回content-length=0问题解决
  4. ewebeditor编辑器ASP/ASPX/PHP/JSP版本漏洞利用总结及解决方法
  5. Intellij Idea debug 模式如果发现异常,即添加异常断点在发生异常处
  6. 【异常】Caused by: java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around
  7. 了解React.js中数组子项的唯一键
  8. springboot2.0系列(二):配置属性
  9. AJAX (异步 javascript 和 xml)
  10. Oracle的自定义函数浅析