四、实战 9.数组嵌套 数据源:
如上三个工作表数据截图(部分),在工作簿中一共有三张工作簿,名称分别为表一,表二,表三。要求把上述三个表中把附一到附三中所有股东性质(D 列)为个人,增减情况为(E 列)为新进的股东出现次数超过1 次以上(三个表中累计超过一次以上)的统计出来。
思路: 由于有三个表(目前是这么多),每个表都有数据,这里我们定义数组来存储每个表的内容。当然,如果不用数组而改用变量来存储,那就得定义三个,并且代码的通用性也不够好,万一哪天BOSS发来的表有10来个,代码不是又得重新翻个天。 使用字典,可以统计数据中股东为个人性质并且是新进的股东的出现资料。 当然,上面还只是迈出了一第步,题目要求是要求累计次数而不是在某个表中出现的次数,另外由于数据是分布于不同的数组中。 所以字典中Item中需要保存的数据项就会有三个: 1数据在哪个数组元素中(索引号定位,数据来自于三个工作表,也就是有三个源数据数组) 2找到位于数组中的位置时,我们还需要知道该项数据在源数据数组中所在的行号。这里已经有点是三维数组的意思了。第一维是工作表,第二维是单元格所在的行,第三维是单元格所在的列,不知道各位看官是否晕了。 3是当前出现的次数。
Item构思完成,就是数据的遍历与添加了。 在读取数据时,先找出符合条件的数据。 找到后,先在字典中找股东是否有添加,如果没有,就添加该股东,并用array函数构建Item数组写入字典中,数据还暂时未写入到结果数组中。 如果字典中有添加该股东关键字,则说明该股东的出现资料已经大于1了。既然大于1,就可以把当前读取到的这一条记录写入到结果数组中。同时需要读取出该股东的Item,然后修改数组中的出现次数。由于第一次符合条件的数据并没有写入到结果数组中,所以这里我们需要补录该股东第一次时的数据。数据从何而来呢,关键就在Item。由于在第一次添加该股东关键字时,我们构建了一个数组(源数据的编号,符合条件的股东的数据所在的行号,0)。每次修改时,股东次数会相应增加,然后再写回到字典中。但是补录数据只需一次即可,所以接下来通过判断出现次数是否等于1(第1次构建时为0),当等于1时,我们就补录数据。
代码:
效果截图:
|