阅读视图

发现新文章,点击刷新页面。

手贱惹的祸

当年今日

VBA可以对普通的Excel文件用SQL查询,虽然我已经用的是超级表,理论上单元格的数据格式是一致的,但实际上这不是一个标准化的数据库,我没有办法在一开始的时候就对每个数据进行声明,所以在数据处理过程中就会出现这样那样说不准为什么的事情。

星期一的下午我跟往常一样做了些普通操作,最后当我用VBA生成一个汇总数据的时候发现弹出一个“标准表达式中数据类型不匹配”的警告。看到这个东西,我的第一反应是肯定是获取的数据里面有一些不规范的东西,比如说某一列通常是数字的,但是却出现了文字,但实际上我翻查了全部源数据都没有发现这个玩意。没办法之下,我只能做一个脚手架,一个一个的去排除,最后发现问题出在where里。where里有一个“性质某某某”的限定条件,问题就出现在那个地方,只要把这一句删掉,VBA是可以正常运行的,至于结果对不对不知道,反正能运行,然后我又回到了这一条的上一条结果,发现where里面的那个条件是没有问题的,所以这到底是什么问题呢?

然后我又想起,在进行普通操作的时候,我好像在某列数值的单元格里发现了一个汉字,说不准为什么那里会有一个汉字,但一个汉字足以影响那个单元格的类型。为什么我深有这种体会,因为如果某一列全部都是数字那么 VBA+ADO+SQL通常都会默认那是一个数值,但只要那一列里面有一个文字,所有东西都会被识别为文本。对数字进行聚合是理所当然没有问题的,但如果对文本进行这种操作,我不敢想象会出现什么东西。当然了,把文本作为分组条件,一点问题都不会有。

我感觉自己的VBA程序是健壮的,因为我已经用了他一年多了,之前从来没有出现过这种问题。有段时间经常会出现这样那样说不准什么问题的问题,但是过了一段时间之后,那些问题又自动消失了,所以我更相信那是有段时间windows更新导致某些框架不稳定导致了那段时间的意外。除非我对源数据做了更改,又或者是出现了某些意外,否则不会报这样的错误。

接着我又记起周一下午某个基本操作的时候,我好像发现在那个超级表的下面有一个“她”字。那个东西在不连续的单元格里,不是超级表的一部分,但关键是如果我用SQL获取数据,那肯定也会被纳入其中。看到那个莫名其妙的“她”字以后我已经把那删掉了,所以我看到的那个原始数据表格没有问题,但只是看上去没有问题。

折腾了好长时间未果,之后,我不得不重新翻出前一天晚上的源数据。然后手动把周一更新过的东西全部都贴回去。再去用VBA汇总,一切正常。在贴回去之前我首先用VBA测试了一下汇总没有问题,然后我才开始贴,贴了之后也没有问题。如果这个东西没有问题,也就是周一之前这个表格是没有问题的,但不知道周一进行了什么操作,导致了问题的出现。倒退以后重新贴数据没有问题,的确这个汇总也算保住了,但是我却一直放心不下,找不出问题的原因下一次依然会手忙脚乱。

吃过晚饭后我重新翻出有有问题的那个源数据。我的猜测是,因为数值列里面出现了一个文本,虽然我已经把文本删掉了,但是那个文本已经影响了那列单元格的类型,最终导致VBA弹出错误提示,虽然那个错误提示并不是出现在VBA调试发现的那一列。我的做法是在不修改VBA的前提下,把有问题源数据超级表下面的所有行全部删除,然后保存,再次运行vba,源数据通过了,可以正常运行。通过这样的操作,就能排除错误,非常有可能意味着我上面的猜测是对的。然后,我故意在数据列超级表外的单元格写一个字,然后保存,VBA汇总挂了。我把那个字删除,保存,VBA依然挂。但是当我把写过字的那一行删除,VBA汇总好了。这再一次验证了我的猜想。

这种事情该如何避免呢?首先不要手误,不要乱填。手误乱填这种事过去那么多年都从来没有发生过,为什么就发生了呢?到底是我的问题,还是另外一个人的问题?如果要避免这个事情,最好我在SQL引用源数据的时候就直接就限定为超级表范围,而不要把超级表所在的所有列都含进去。无论是哪一点,都是可以实现的。限定超级表的范围不太难,但关键是人手贱的这个行为,这一次出现在某个不知道为什么的单元格,下一次如果覆盖掉超级表的一个老数据呢?要避免这种人的失误非常难,但是人为什么会犯这种弱智到极点的失误呢?而且是犯了还毫不知情。

但总算这一次,我找出了可能的原因。

不完整的错

当年今日

上一篇说到了数据汇总的问题。这个周一我就是按照上周五设定的那个步骤去做。在做的过程中,几乎没有发现什么问题,但是当我做完所有,一个个表格验证的时候却发现不知道为什么有些表格 SQL抓取的数据不完整,VBA从原始表格筛选、抓取的数据没有问题,但关键是SQL从本地的文件里提取到的那些数据不完成。第一次发现这个问题的时候,我看到的是为什么汇总数不一致。当我把SQL回退到第1步的时候发现第1步获取的数据就已经不完整。明明有50行数据,实际上只能提取到42行,重复多次依然是那个效果,但是偶然当我把文件关掉重开以后又好了。所以这个有时发生,有时不发生,到底是什么情况呢?当我打开VBA文件,一个一个测试的时候,发现前几个还好,后面就会出状况,可能是数据不完整,也可能是弹出一些莫名其妙的错误,但只要你把所有Excel都关掉,再重新打开又没有问题了,但是在测试几个以后,又会出现这样这样那样的状况。用VBA+ADO+SQL整理输出数据我已经实施过很多遍,之前从来没有遇到过这种神奇的状况。最后当我打开VBA脚本,无意之间拉到最后,居然发现cnn没有close,也没有初始化。cnn是个非常牛逼的东西,但是那个玩意也要耗费巨大的资源,在我出现数据状况的时候,我没有观察过我电脑的性能到底如何了,会不会CPU或者内存甚至二者都有点状况了。因为一次又一次的验证数据就意味着我得一次又一次调用cnn,光是打开又不关闭,最后就会出现奇奇怪怪的事情。当我把所有脚本都加上了结尾以后。从头到尾10个表以上的数据,一次性搞完,期间不会出现状况,所以多么神经质的行为才会导致了这种弱智事情呢?以前我倒真的从未试过这样。有过这样的经历以后就让我明白到cnn打开和关闭都必须是一个闭环,在一个宏里就得实现到位。如果某个宏被卡住了,半路停在那里,估计那个cnn是不正常的,当我又再次启动其它,只会让错误不断积累,最终导致崩溃,又或者是得不到我想要的东西。

写程序可以很快,但是调试却非常耗时间。这大概是所有码农都必须面对的事情,但实际上更多的人只顾写,只顾实现,而不考虑全盘,不尽可能地用全面数据测试,最终的结果就是使用的时候出现各种各样的未知情况。我不知道其他人到底是如何调试的,反正我真觉得调试的过程比写脚本更费神,因为要考虑所有的情况,哪怕某些条件可能非常极端,几乎不会碰到,但即便那样,一个健壮的程序应该依然能捕捉到那个错误,然后给出对应的反馈。比如我抓取不到数据了,我就应该弹框告诉人家我抓不到,因为有些操作的抓取数据以后才能进行,所以既然能判断抓不到数据,后面的也就不用继续了。

调试程序是一个很磨人的过程,这个过程重复多了,人自然而然就会向完美靠拢,即便我们一定不能成为完美的那个。

错误的时间错误的地点

当年今日

星期天的晚上,跟往常一样,吃过晚饭我就回单位了。跟平时有区别的地方在于在我即将出门的时候开始下雨,天气预报说雨还会下得不小,但实际上我的运气还不是太糟糕,起码一路上虽然有下雨,但不算很大。下雨好像没有影响20路车来得非常不准时,虽然跟平时相比晚了几分钟,过猎德大桥的时候车速缓慢,估计在桥上等了好几个灯才终于通过,但起码下了猎得大桥以后那个红绿灯没有等太久。搭上地铁的时候大概是18点,所以出了地铁之后,我还可以悠闲地先上个厕所,然后再去转618。

当我去黄埔新港公交站坐618的时候,出现了个屌丝情况。那段路不知道为什么,反正就是被围蔽了起来,不知道到底要干些什么,如果要干这种事,起码要把公交站牌挪到围蔽外面,还有一个是起码地铁站的另外一头围蔽之外的地方,得留个口,给人走出去,但实际上没有任何指示。

到上面为止,一切情况,虽然有些意外,但还不算太糟糕。当我坐上了618,车开动了以后,我接到了个电话。跟我说起了上周五上午要我提供的某些数据。那是巡视组要求的数据,在我印象之中,那个数据的提交时间应该是周日的晚上18点还是20点,我接到那个电话的时候已经是周日晚上接近19点。首先是一个省储跟商品粮的数据,很容易就能说得清到底该怎么分开,但另外一个中转代储的数据,是一个扯半天都扯不清的问题,从合同上来说,没有一个数据应该属于代储,但实际上我们的人又总是默认那是代储。所以那个表应该填写什么数据上去呢?填表的时候没有任何的说明。填表的那些数据都是汇总数据,明细数据都有,但是要以什么方式汇总,是不是所有数据都得体现在上面?这是一个很诡异的表。我周五中午就得走,周五上午接近11点半的时候,那个表才出现在我眼前。我以我理解的方式把表也填完了,但以防万一我也把明细表发给了单位同事,以防他们有什么特殊要求,还能从那个表里面获取数据,重新填写。这种事情我是有准备的,但关键是在周日晚上19点之前,没有任何一个人找过我。电话打过来的时候,我就觉得隐隐不妥,因为对方问我在家里还是在单位,然后我回答说是我在回单位的路上,这就意味着,可能对方是要我提供某些数据,但关键是我这样一个状态意味着这很难实现。即便我在路上,我依然能找到原始数据,支撑她填写那个表,但关键是你要我得出明细数据的汇总数据,我实在没办法。先是一个人找我,然后第二个人也找我,你叫我怎么更新那个数据呢?我在路上一点办法都没有,没有电脑,我的手上只有一台手机,我尝试过用手机进行数据的汇总。但关键是Microsoft 365更新了以后,我一直没打开,没有登录,密码我不记得,我得去浏览器里找一下,但显然我手机的浏览器也不会保存我的密码,所以要登录Microsoft 365是不可能的,登录不了也就意味着那个文件打不开。小米手机默认的Excel文件打开方式是小米的文件管理,那个东西只能筛选,只能查看,如果要得到汇总数,就得使用编辑功能,编辑功能需要下载完整的WPS。我也不知道我到底进行了什么设置,反正在流量的情况之下我是没办法完成APP下载的,所以这意味着我即便手机上已经得到了明细数据,但我依然没办法把它汇总出来。

时间很紧迫,正常情况之下,20点之前我能回到单位,但是下雨的情况真的很难说,所以我也就只能让两个有明细数据的人得出一个结果,然后对碰出大概就是那个数了。

人算不如天算,到达滨江左岸的时候,是19点32,但我要等的那台611据说还有19分钟才到,结果是在接近20点的时候,611才到达滨江左岸。当我回到单位打开电脑,已经接近20点20了。

这么焦虑的事情到底是如何造成的呢?星期五上午就已经报出的数,我们单位是什么时候把那个交给上级单位的的呢?上级单位又是什么时候才发现数据不对劲?所有的这些东西,直到他们最终把数据提交前的一个小时才找到提供数据的那个人。这样的工作方式,实在让我觉得不可思议。另外一个问题是,虽然我手机可以打开Excel文件,但关键是那个APP能不能脱机使用?能不能在关键的时候用起来?这是我之前一直没有留意过的,因为绝大多数情况之下,别人都只是要我提供文件,而不需要我在手机上做核对,毕竟如果我把文件给他了,数据他自己搞就可以。

这是工作上的事,但完全发生在错误的时间错误的地点。

❌