2025-11
18

Excel VBA的一些心得

By xrspook @ 8:28:23 归类于: 烂日记

虽然写Excel VBA已经有好长一段时间,但实际上对一些很基础的知识我还是不扎实的。比如ThisWorkbook和ActiveWorkbook到底是怎么指定的。光说这两样我好像明白,但是当我要使用的时候就感觉老碰钉子。这个东西使用不当,就会经常被弹出错误说某个工作簿里面没有某个工作表,或者说某个工作表已经存在了,不能再新建。不同的写法意味着同样的VBA脚本发起的那个工作簿不一样,有可能要在打开有数据的那个工作簿里发起,又或者直接是在VBA脚本所在的工作簿发起,不需要打开源数据工作簿。除了这个以外,还有就是当刷新数据要放在你已经建立的工作簿的超级表里,该如何删除超级表之前的数据?有两种选项,一种是把数据全部清空,这种情况不改变超级表的格式的,之前已经使用的行会继续存在。这里用的是clear命令,另外一个则是用delete的命令,那样的话原来工作表里面的数据全部删除,只剩下最后一行。二者的差异就在于,如果是用delete命令,如果那个超级表下面还有数据的话,那些东西将会上移,如果你又在那里插入新的数据,可能就会乱成了一团。所以如果在一个工作表里,你安排了很多个超级表,而你又确认那些超级表的格式不会改变,基本上也就那几行,又或者你不确定到底有多少行,但你能确定行数肯定不会超过多少行,这样的话,当你要用VBA把刷新的数据同时写入这些超级表的时候就应该用clear命令,这样的话,刷新的数据就可以指定从哪里开始。如果在这种情况下,尤其是工作表的下面还有一个工作表,你用了delete命令那么当你清空数据再写入数据,下面那个超级表对应的那个区域肯定会乱来。

没人跟我说过这些细节,这是在我摸索的过程之中,经历过一次又一次撞板之后得出的结论,所以如果可以的话,超级表你可以在旁边建超级表,但你不要在超级表的下面建超级表,尤其是那种你根本说不准上一个超级表到底有多少数据的情况下。多建几个工作表,在不同的列起始不同的超级表,一点问题都没有,但在很多人的固有思维里面,Excel就只是一个放表的工具,上下左右都可以放,但是就数据处理的便捷和难易程度来说,超级表的放置其实是得遵循一定规则。

自从知道了ADO+SQL之后,我就经常把这两个东西作为我最大的杀器,把经常使用的Excel表当数据库。但Excel始终不是数据库,最大的差别我觉得是虽然ADO+SQL可以用类似数据库的方式理解Excel表格,但因为Excel表格可以变换不同的格式,所以当在某一列理论上都是数字的那里突然意外有一格被插入了文字,那么ADO+SQL进行转换的时候就会出毛病。刚好你又对那一字段进行了分组汇总,那程序必然进行不下去。通常情况下,人肉很难发现这个问题,因为不知道在哪一行,突然插入一个文字是个意外。一般情况下,调用ADO+SQL把工作表里面的区域读取格式化的时候没有理会超级表的范围。如果有进一步的限定,实际上是可以设定范围的,但一直以来我都没有进行这个行的主动限制。

掌握了SQL以后我觉得Excel自带的那些公式实在太复杂了,参数很多、形式变来变去,有些用乘号,有些用加号,有些用*。

2025-11
17

汇总格式化

By xrspook @ 8:22:18 归类于: 烂日记

摆在我面前的格式化操作,从大的来说是两个格式化,从小的来说其实二者又有点区别。我自己的那个格式化是把明细数据整理好。因为导出的那些信息部分是完全缺失的,所以我需要建立新的字段,数据为空,后续手动录入,另外一些则属于没有直接给我数据,但是我可以根据已有的数据经过一系列的逻辑判断得出我需要的字段。相对来说,我的格式化需求要高一点,要慢慢来,因为字段的判定只要一急就会出错、不全面。另外的一个格式化则属于要做出一个汇总的数据。一开始我并不确定到底他们需要哪些信息,开会的时候我翻桌子了,他们意识到这个问题,也翻桌子了,我大概知道他们的用途是什么,因为好像那个东西我参与过,但具体内容是什么我不清楚。我需要他们给我一个截图,或者把已有的文件发给我,我自己去看到底是什么内容。

在他们把那个版本发给我之前,实际上我已经在琢磨怎么整那个。一开始我想到的是选择某些列得出一个明细,然后根据那个明细自动生成一个透视表,透视表里面的内容肯定足够他们填写相关的信息,但关键是他们想要的不是数据表,因为数据表很难复制粘贴。平时他们需要把那些东西转化为了一段文字贴到群里,数据透视表看上去的确更直观也不会错,但关键是图片这个东西很占空间,如果你几天不保存图片就会失效,所以如果要长期保存数据,还是纯文字比较靠谱。

一开始我尝试的是数据透视表,数据透视表很简单,但关键是不同版本的Excel数据透视表出来的默认格式不一样。他们干的这种事需要数据数据透视表不显示分类汇总,同时得重复所有标签。手工操作的话,这个很简单,但是用VBA控制的时候却发现自动生成的那些脚本又长又臭。那些又长又臭的东西到底能不能简化一些呢?VBA这个玩意的确可以通过录制生成,但关键是通过录制生成的那些东西通常都速度很慢,有很多废话,有些时候可能不太精准。所以我折腾了半个晚上,到底怎么把那些自动录屏出来的宏简化一些。虽然已经很努力,但是有个数据透视表不做分类汇总的那个坎好像挺难迈过去。

后来当他们把正在使用的那套查询数据库表发给我以后,发现或许我根本不需要生成透视表,实际上一个SQL的分组合并就能实现他们想要的东西,从那个查询表的内容看来,我的那个同事也是为他们做了这个事情。所以,整个逻辑就很清晰了,首先要看他们需要的那些数据在哪几列,刚好导出的那个大表上面的数据就能满足他们的要求,只是字段名有些不一样而已。这个很简单。所以逻辑就是把数据导出,删除最后一行,因为那个是汇总没有任何效果,然后把有数据的列全部转化为数字格式。因为神经病的浪潮为了他们自己方便所有列都设置为了文本,文本分组合并求和会完全不会起效。思路很简单,首先从原数据那里选取我需要的列,然后进行一些字段的重命名以及一些数字的转化分组合并,最后输出到我想要的地方。

一开始我并没有想好到底要输出到导出那个文件还是我有查询脚本的那个文件。经过一番的纠结和尝试以后,我感觉直接在我查询的文件通过ADO的方式查询那个导出的数据表,然后在查询的那个地方直接输出最便捷。一开始我想到的是要他们把转化好的内容贴到目标的表格,然后刷新一下。后来发现既然我都用了ADO。我根本不需要他们打开导出的原始表格我就能获取数据。

思路清晰以后,接下来的就只是执行。

2025-11
16

非常糟糕的细节

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

开会结束以后,我赶紧回办公室打开浪潮的二期系统,对比那个传说中的可导出数据的东西跟我的需求到底有多大的差距。一打开那个东西,我就看到了一些对我来说没什么用途的字段,接下来就是一个一个死磕那些字段和我需要的信息到底是否匹配、是否有缺失、是否某些字段看上去好像是合理的,但实际上是有区别的。最快的方法是直接把导出的那些有差异字段对应的列号记下来,哪些是不要的,哪些是需要修改的,然后再把我原先的那些数据格式的字段保存下来,对比到底差了多少列。我运气比较好,这个匹配的过程很快就结束了。先算一下导出的数据有多少列,其中有多少列是不需要的,有多少列是需要修改的,有多少列属于新增数据。这个数算出来以后,再把新导出的按照我之前的那个格式排列一下,如果都对上了,基本上就这个样子了。对上了以后,我赶紧把核对的结果发给我的同事,因为以前就是他给我们做数据库数据查询的。但是这只是初步的筛查,在后续的数据调用的过程之中,我还发现了一些自己一开始的时候没有注意到的细节。有些字段名是那么回事,但实际上仔细看里面的明细会发现表达方式有所不同,所以这就需要在后续一次又一次的修改中逐渐全部都纠正过来。

最弱智的差异,我感觉是单据编号,那个就是一个顺序号号,跟我们实际上单据上面的编号不是一回事。第二天当我的同事偶尔打开那个有链接功能的单据编号的时候,发现里面的那个明细的单据编号是对的,所以这到底是什么狗屁逻辑才想得出来的事情呢?在明细里面单据编号是对的,但是外面那个可导出的大表,单据编号是没有意义的。这个不是特例,浪潮整个系统无论是一期还是二期,导出都会出现这种弱智的问题。最经常发生这种问题的地方在某个查询的地方,它是可以让你手动选择要不要显示某些列,但实际上选项里面的那个名称跟实际上表格字段名不一致。有些不一致,有些字段里有但选择里没有,有些则是反过来。到底什么样的开发才能搞得出那这么low的事情?居然没有被痛骂,没有被强制必须修改。这里说的是字段名的问题,而另外一个就是查询的表格很长,因为很长,所以他们也料到得有针对不同的人保存不同的显示选项。作死的是明明字段已经很多,但是每个字段却留了很大的一片空间放置,所以一个23.4寸的显示器顶多只能显示不到5列,实际上那里有超过10列的内容,要看齐一个表,你还必须滚轮横拉。当你看那一条数据的时候,你上面的数据你都得捕捉,但那个可选项里面只有显示什么不显示什么,并不能对那些字段进行自定义的排序。最经典的神经质就是仓号放在第一列,库存放在最后一列,我就是要看这个仓号的库存的,但实际上当我把那个滚动拉到最后的时候,我已经不知道要看的仓号是第几行了,因为根本无法锁定高亮。

这种系统开发出来叫人怎么用?!东西有没有?大多有。东西齐不齐?肯定不齐。东西用起来怎么样?本来你用1秒或者甚至0.5秒就能确认的事情,纵向横向拉鼠标就耗费了5倍甚至10倍那么多的时间,因为需要不断拉,所以可能会出错,得反复确认核对,耗费的时间变成了原来的10倍以上。要用这套破系统工作,领导准备好给10倍的加班费了吗?

2025-11
15

真是天真

By xrspook @ 8:55:04 归类于: 烂日记

疯癫归疯癫,摆在我面前的事情必须得干,格式转换如果没办法进行下去,我的整套流程就无法开展。

我跟他们根本不是一路的,对他们来说这只是应付检查,对我来说应付检查只是我整套流程里面最末端的一个部分,不是最末端的全部,是最末端的一个表达形式。在到达最末端之前,前面有一系列积累、汇总、校验。只有当前面全部都通过了,最末端生成的那些账本报表才会有意义。对他们来说,可能一周或者一个月干一次,那对我来说每天都要干,做的频率以及数据所涉及的深度,我们都不是一个层次的。他们根本不了解我的业务,不了解我的流程。他们自己也根本没有自己一套的方法,对数据没什么要求,也正是因为他们没有自己的一套方法,做出来的东西经不起考验,老是出现这样那样的纰漏。他们自己没有方法,自然就没办法跟他们下面的人说应该怎么做。他们只会告诉下面的人要做什么,至于怎么做,他们心里都没数。没见过不知道,见过了,我属于那种根本不想再见。

一次又一次地在各种检查中出现低级错误,为了避免这种低级错误,为了避免他们临时抱佛脚,我不得不每个月头都强制要求他们把所有账本类的东西、跟我有点关联的那些东西全部都拿过来,我一个一个给他们核对。虽然我知道这种核对没什么意义,因为如果那些东西全部都是电子表格打印出来,如果错了回去改重新打印大概就好了,但是他们的那些表格一半是电子表,一边是手写。手写的东西某一天可能要把它变成电子表,怎么保证录入的过程不出错?今年的秋普就出现了一个离谱到了极点的事情,他们的某个账本刚好在10月底的时候没有拿过来给我检查,因为平时负责这项工作的那个人刚刚被派到粮源地溯源去了。之前一直负责这个的人,我比较信任他,因为他比较上心。他清楚知道自己在干什么,知道我跟他点出别人干的那些出的问题到底在哪里。我知道他会盯着他们去改,又或者直接他自己帮他们改了。但接替这的那个人,他自己都是一个完全迷糊的存在。这一次发生的低级错误是某个账本的最后一页,本来不需要改,但在那里盖了个业务更改章,他们觉得不好看,所以重新改了那一页纸,打印出来找人签名,签名的那个人一眼都没看,结果就出现了一个弱智到极点的问题。上月的库存是11000,这个月没有变动,但这个月的库存突然就变成了20000。到底什么样的人才能做出这么无脑的行为呢?我给他们核对多少次都没有用,因为他们总喜欢在检查之前加班,总喜欢临时抱佛脚,总喜欢把没有错的东西改成错的,这种低级错误就是一个他们一直以来工作的典型特征。因为一直都这样的,所以不出现这样的错误,概率极低。这帮人用这些方法干这些事情不可能不发生这样的问题。

他们没方法,他们无法理解我有方法,然后他们还以他们的角度觉得我不会受这次换系统的影响。我只能叹一句,真的很傻很天真。

2025-11
14

破烂到极点的切换系统

By xrspook @ 10:29:30 归类于: 烂日记

有种疯掉的感觉,周四下午被告知周五开始业务系统要停掉一期的,全面启用二期。一期跟二期系统都是浪潮开发的。系统招标的时候,我就做出过一个预测。如果二期是被别人中标了,我们还有一线生机,那如果浪潮中标了,我们就必死无疑,果然不出我所料。最大的那个领导说是我们吐槽太多了,这完全是因为他自己不使用,不直接面对那些每天我们都要重复面对的事情。

可以这么说,二期之前我只用过监控,因为一期的监控需要安装插件才能使用,非常的麻烦,而且安装了插件以后,还得对浏览器做很多设置,每次windows升级以后还会得一切重来。二期其它部分我几乎没有认真研究过,对我来说有一期系统换成二期系统,最大的问题只有两个。一个是因为一期系统做的汇总查询或者明细查询功能荡然无存或者说毫无用处,所以我们单位的人就直接做了查询来实现这个功能。业务部门在查数要数的时候都已经习惯了这种便捷的汇总方式,只需要刷新就可以获取数据库的内容。但关键是被告知第2天就要用二期的时候这个查询没有,因为不知道二期数据库的接口是什么,也不知道数据库的字段是什么,所以我们可以怎么办呢?那些不知情的说这里那里都可以查数,你查的那些数跟我们要的那些数是一回事吗?大概看上去差不多跟用起来有没有差距完全是两回事。除了Excel也查询不了数据库,快捷得到汇总数据以外,另外一个非常作死的还有一期系统挂了VPN,二期系统不挂VPN,首先是没有买这个模块,因为觉得它不安全,你不挂VPN,我怎么个工作呢?一年下来有那么多个周末,有那么多的节假日,但是你作业全从来都不停,算数的统计只有一个。还有一个就是你的作业从早上8点干到第二天凌晨4点。通常我是从早上8点干到晚上11点,365天每天都早8到晚11,我如果你算我加班费的话,我去劳动局一定可以把你告倒。在这种情况下,一直把人安排在这个单位的工位上根本毫无理由。开发系统的目的就是为了可以便捷。既然你开发了基于windows的,也开发了基于安卓的。安卓你就为了移动办公,难道说拿着个智能手机在外面你访问不了系统了?所以既然手机可以访问,为什么电脑就不允许这个操作呢?然后那个傻乎乎的中层说那就加班呗,你有给过我一分钱加班费?中层傻乎乎的第二个方案开向日葵?我的电脑24小时开着向日葵,如果我要远程访问,我只能设定一个很复杂的密码,但你怎么保证那个复杂的密码不被攻破呢?如果我办公室的电脑被攻破了,你的系统能保住?所以这个所谓的系统不能远程访问,简直就是一个不可理喻的傻逼行为。

那些脑子从来没有思考到位的说现在的查询大概能满足我的需求,但是我回去一对比就发现。的确看上去大部分差不多就那样了,但关键是有些字段是不对的,有些字段信息是缺失的。简单来说就是那个饼你不可能直接就这么吃了,不进行一系列的加工,根本没办法和我之前的数据匹配起来。类似差不多的还能转换,信息缺失的无解。

那个该死的会是下午15点开的,离下班只剩下不到两个小时,开完那个会离下班时间更加只剩下一个小时。从零开始,研究那些我明知不可能满足我需求的导出明细,然后再必须花少于一天的时间开发出尽可能适合我的版本。当然这个开发完全又是我自己折腾VBA,没人能帮我。除了我以外,其他人也有这个需求。所以除了我自己的版本以外,我还得帮忙折腾出其他人需要的版本。这些傻逼事情其实根本不应该堆积在24小时之内完成。既然你觉得换系统底线是2025-11-13,那么你得提前一周或者半个月通知人家要这么干,然后我们该准备的准备,发现问题你就得整改,整改完毕以后我们才开玩。

现在破烂到极点的东西被迫上线,我只能用恶心到极点来形容这件事。

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