2023-11
9

隐藏属性

By xrspook @ 8:30:41 归类于: 烂日记

又是一个下班之后继续干,干到直接忘记写blog。如果不是这么着迷的话,理论上我会先烧水,把麦片泡着,然后打开语记开始口述blog,接着开吃,但如果我过于着迷,泡麦片的时候我会在那里写代码,吃麦片的时候也在那里写代码,吃完麦片以后往杯子里加水,等待水凉的时候继续写代码。可能那杯水我得花好几十分钟才喝完(一边喝一边写代码),也可能等我喝完的时候已经过去了一两个小时,又或者是我根本就不记得喝了。之所以要加一杯水,因为本来吃完麦片就得喝水,如果我不马上洗杯子,东西干在那里很不好洗,如果有水泡着就会容易些。所有习惯,只要遇上着迷于写代码这种事,全部都会变成渣渣,除了显示屏上的东西,身边的一切我都完全没办法放任何的注意力,除非是内急之类。写代码这种事对我来说通常是一发不可收拾的,完全停不下来,所以我没办法预测我得花多少时间,我知道我的目标是什么,但开始的时候通常我不知道具体该怎么做,就更加不好说得耗多久。之所以会这样,因为写代码不是我的强制工作,我不靠那个赚钱,没人要求我必须得那么干,纯粹出于个人喜欢。

光是写出来还不行,当我觉得效率很低的时候我会不断地在那里挣扎,到底有没有其它方法呢?还有没有其它的途径实现这种功能?

遇到问题,光在那里想,是不会有结果的,但只要干,埋头苦干,方法就会自己涌出来。大概是几天前,我不知道在哪里见过意思差不多的话,对我来说,写代码的时候会这样。如果我用的是python,因为我的目标很简单,所以绝大多数情况下都有现成的解决方案,只是那个方案是不是高效,能不能再提高一点而已。但如果我用的VBA+ADO+SQL,情况就很不一样的,因为VBA里的SQL被严重阉割,虽然理论上没什么东西是SQL解决不了,解决不了就输出到VBA的数组继续解决。我第一个接触的代码是CSS,然后是HTML。有段时间我迷恋于花俏的网页特效,有些联合CSS+HTML能实现,但有些不得不用javascript。当年我无数次想开始学习javascript,但一直都没开始。后来,我的大学课程里有C语言,我还考了二级C语言的等级证书。上机是满分通过的,但笔试70不到,所以我那张证书上只是合格而不是优秀。如果能重来,我会做到优秀的。但实际上,优秀不优秀又有什么意义呢,招聘的时候那不过是别人一扫而过的一张纸,甚至不会在别人脑子里留下任何记忆,但为了“优秀”那两个字我就得在上面付出很多,因为考证的考试范围大于大学课程的教学范围。

从我开始接触互联网,我的各种兴趣就没有停止过,写代码这事也一直贯穿其中,CSS、HTML、C语言、php、python、R语言、DAX、M语言、VBA、SQL,其实我也尝试过java,因为那是安卓的基础,或许还有一些我漏了没列出来。或许,码农是我天生的隐藏属性。

2023-09
1

小心很失望

By xrspook @ 11:03:32 归类于: 烂日记

当我正在潜心研究VBA+ADO+SQL的时候,某一天当我去搜索某个问题的解决方案,发现Excel里将要内置python了。那这个到底是什么样的python呢?星期四的晚上我看到ExcelHome的专业人士进行了进一步的解释。他们的专业人士说的东西,我还是比较认可的。

当我第一次听说Excel里面终于可以用python的时候,我并不太兴奋。为什么会这么说呢?因为是在Excel的某个地方写python,而不是在一个完备的IDE里写。这有什么问题呢?

可以这么说,Excel所有写代码的地方都让人挺不愉快。比如你要写公式,经常的情况是你选了那个,一会车,然后就没有了。如果你要写嵌套的公式,那些括号更加是会把你搞死。写公式的那个地方,你很难分得清全角和半角标点符号,于是你经常被卡在那个地方,然后被卡没了才发现自己在打勾之前没有先复制粘贴到其他地方,所以打那一大堆全部白费了。

在其它编辑器里也很郁闷。PQ有高级编辑器,高级编辑器好像要比公式智能一点点,但是又过于智能了,比如经常会帮助你自动添加一些符号,有可能是双引号,更多时候是逗号或者括号,但那并不是你想要的,你自己会把那补全。在你不知情的情况下,PQ给你添加上去以后,最终就报错了,翻找一大堆后才发现,那里不知道为什么多了一个符号。

PP里面写公式,如果是写度量值,情况还会好一点,因为你可以先做一个公式的校验,校验失败起码就意味着你基本上不用确定提交了,但是校验的时候到底是哪里不对,为什么不对呢?这得凭借你的经验。如果你进入到PP里面,在那个类似于Excel写公式的那个地方写代码,经常遇到的情况是你还没写完,就直接给你报错。因为报错了,你被卡住了,所以还真的漏了一些东西,结果当然是无果了。

相对于PQ和PP来说,VBA算是Excel里面可以写代码比较完善的地方。在VBA里有标识符和关键字,而且可以设置不一样的颜色,但问题是VBA那个编辑器除了会帮你增加空格以外,你别想能帮你进行任何的补全。无论函数名称还是那些你之前已经定义过的变量。被大家吐槽的最多的是一句判断没写完,要到其它地方复制东西,马上弹窗告诉你语法错误。当你运行不通过的时候,会有各种各样的弹窗,但绝大多数情况之下提示都没什么意义,因为没有针对性,你不知道该怎么改。

综上所述,在现有的Excel里面写代码,除非你非常牛逼,一写就对,万一你是那种粗心大意到极点的人,在Excel里写代码会让你非常崩溃。那个大家期待已久的python,据专业人士说,输入的方式是盲打。你别想Excel会给你补全,会给你提示任何错误。而且那个python in Excel是云上的东西,所以你的电脑上可以完全不安装python,数据通过网络云计算然后再返回结果。这就意味着算力最大的障碍就是你和服务器之间到底有多通畅?VBA完全可以脱机使用,那就意味着可以秒杀出结果,但如果我用的是python,需要实现同样的功能,我跟云服务器那边用有几万光年的代沟,甚至根本连不上,那么python那个地方永远都会显示#BUSY#,永远都不会有结果。如果一直挂在那里,或者某一时刻终于连上了,就会把结果反馈回来。我从来不太相信微软的服务器,因为从windows或者office软件系列的更新就可以看出,我们跟微软的服务器有非常深的代沟。现在这个刚刚有了雏形的python,居然是暂时只能用云计算,这样的东西能让人有多少期待呢?如果你不是在中国,如果你在美国,你是一个Microsoft 365的付费用户,而且是专业版的。可能会好很多,但是,我们在中国,我只能说希望越大失望越大。

我还是用好手头上的工具,实现我的小目标好了。

2023-08
14

如果直接在python里录入……

By xrspook @ 10:35:55 归类于: 烂日记

见识过VBA+ADO+SQL的威力以后,我马上觉得估计后好长时间我都会用这个了,虽然相对于python来说真的各种不顺手,但是出来的那种效果和效率实在让人着迷,尤其是如果我需要关联更多表格。

VBA跟python相比,我觉得最明显的区别在于打开一个VBA查询Excel文件,我就可以直接在那里设定参数,然后点一个按钮就可以查询,但如果那是python,我还得先打开Excel文件设定数据,关闭文件,然后运行python。当然,实际上在VBA之前我也有考虑过把参数设置这一条在python里解决。这就意味着我得先设定一些预制参数,然后进行一些判断循环,接着把那个参数固定下来,最后继续进行之前我已经在做的事情。说白了就是把参数设定在文件里面的那些东西变成纯粹通过python输入框完成。这实际上也没有什么很大的问题。

python参数录入到底要依据一个怎么样的程序呢?还有就是我怎么判断输入的那些东西的格式一定符合我参数的要求。首先我想的是应该怎么输入,接下来是可能输入的时候有手误。我想到了以前手机话费充值的时候会如果是什么业务就按什么数字,按完这些数字键以后,再按什么井号键结束。我可以把需要录入的参数分别设定不同的数字。每次输入完毕以后就把所有参数打印出来,然后再次询问到底是要继续修改参数还是结束。如果继续修改参数,就继续按某个某些数字,如果结束就按某些特殊的字符。就逻辑来说,如果一次只修改一个参数的话,出错的概率会低一点,但如果说比较省事,理论上应该可以允许批量输入,参数与参数之间以某些约定的符号分开,但是如果我是批量输入参数的话,我怎么确定到底对应的是什么参数呢?还有一个就是参数之间的分隔符也是一个关注的点。中文输入法和英文输入法默认的全角和半角符号是不一样的。要输入者标准地输入那些分隔符,显然也是一个不太容易的事情。如果出错的几率很高,那么这个输入就是一个非常寂寞的行为了。折腾这么一大轮,好处就是在运行拜访之前,不需要先打开Excel文件输入,但是python的这个参数输入相对于直接在Excel文件里面输入又非常麻烦。所以这个先不打开文件,到底是简化程序了还是纯粹是在用python秀肌肉呢?这个秀肌肉我也说不准到底是肌肉还是骨头。简单来说就是把简单的事情复杂化了。当然,如果python能实现一个直接弹出一个参数窗口,你要修改你就修改,不修改就保留原值,这个就比较合理,但好像暂时为止我都没听说过可以这么干。

从编程者的角度考虑,现在已经能实现功能,但是从使用者的角度考虑,或许我还可以更进一步。

2023-08
13

VBA跨表查询优化

By xrspook @ 10:27:49 归类于: 烂日记

第一次加VBA+ADO+SQL里跨表查询到一个表之后,发现运行时间只需要0.12秒。那个时候我就觉得如果我要完成之前已经在PQ、PP和python的那个方案,在VBA里估计只需要很短的时间,有可能是一秒以内实现,但最长时间我感觉不会超过三秒。之所以有这种感觉是因为之前我用VBA的时候,如果我使用的是数组,使用的是数据最后一次性的打印出来,中间不显示,通常运行时间不会超过一秒。如果我不是用数组操作,而是在折腾单元格,比如做一些打印格式的转换,时间可能会长一点。那个时间的长短跟我电脑正在处理的任务多少有关,如果电脑比较空闲,时间会很短,但如果电脑正在运行其他的东西,比如FireFox里打开了N个网页,那么这个运行时间可能会长一点,甚至会超出我的想象。最终,当我把整个之前的那跨表查询方案在VBA里实现的时候,我办公室的那台电脑大概需要1.3秒。这个1.3秒是不确定的,有时可能需要1.4甚至1.5秒,但是也有可能1.2秒就可以。

当我在进行了一些数据的优化,比如当那个字典完全赋值给数组以后,就把字典关掉,又或者是减少一些变量,比如在我用SQL进行查询的时候,因为有些步骤太长,我的脑子又转不过来,所以我一个步骤跨了好多段。多段实际上是一路到底,后面不需要引用步骤中的数据,在写下一段的时候,我就不再定义一个新的变量,而直接沿用上一个变量名。连续三段,都是为了得出最后一个答案,在我优化之前,每一段我都会用一个新的变量名。仅仅是在使用完字典以后就把它关闭掉这个操作就让我的运行时间马上提升了0.2秒。我不知道为什么,效果居然如此明显,字典是个非常高效的东西,但原来之所以这么高效,非常有可能是因为它占用了资源。虽然释放字典这个操作基本上是在整个程序的最后部分,但依然能明显提速。当我慢慢地研究一行又一行的合并变量名以后。整个程序的运行时间有可能在一秒之内。通常是1.1秒,如果我同一个时间刷新多次的话,非常有可能会出现0.9秒。但就使用而言,你怎么可能就为了那个0.9秒,把它刷多次呢。因为刷新多次,实际上也花了好几秒,这是完全没有意义的。写这个VBA就是为了让你打开文件,输入相关参数以后进行查询,一次能查到的那个时间才是意义所在。PQ输入参数,点击刷新,第1次的刷新时间肯定是最长的,在成功的刷了第1次以后,继续刷,时间你会觉得明显缩短。所以的确最后这个VBA文件有可能在我的同一台电脑上刷出0.9秒,但在我的能力范围之内,我顶多能改到在那台电脑上首次刷新小于1.1秒。

运行效率这个东西在不同的电脑上效果是不一样的,在我做python方案的时候,我就已经明显感觉到了。python方案的运行时间大概6秒。在我家的电脑上大概需要7-8秒,在我那个不插电源的笔记本电脑上需要10秒。这个让我挺惊讶,因为笔记本电脑购买的时间比我家台式机组装的时间晚起码5年以上。之前我就试过,在笔记本电脑上插电和不插电压片,结果发现插电的时候性能会明显飙上去,CPU的使用率会飙起来。据我观察,在python方案的时候,CPU的使用程度要比内存大,运行PQ的时候刚好反过来。所以电脑的CPU越好,python方案的运行时间会越短。宿舍那台神舟miniPC5的运行时间大概跟我家里的电脑差不多。VBA的方案我没有在宿舍的电脑测试过,也没在笔记本电脑上测试过,但家里的那台电脑,我感觉运行时间有点不稳定,有可能会超过两秒,但有可能会是1.3秒。为什么会这么不稳定呢?VBA的那个脚本,我同事的运行时间通常能在一秒以内,曾经试过0.8秒,她办公室的电脑购买时间大概比我的晚两年。就我俩办公室的电脑来说,差距大概是0.1秒。对运行时间得大概6秒左右的python来说,她只需要5秒多一点。

运行一个跨表查询,VBA+ADO+SQL这套方案就只需要一秒,其实已经很快了。如果我把那个VBA根据输出表格的类型拆分为两个,我觉得运行时间能进一步的提升。毕竟其实输出的4个表格通常不会一起用到,但是如果现在需要一秒,单独一个也需要0.6秒,我为什么要做这个拆分呢?

接下来我会继续研究一下还能怎么改进,研究完以后再把这个发给专业同事,询问一下改进意见。

2023-08
4

又绕到了VBA

By xrspook @ 8:37:44 归类于: 烂日记

习惯了用VSCode写python以后回到VBA,感觉怎么整怎么都不对。首先相对于python来说,VBA的编写规则好像有点八股,因为那些专有名字总是老长。有一些让我想不明白的是某些东西为什么就不能先存储在某个地方,往后在别的地方调用?比如复制,理论上是很简单的事情,就只是从这里到那里而已。在python里,你喜欢怎么整就怎么整,但实际上你要用VBA控制Excel,做一个复制,远远没有你想象中的那么简单。对python来说,数据是没有格式的,没办法决定这一串数字到底是什么颜色、什么字体、大小、背景是什么,但是Excel的单元格有这些东西,你要复制一堆单元格到别的地方他默认就会把所有格式都带上,但实际上你不过想贴一个纯粹的文本或者数字而已。因为这样你还得在复制粘贴的时候用上其它东西去强调说明,而一旦有这个强调的操作,这就是一个特殊的复制粘贴。复制英文是copy,如果你直接把一堆单元格copy到另外一堆单元格,就会把所有格式都一起带过去,如果你不想干这种事你只想要数据本身,你就得把你原来的那部分单元格select,然后对select的部分做copy,最后在其它需要粘贴的地方再用特殊的粘贴方式。所有人都觉得最直观的方式点copy,当你要实现最纯粹粘贴的时候却无法做到。

copy本身很简单,是我们理解的很简单,但是对Excel的设计者、对VBA所控制的东西来说,copy实际上一点都不简单。昨天有段时间我曾经想过,能不能在某个单据格式改造的时候直接在VBA里做分组,然后得出汇总。但是我又非常明白,VBA本身是没有类似pandas的那种dataframe的东西。PQ和PP都有类似dataframe的东西,所以你不需要很努力一个一个数据去处理,不需要考虑其中的数组,你只需要操控好行和列的盘曲折叠就可以了。但是在VBA里,效率最高的一定是数组,数组没办法给你判别行还是列。在增加数据的情况下,你还不能在行业里增加,你必须把行列转置,然后在列那里增加,最后再把它转回行,这个东西很绕。虽然行列转制这种东西在pandas跟PQ里都有,但是在增加行或者增加列的时候,远远没有VBA的数组那么绕,于是你就可以花更多的时间去考虑我到底要怎么折腾那些东西,而不是在数那些东西到底有多少行多少列,我要增加什么,该如何插入、得插入多少。

C语言考试的时候我也是这么被C语言的指针搞得迷迷糊糊。如果我可以把C语言的指针玩得很溜,可能我对VBA的数组操作就不会有太多槽点了。可以肯定的是,当年的我跟现在的我对数组操作都比较畏惧……

因为不想用VBA去加工数据,所以我临时干的是用PQ做汇总数据,然后用VBA把得出来的数据精确地按照需要的格式生成文件。虽然实际上这样不过是点一下变成多点几下而已,但我觉得如果我能在VBA层面就完成了汇总,我就不需要 PQ运行的那几秒钟。我抠门的不是鼠标多点几下,而是刷新PQ那几秒钟,所以我还会在VBA上努力的。

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