2023-08
5

用VBA秒变身

By xrspook @ 11:07:04 归类于: 烂日记

说到就做到的,感觉非常的美妙。

前天说到我应该可以在VBA上更进一步,把数据整理以及最基本的汇总通过VBA一步搞定,结果我昨天真这么做到了。前天也说到VBA的copy让我非常的烦恼,但在我印象之中,以前我的烦恼并没有这么明显,之所以这样是因为以前粘贴时我不是直接粘贴单元格的内容,而是先把单元格的内容赋值给数组,然后处理数组,然后再贴回单元格。copy看上去很简单,但是在单元格的层面直接赋值好像无论如何都没有任何效果。把所选区域赋值给数组,相对好理解一些,但是要把数组再贴回单元格,相对于python的解决方案来说,VBA就很不人道了。因为我习惯了用python的方风格,所以回到Excel,之所以贴来贴去贴半天都得不到结果,就是因为我在数组复制内容到单元格的时候并没有设定单元格区域。不设定那个区域,永远都是贴了个寂寞。除非你使用Excel自己的那个方案,那个特殊粘贴的方案。我觉得这挺奇怪,既然我用特殊粘贴的方案可以不选定区域,为什么我直接粘贴数组就必须得这样呢?情况就像数组一开始就得设定好,得多大。当然有些数组是不需要事先设定长度,比如如果那个数组传入的数据是一个被打断的字符串。我不知道为什么被打断的字符串就不需要这么干。VBA数组一旦设定了大小,很难改变的。长度如果一开始长了,但最终你没用那么多,我也知道了最终的长度是多少,今天我的解决方法是先把这个二维的数组转置,在保留原数据的基础上限定最终的长度,然后我再把数组转置回来。之所以这么绕,是因为VBA只允许修改最后一个维度的长度。如果你是一个二维的数组。第1个维度是行,第2个维度是列,所以我的方式是行列转置,再转回来,但如果数组是三维的或者多维的,中间的某些要改,显然就不能这样了,但如果你执意要这么干的话,估计可以再建一个数组,设定好目标长度,通过套叠循环的方式把前一个数组的数据赋值到下一个数组里。但是为什么非得这样干呢?如果要限定数据输出的话,你只要限定数据输出的单元格是你最终的范围就可以了。但实际上,像我这种得到了这个数组之后,还得加工,还得在这个基础上汇总,我的数组就不能有空行。比如这一次我要在得出的数组的基础上再进行一个多条件的单汇总,如果我的数组里面有空行,最终得到的字典将出现一个键的内容为空,键值为0的玩意。我也不想这么折腾但是不这么折腾,真的没法玩,当然了,在输出字典的时候依然可以先做一个判断,让键是空的内容不输出。

字典这个概念,我首先是在学习python的时候了解到的。在学习python字典的时候,我就曾经用字典做过字母或者单词的数量计算。现在,如果我要进行前面我说到的多条件单汇总,我就需要用到字典。

至于在VBA里怎么用字典法实现我的目标,下回分解。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress