2021-12
17

VBA合并报表

By xrspook @ 8:47:14 归类于: 烂日记

我花了三天时间(但实际上每天都只有半天时间)把二维报表提取数据成以一维数据表。这有什么难度呢?一开始我也认为好像难度不是很大,但开始琢磨以后我发现事情远远没有我想象中的那么简单。我用的是Excel的VBA。如果操作简单的话可以在Excel的数据层面进行操作,但如果我要进行大量的数据清洗显然为了要追求效率,就必定要用到数组,数组这种东西无非就是不断地叠加循环以及判断。循环和判断我觉得几乎可以这么说,是编程的核心。要实现最终的目标,首先你得有一个非常清晰的逻辑,然后用那些循环和判断实现你的逻辑。当我看到某些人逻辑彻底混乱的时候,我心里就会冒出一句话,他们绝对不会懂得编程。也正是因为这样,所以现在的幼儿教育有时会把编程列为一个非常重要的项目,实际上练习编程就是锻炼逻辑,但是逻辑这种东西又分为了既定的规则以及你的自创招式。自创招式都来源于各种规则,但是不同的编摆方式会有不同的效果。成功编程的话效率极高,是秒杀型的,但是要制造那个秒杀效果的过程可能非常漫长。

我需要处理的那个报表,准确来说是一套报表,但是用的几乎都是一个版式。虽然看上去几乎一样,但是有可能某些细节上会有不同。如果我用了一个靠谱的逻辑去抓取数据,无论什么微调,对我来说都毫无影响。所以首先我要确定我要在报表里抓取什么东西,我要用什么方式去除掉那些我不需要的东西。如果用Excel表格的思路去理解的话,我肯定是先做一个筛选,然后把我不要的删除掉。如果不要的东西在行那里我还可以用关键词筛选掉,但如果那些东西出现在列那里,难道我要先做一个转制,然后再做删除吗?更郁闷的是那个表格的表头有三行。就一个现成的要达到最终效果的报表而言,三行的表头没有任何问题,但是如果你要把它按照数据层面去理解,这就很逆天。就更加不用说这三行的表头里面还有不少合并单元格,但幸好的是当我把单元格拆分了以后,实际上每个单元格里其实都有靠谱数据的。

我的思路是先把我不要的行删除掉,然后把我不要的列再删除掉。在删除行这个问题上一步我就搞定了,但在删除列这个问题上,我花了好几步,首先是删除没有数据的列,其次是删除含有某些关键词的列,也就是那些虽然有数据,但对我来说也没什么作用的列。把可以删除的东西都删除掉以后,我进行了一个二维表转化为一维表的操作,接下来就是在那个加工完的表里加一列存放表名。之前我说过我要处理的是一组样式差不多的表格。上面说的一大通,我只是说针对一个表我需要这么处理,所以在这之前我要有一个把文件夹里所有工作簿里面包含某些关键词的工作表汇总到一个工作簿里的步骤。我觉得这个合并工作表的耗时挺长,相对于后面的数组操作来说,这实在太费时了。之所以会这么耗费时间,是因为实际上Excel需要把工作簿一个个打开,抓取里面的某个工作表,然后关掉,不断地重复这个步骤,不断地开关工作簿会非常耗时。

如果之前我没有花过很多时间在账本的合并数据上,现在突然要我整这个的话,我肯定得花好几倍甚至十几倍的时间,但因为现在我是站在曾经自己的肩膀上的,所以虽然期间有过纠结,但总的来说还算是比较顺利。我考虑过要不要进行这种操作,但过去几年我都一直没这么干,因为要合并这些数据,一年只做一遍,有没有必要开发这样一个VBA脚本去实现呢?当那个报表被国粮局修改了,我又得重新修改脚本适应。所以之前我就在那里纠结到底有没有必要进行这个脚本的开发。

最终我做了,而且还做到了。

2021-03
9

酝酿着

By xrspook @ 8:51:01 归类于: 烂日记

无所事事就意味着,我正在酝酿着某些大project,但实际上具体是什么我还没想好。今年一开始的时候,我已经计划着要买一些书,我的书单里面一共有9本书,主要是几个类别,Power BI的、Excel的,Python的,也有其它数据分析类的。内容可能会有些重复,但是因为不是我自己给钱,所以重复也无所谓,最重要的是我要对这些工具有一个了解,然后我才好判断到底哪个才最合适。所以跟之前不一样,我不会每一本都细读,我会快速过一遍,知道他们的用途以及优缺点,然后在进行拿来主义,最终决定哪个或者那些结合才最适合。

现在摆在我面前的是一堆没什么逻辑可言的人,他们想到什么就做什么,同一个表,每个月出来的款式都不一样。为什么每个月都要调整呢?这就意味着一开始设定的那个规则不合理,因为把太多情况都例外出去了,但是有些时候,并不是规则有问题,而是我也说不准那到底是怎么回事,但他们就喜欢搞特殊。为什么要每个月的东西都不一样呢?为什么要为自己设下这些可能犯错的陷阱呢?数据处理这种事跟艺术家搞创作不一样,数据处理的规则老是变,当大量数据来临的时候会措手不及,完全搞不过来。之所以会发生这种事,是因为他们从来都没有从一个大局的层面去思考他们正在做的事,只是在得过且过,做完这个改一改然后下一个,但是这一个跟下一个有什么异同呢?为什么这一个跟下一个就非得用不一样的方式对待呢?他们没考虑过。在不应该做减法的时候做减法是他们经常做的事。之所以这样,大概是因为他们一直以来都没有被一些很死的规则限定住,所以他们老是变。我喜欢用一套规则去弄通所有的东西,于是几乎每次遇到这种人,我都会很烦。我讨厌这种事情,所以我必须做出一个系统性的东西,让他们完全遵照我的规则去做,不再让他们随心所欲。其实这种事,我不是第一个遇到的人,所以肯定已经有一些很成熟的方案,直接买过来就行了,但是我觉得。学习和研究最大的快感是让我做到别人之前有没有做过的事,有没有做过其实无所谓,反正我没见识过。从0到1获得的过程我很享受,我不知道别人会不会。如果可以选的话,很多人宁愿选择遵循别人的规则,而不是设定一套规则让其他人都去执行。我不知道这种制定规则让别人去做的事算不算是女王的范。之所以要这样,我不过不想被他们的乱七八糟搞的我好烦而已。碰到有逻辑的人,我们还可以讨论一下设定条件制定规则,但那些毫无逻辑可言的人。我只能为他们设定规则,然后要求他们必须严格执行。从前的编程是为了解答出别人的题目,而现在的编程,我是要实现自己的目标,虽然那个目标很确切到底是什么我还没想清楚。在我开始之前,我必须要把这个目标明确的定下来,然后才好找方法实现。

不是每个人都喜欢亲自去探索,但我就是那种人。

2020-08
1

真的是软件在欺负你吗

By xrspook @ 17:10:03 归类于: 烂日记

前几天,我的一个同事跟我说她现在用的是WPS,在筛选数据的时候,一个数据源每一次筛选出来的东西都不一样,今天是一个总数,明天又是另外一个总数,问我会不会遇到这种事情。首先我跟她说,我根本不用WPS,因为它不能满足我的要求。其次,我用Excel时候,从来不会发生这种事。她跟我说,筛选少量数据的时候,没有这种问题,但是数据量一大,就会出现状况。我没遇到过这种问题,我信任我正在使用的软件,同时,我的软件,也没有背叛过我。然后就没有然后了。她没有叫我去她那里实地给我演示一下WPS是怎么把她整死的,我也没有主动要求去看一下,到底WPS在搞什么鬼。我觉得,不是WPS搞什么鬼,是她的数据格式有问题。最大的可能性是不够规范。非常有可能出现了合并单元格之类的东西,也有可能数据粘贴过去,某些单元格里出现空格之类的玩意。各种各样奇怪的现象都有可能发生。之所以有这种感觉,是因为几乎每次她给我看一个新表,里面都有一些奇怪的东西。

对我这个Excel控来说,那些瑕疵是完全不能存在的,比如说我最讨厌的类型——明细表格里有合并单元格;也比如表格的标题模棱两可,让你不知道那到底是什么;第三次是逻辑思路混乱,根本搞不懂一个表格里勾稽关系到底是怎么样的。于是这也难怪为什么领导布置下来的东西,她不得不一次又一次交上去,因为领导要觉得不满意,叫她一再返工。别说领导不满意,我这个路人甲也看不过去。领导为她好的话,怎么会不让她返工呢?一方面我觉得,其实领导的这个做法挺好,因为他没有给你设定好你到底要怎么干,你按照我思路去干就可以了。他给了你一个思考的空间让你琢磨,这是个让你进步的好机会。但你交上去的东西老是不合他的要求,谁都会上火。

之所以会发生这种事,其中一个原因我觉得是在她自己设计那些表格之前,见过的表格太少了,尤其是非常复杂的。什么东西应该放在一起,什么东西不能放在一起,她没有一个很明确的思路。自己的知识库容量不够,当然不可能折腾出知识库范围以外的东西。其他人是怎么处理这些数据的呢?他们用的是什么工具?什么表格?什么方法?领导是这么要求的,但是我觉得我的这套方法比领导要求的更清晰,更不会出错,我可以跟领导解释我的用法,如果合理的话,我觉得领导不会有意见。情况就像我们做毕业答辩的时候,就应该有这么一个底气,在这个课题上,我花的时间和精力都很多。比台下评分老师了解的还要透彻,虽然他们的经验比我丰富。所以,在我的这个课题上,我应该很有信心。但是,绝大多数人都不会这样,于是就会出现毕业答辩的时候被下面的老师批得一塌糊涂却哑口无言。有可能是他们对自己的课题根本不清楚,也有可能纯粹是因为太紧张了,脑子转不过来。

规则在你手,数据由你去整理。如果你都没有一个靠谱的处理方法,别人怎么会放心。不觉得自己不靠谱的方式有问题就是最大的不靠谱。

2020-03
15

搞清楚comments.php

By xrspook @ 11:28:25 归类于: 烂日记

时间用在查找代码上去得特别快。感觉问题还没解决,时间就已经溜了。大体上看,就只有几个大问题需要解决,但实际上那些东西是完全没有头绪应该怎么去做的。昨天我花了一个下午的时间去处理comments.php。那个模板用来设定在哪里显示评论,哪里显示评论框,这其中还不包括评论框里的具体格式。看上去这是非常简单的事情,实际上,还是要考虑好几个问题,但显然,10年前,做那个模板的时候,我没有在comments.php这个问题上纠结,我顶多是往里面放了一些我设定好的CSS,所以那个部分的逻辑到底是怎样的,我没去修改,沿用的是某个模板。实际上我用的那个模板是不是标准的,我也说不准,因为我实在不记得当年我用作改造的模板是哪一个。因为通常WordPress的官方模板都非常简单,甚至可以说简单过头,于是你不知道该如何在那个的基础之上改造。大概之前,我的那个comments.php测试的时候,我只是考虑了一般情况。但除了正常情况,WordPress里还是会有一些极端情况,比如说某篇日志被设计为密码可见。无论是日志还是评论,在输入密码之前都应该是一片空白。那个模板就很神奇,日志部分已经是提示输入密码才可见,评论部分直接不显示就行了,但实际上,那里居然在会提示一次输入密码才可见,显然这就是画蛇添足了。让我纠结的时间最长的是嵌套格式的代码。因为正文部分我分为左边和右边,左边是文章的主体以及评论框,右边是边栏。这两个板块,一个是float向左,一个向右,一旦代码嵌套不合理,右边的边栏就会进入左边,又或者直接消失,也有可能是因为缺少结束嵌入代码,所以网页底部的东西飞上去了。要解决这些结构格式上的问题,就首先要搞清楚,那些php代码的开始结束位置。比如说某篇文章设定了不允许评论,但是对于已经有的评论,你还是要把它们显示出来,然后在最后一条的那里显示不许再评论。之前我根本没有测试过不许评论这个功能,显然当我在撰写日志的时候设定了不允许评论以后,之前的模板相应网页会出状况。而之所以这样,是因为默认的模板里面我只在if下面添加了足够多的格式结束标签,在else里面没写。不许评论就是else的部分,判定函数应该是评论是否开放,但实际上,不允许评论这句话从结构看来,应该是放在评论列表的最后。这样的风格才会统一,因为有些时候,不许评论之前可能文章已经有评论了,如果硬生生地把那放在允许评论就有评论框,不允许评论评论框消失并写着不允许评论,那样就太生硬了。

我花了几乎一个下午的时间去处comments.php,最后终于搞清了里面的逻辑关系。为了让那些if跟else,以及endif能更好地维护,我在上面做了很多注解,基本上每个的那里我都会写清楚了对应的是哪个,同时我也进行了缩进。那么以后找的时候就不会那么头痛。如果写代码的人用的是大括号,显然就不需要纠结endif对应谁。我也不知道为什么那个人不用大括号,在没有标注也没有缩进的情况下搞清那些东西真的好费神。

纠结不是毫无用处的,这会让我变得更强大。

2019-06
25

VBA入门毕业

By xrspook @ 9:50:42 归类于: 烂日记

做天我把《别怕,Excel VBA其实很简单》看完了。感觉居然是原来这就结束了,但实际上,我好像有些东西还没掌握,所以我估计要把那本书再看一遍。虽然看这本书的时候我已经是一边看一边写。因为那些公式术语之类的,必须记下来,然后才有后面的运用。但虽然自感我已经写了很多,但是有可能因为看书太断断续续,所以实际上有些东西我还是没有记住。把书看到最后的时候我才发现原来在跟Excel数据库玩游戏的时候利用好数组非常重要。那本书最后那个例子是在1万个单元格里面输入1万个数字。原理很简单,实现方式很直白,但是用数组的方式录入比用常规的单元格录入效率相差一大截。数组录入的速度是常规方式的20倍,当然这只是一个大概估算,但显然,两种方式的效率差别很大。反观我自己写的那些脚本,我完全没有考虑过用数组。因为我没想过可以怎么使用数组。使用数组意味着你必须对界限这种东西非常清楚,但其实在不用数组的时候,我也是需要明确界限。如果我使用了数组,或许可以把之前需要用一两秒才运行出来的脚本进化为电光火石眨眼间之内结束战斗。

的确,昨天看到那个对比以后,我回去审视自己的脚本,但暂时来说,我还没想到可以怎么用数据去写。所以,我要把那本书讲到有关数组的地方再读一读。

写了这么久的VBA,但是每当要我准确地说出单元格位置的时候,我总要思考半天。因为用Range和Cell的时候,二者的坐标轴顺序刚好是相反的。那两个经常把我搞糊涂,所以当数组也插一脚的时候,我就更迷糊了,这三者的关系我必须搞清楚。这是做其它一切的基础。

还记得当年学C语言的时候,数组对我来说就是一个难点,貌似我一直都没有怎么想通透那个东西。在Excel里,有时最简单的一维数组可能就够了,通常来说二维能解决大部分问题,但说不准什么时候需要用到更多的维度。当年之所以把我搞迷糊,是因为那些维度总是让我摸不着边。我觉得三维已经是我的极限,更多的维度该如何表达我小小的脑袋思考不出来。现在我觉得其实我根本不用想象出具体的空间结构是如何的,我明白那种层次的关系也就可以了。

Excel这东西无非是玩好几个,文件夹基本上已经算是最大的范围,接下来是工作簿、工作表、单元格,以及单元格里面的具体东西,Excel就是控制好这些东西。VBA之所以牛逼,是因为它可以把很多重复性的东西批量完成,但是你要把命令写到位,那个软件才会以你设想的方式运行,并得出你想要的结果。玩好这个东西是为了我们以后做具体事情的时候不必那么埋头苦干地重复劳动。但在此之前,我们必须理清我们干那件事所需要的全部逻辑。就像一个高级技术人员,他或许不需要做一些非常实际的工作,但那些最基层的实际工作,他必须全部都吃透明白。

现在我才刚入门而已,从入门到基本上手是一个漫长的过程,就更加不用说往后更高层次的灵活运用了。

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