需求提出
今天我们来看一个运动会比赛表的整理问题,每个运动项目都有独立的小表格,现在要整理成标准的二维表格,方便老师观看每个同学的比赛项目。
原表一共有500多行数据,几十个小表格,是1个中学老师来找我定制,他说他每次做这个做一次要好几个小时,我最后给他用Excel VBA代码一键完成,也没报高价,200块,他拿到后惊为天人,一口一个谢谢,后面又给我单独发了18块钱的红包请我喝奶茶!
当然大家如果需要定制VBA表格,可以联系我加QQ 3389320399 或微信 fxYYDS3389320399,随时欢迎!!
前置知识
本案例属于实战案例,零基础有点难,学习本案例需要至少有以下VBA基础
-
VBA数组基础
-
根据表格有效区域获取数组
-
VBA字典基本知识
-
VBA字典行列号法基础
以上知识点,本人均在郑广学VBA175例教程中学习
- 结果标题列号装入项目列字典
- VBA将学生号码的行列号 装入字典并用固定的分隔符连接
- 循环字典中的学生号码关键字 取出对应的行列号
如数据下图:
由于本文图片尺寸较大 请大家尽量收藏转发后 到电脑端大屏查看学习,效果更佳!
解题思路
由于数据比较大, 这次我们使用郑老师教的万能字典行列号法,使用VBA的行列号定位+数组循环来完成,下面就开始我们愉快的学习旅程!
-
对源数据循环,VBA将相同学生号码的行列号装入字典,行号用##分隔记录,列号用$$分隔记录
-
循环字典中的学生号码关键字 取出对应的行号列号
-
按逗号拆分行号列号得到行号列号数组
-
循关键字数组,从源数据依次取出号码,年级,班级,姓名及比赛项目
-
结果放入结果数组,写入结果区
看图中黄色底色廖凯同学 不管参加什么项目的比赛,他自己的学生号码是唯一不变,这时候我就用 字典 记录所有003号码廖凯参加比赛项目的行列号,再通过是否包含男女字样来锁定标题行,然后就可以提取我们所要的信息。
下面我们讲一讲重难点
1 、首先需要定义一些变量和字典对象,和大家一样,最开始这个字典对象很长,总是记不住,不过还好有工具可以帮助我们快速输入,安装VBA代码助手插件(vbayyds.com)后,在第25行 只需要输入 dicd四个字母,然后空格就会得到提示 按下Tab键即直接输入字典的定义, 即使是第一天学vba的同学,也不怕记不住代码了!
2、第09行到17行,将结果区域crr数组中的第1行的标题作为字典的关键字key,列号作为他对应值存入字典dic项目位置,后面在存放比赛项目的结果时候可以取出来对应项目的列号位置。
3、同理:首先根据是否包含男女,把每个小表格的标题行存入关键字为“标题行”的对应字典项目key值item中;然后再讲每个参加比赛的同学学号的行列号用不同的分隔符连接起来 存入字典对应key的值中(上次案例我们只了行号)
4 、定义一个结果数组brr ,循环对应的号码数组keys,取出字典中的所有号码的行列号,
结果数组brr的第一列 放学生号码;
结果数组brr的第二列 放对应比赛项目的标题中的年级信息;
结果数组brr的第三列 放原数组arr中的班级信息;
结果数组brr的第四列 放原数组arr中行号定位的姓名信息;
结果数组brr的第N列 将标题行里的比赛项目,放结果区域中dic项目位置列号所对应的列上打钩。
注意 在输出结果数组后,还要对结果区域的学号列从小到大进行排序!!
以上知识点在VBA175例 194多列求和通用解法 记录行号二次循环法深入讲解 详细讲解
好了,今天有关在Excel中多子表行列转换 VBA数组字典高阶解法的问题便介绍到这,大家赶紧实际操作练习一下吧,有不懂的问题可以留言问小编呦!感谢支持Excel880工作室,还请多多转发,持续关注我们呀!
特别推荐使用VBA代码助手,再也不怕记不住代码
最后,像大家推荐郑老师的VBA代码助手(下载地址vbayyds.com)
只需输入关键字,就能将收藏过的代码整个带出来,太赞了
比如上面代码中的字典 数组输出之类都只需要打几个字就出来
我们可以用代码助手看一下今天这个案例 我下午写了多少代码量
我的天哪 才小一百行了代码量 就解决了今天的复杂问题,VBA永远的神 !!!
案例文件下载地址
请关注微信公众号EXCEL880 公众号主页回复 75630