excel 2007 vba与宏完全剖析_Excel宏VBA小技巧系列 | 分段加合

写在前面的话  知识产权算是一个盛产数据的行业。专利啊商标啊著作啊,都有著录项目。我们常说的专利分析、产业导航、企业导航、产业预警、竞争情报、技术综述、知识产权评议等等,常规操作之一就要先处理著录项目数据,然后再进行不同角度的分析。有的小伙伴们会问,分析啊导航啊预警啊有什么区别啊,不都是一回事儿吗?君觉得说得很对,就像吃饭:有的人为了减肥,所以糖少一点;有的人为了增肌,所以蛋白质多一点;有的人为了养生,所以注重纤维素和维生素的搭配;吃饭的目的不同,所以食物的结构、成分、数量都不一样。不过,对大多数过一天算一天的人来说,吃饭就是按部就班、填饱肚子而已。所以说一回事儿也行,说不一回事儿也行,主要看精不精致。
“分析”这种能力,堪称人类智慧之光。专利分析领域有很多大神,还有许多高明的工具和技巧。不过君对分析是七窍通了六窍——一窍不通,所以分析绝对不是这篇文章的重点。这系列的文章,只想聊几个Excel宏VBA的小程序(其实并不限于处理专利数据,只是图个方便图个开心罢了),篇幅短小,而且比较快更。e1cea6494ef300263ffdbdac6860c7fd.gif

假如,某食品企业,每个部门按期提交发明创造。企业统计人员把发明创造的提交日、年份、发明名称、奖励系数汇总到一张表里。

3d10dcab7e5b20044f7b4c4bde0ea316.png

如果现在需要分段统计各个部门的奖励系数的总数,怎么办呢?有的小伙伴可能手动用SUM函数求和来搞定,或者可能用“合并计算”搞定咯。

不过,虽然手动操作的技巧简单易学,但当多个数据文件需要一系列的复杂手动操作时,手动操作就存在一些Bug:每换一套数据,就要重新手动操作一遍,并且,如果处理数据的人员更换,这一系列复杂手动操作的可移植性和准确性都比较堪忧。人力因素在处理数据的过程中难以抽离,大家很容易变成“表哥”和“表姐”。相比于人工手动操作,宏VBA程序因为在运行过程中剔除了人工的因素,所以可移植性和准确性都较高。而且,编写一段程序,相当于对不同的待处理数据固定了相同的“标准”。这个“统计各个部门发明奖励系数总数”的简单小例子,着重传达一种程序思维。

第一步:打开宏程序编辑界面

根据Excel版本的不同,可以在 “视图” 中录制一个空的宏,停止录制后进行编辑。也可以在Excel选项的自定义功能区中勾选 “开发工具” 访问宏功能。

第二步:定义Sub过程及变量

我们把完成“按部门加合发明奖励系数”的这个过程定义为bigtitle,当然,用其他的名字也可以。随后,我们要定义四个整型变量:

  • i 代表数据区域的行的变量

  • j 代表上一段相同部门底端的行

  • k 代表下一段相同部门底端的行

  • t 代表在一段相同部门的数据范围内变化的行

fcd3df991f3a3d3c69701b2e6591eb0b.png

随后我们再定义两个字符串变量:str1代表第i行的部门名称,str2代表第i+1行的部门名称。

写为:

Sub bigtitle()
Dim i, j, k, t As Integer
Dim str1, str2 As String
*程序主体*
End Sub

第三步:梳理循环和条件逻辑

① 第一层循环,i从表的第2行循环赋值至第24行,在i的每次赋值过程中,表中第i列、第3列的部门信息被赋值给str1,同时第i+1行、第3列的部门信息被赋值给str2。

写为:

For i=2 To 24
  str1 = Sheet2.Cells(i,3)
  str2 = Sheet2.Cells(i+1,3)
  *条件语句*
Next

② 条件语句,当str1不等于str2时,说明i所在的行已经到了该相同部门的最后一行,从i+1行起,就进入了下一个部门。这时,我们把这个i值赋给k,作为该段相同部门底端的行的标记,同时,把原k值赋给j,用于标记上一段相同部门底端的行。在判断str1和str2是否相同时,我们使用字符串对比函数StrComp。

写为:

If StrComp(str1, str2, 1) <> 0 Then
  j = k
  k = i
  *第二层循环*
End If

③ 第二层循环,当j和k确定后,从第j+1行到第k行,部门名称相同,即同一部门。此时设置t变量,其循环范围从第j+1行到第k行,将在此范围内的所有第5列的奖励系数都加总到第k行的第6列。这里需要注意的是,应当设置k的初始值为1。

写为:

For t = j+1 To kSheet2.Cells(k, 6) = Sheet2.Cells(k, 6) + Sheet2.Cells(t, 5)Next

这样,运行宏之后,就可以得到各个部门的总奖励系数:

3b0a0ff5dc8f7443e070e515613fc903.png

全体Sub过程如下,由两层循环和一层条件判断构成,给大家做个参考。

dbc7afc4feec29bf148ffeae647cb63f.png

这样,当数据量变大时,只需要修改第一层循环中“For i=2 To 24”的24至最后一条数据所在行的行数,然后重新运行宏,即可完成大量数据分段加合的工作。

6a20712f724058c81609b09780804079.png下期预告: Excel宏VBA小技巧系列之整合排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SecureCRT:保存输出日志的方法

处理地址&#xff1a; http://blog.sina.com.cn/s/blog_64c1dd210101gzgz.html 或者&#xff1a; http://renchen.blog.51cto.com/4531967/1195862 重点在与设定文档的文件名称&#xff0c;里面有说明。 http://renchen.blog.51cto.com/4531967/1195862转载于:https://www.cnbl…

redhat虚拟机安装

做过好多使用VMware workstation虚拟机搭建的系统&#xff0c;这是我第一次使用Virtual Box&#xff0c;感觉跟Vmware差不多&#xff0c;我的本子的系统是win7 64位。 下面演示安装的是在VirtualBox里安装rhel 6.4 linux 64位系统。 一、VirtualBOX 版本。 二、虚拟机的配置。…

mysql 查看表v空间自增涨_MySQL InnoDB表空间加密

从 MySQL5.7.11开始&#xff0c;MySQL对InnoDB支持存储在单独表空间中的表的数据加密 。此功能为物理表空间数据文件提供静态加密。该加密是在引擎内部数据页级别的加密手段&#xff0c;在数据页写入文件系统时加密&#xff0c;加密用的是AES算法&#xff0c;而其解密是在从文件…

arm之mmu原理

实验目的&#xff1a;启用MMU&#xff0c;映射SDRAM的地址空间&#xff0c;操作虚拟地址实现“点灯大法”&#xff0c;借此掌握MMU的使用。实验环境及说明&#xff1a;恒颐S3C2410开发板H2410。H2410核心板扩展有64MB的K4S561632 SDRAM(4M*16bit*4BANK)&#xff0c;地址范围是0…

osal_start_timerEx(Lock_TaskID,SBP_START_DEVICE_EVT,SBP_PERIODIC_EVT_PERIOD)的理解

osal_start_timerEx(Lock_TaskID,SBP_START_DEVICE_EVT,SBP_PERIODIC_EVT_PERIOD)与osal_set_event(Music_TaskID,event)的区别是osal_start_timerEx周期性的一直推送事件周期时间由SBP_PERIODIC_EVT_PERIOD决定&#xff0c;而osal_set_event是只推送一次。osal_start_timerEx开…

ideaspringboot项目上传服务器_PHP中使用 TUS 协议来实现可恢复文件上传

曾经尝试过用PHP上传大文件吗&#xff1f;想知道您是否可以从上次中断的地方继续上传&#xff0c;而不会在遇到任何中断的情况下再次重新上传整个数据&#xff1f;如果您觉得这个场景很熟悉&#xff0c;请接着往下阅读。文件上传是我们几乎所有现代Web项目中的一项很常见的任务…

无密码登陆

server A /B以root账户在A上无密码ssh到B方式一ON A:ssh-keygen -t dsa -P -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys chmod 644 ~/.ssh/authorized_keys service sshd restart ON B:ssh-keygen -t dsa -P -f ~/.ssh/id_dsa cat ~/.ssh/id_d…

嵌入式常见笔试题总结

预处理器&#xff08;Preprocessor&#xff09;1. 用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09; #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情&#xff1a; 1). #define 语法的基本知识…

【转】php利用mkdir创建多级目录

先介绍一下 mkdir() 这个函数&#xff1a; mkdir($path,0777,true); 第一个参数&#xff1a;必须&#xff0c;代表要创建的多级目录的路径&#xff1b; 第二个参数&#xff1a;设定目录的权限&#xff0c;默认是 0777&#xff0c;意味着最大可能的访问权&#xff1b; 第三个参数…

java使用xml存储数据_用存储过程和 JAVA 写报表数据源有什么弊端?

用存储过程和 JAVA 写报表数据源有什么弊端&#xff1f;跟着小编一起来一看一下吧&#xff01;我们在报表开发中经常会使用存储过程准备数据&#xff0c;存储过程支持分步计算&#xff0c;可以实现非常复杂的计算逻辑&#xff0c;为报表开发带来便利。所以&#xff0c;报表开发…

GIT文件的三种状态

对于任何一个文件&#xff0c;在 Git 内都只有三种状态&#xff1a;已提交&#xff08;committed&#xff09;&#xff0c;已修改&#xff08;modified&#xff09;和已暂存&#xff08;staged&#xff09;。已提交表示该文件已经被安全地保存在本地数据库 中了&#xff1b;已修…

嵌入式常见笔试题总结(2)

预处理器&#xff08;Preprocessor&#xff09;   1. 用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09;   #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL   我在这想看到几件事情&#xff1a;   1). #…

MAC OS上JAVA1.6 升级1.7,以及 maven3.2.1配置

一、我的MAC系统 预装的Jdk是1.6&#xff0c;由于需要使用eclipse MARs 2版本&#xff0c;故需要升级到1.7 二、下载JAVA jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 不知道为什么直接下非常慢&#xff0c;后来用的迅雷就超级快…

sql server 创建唯一性非聚集索引语句_数据库专题—索引原理

深入浅出数据库索引原理参见:https://www.cnblogs.com/aspwebchh/p/6652855.html1.为什么给表加上主键&#xff1f;1.平时创建表的时候&#xff0c;都会给表加上主键。如果没有主键的表&#xff0c;数据会一行行的排列在磁盘上&#xff0c;查找一个数据需要一条条的进行对比。而…

String,StringBuffer,StringBuilder区别

String 字符串常量StringBuffer 字符串变量&#xff08;线程安全&#xff09;StringBuilder 字符串变量&#xff08;非线程安全&#xff09; 简要的说&#xff0c; String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行…

oracle数据库更新语句_20_手把手教你学Python之操作数据库

数据库是数据的仓库&#xff0c;将大量数据按照一定的方式组织并存储起来&#xff0c;方便进行管理和维护&#xff0c;例如快速检索和统计等。数据库的主要特点&#xff1a;以一定的方式组织、存储数据&#xff1b;能为多个用户共享&#xff1b;与程序彼此独立。……数据库管理…

第十周学习进度

第十周 所花时间&#xff08;包括上课&#xff09; 10小时 代码量&#xff08;行&#xff09; 0行 博客量&#xff08;篇&#xff09; 4篇 了解到的知识点 对各组进行评价&#xff1b;思考并回复各组 转载于:https://www.cnblogs.com/qwer111/p/5470819.html

嵌入式常见笔试题总结(3)

1:设float a2, b4, c3&#xff1b;&#xff0c;以下C语言表达式与代数式 (ab)c计算结果不一致的是 A.(ab)*c/2 B.(1/2)*(ab)*c C.(ab)*c*1/2 D.c/2*(ab) 参考答案&#xff1a;B&#xff0c;因为a,b,c三个变量都是浮点数&#xff0c;所以在B答案中其结果是0&#xff0c;因为…

查询Oracle正在执行的sql语句

--查询Oracle正在执行的sql语句及执行该语句的用户 [sql] view plaincopy SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, paddr, sql_text 正在执行的SQL, b.machine 计算机名 FROM v$p…

WinForm 清空界面控件值的小技巧

WinForm 清空界面控件值的小技巧 原文:WinForm 清空界面控件值的小技巧在WinForm里面有时候需要清空自己输入内容或是选择的选项&#xff0c;以便重新操作流程&#xff0c;那么一般你是怎么清空界面各个控件值的呢&#xff1f;如果窗体里面控件&#xff0c;尤其是TextBox控件比…