2023-08
22

继续沉迷

By xrspook @ 9:12:09 归类于: 烂日记

星期天的晚上,我觉得自己睡了个寂寞。本来就很晚才去睡觉,再加上睡觉之前我正在想某些很烧脑的事情,所以现在躺在床上,我觉得整个晚上我的脑子里都是那些烧脑的玩意。在迷迷糊糊之中睡觉,我也说不准自己到底是清醒的还是睡着的。在睡梦之中我还在为那个睡觉之前折腾的问题烦恼,但醒了以后,我实在不记得睡梦之中我做了什么方案,所以说在其实在睡觉之前真的不应该努力思考,那样的话不仅仅会很久都睡不着,睡着了以后也会很挣扎。但我读书的时候不会这样,话说回来,读书的时候我就从来没有为某些问题主动这么努力过。如果是老师出的某些习题,通常都会有标准的答案。那个时候我们都不会自找麻烦,故意给自己制造难题,又或者说即便在那个时候我们找到了什么问题,你自己解决不了的,我也会主动去找同学或者直接去找老师。退一步说,我们找的那些答案只要到那是某些习题本上或者卷子上的题目,那些东西绝大多数情况之下都有标准答案,所以找到那个标准答案就好了,有可能是配套的答案也有可能是某些教辅的书籍里面有相关类似的解题说明。

现在我做的那些事情,我感觉没有一个标准答案。不同的人会用不同的方式去实现。不仅仅是实现的工具不一样,即便是一致的工具,也会有不同的实现思路。就我自己的实际情况而言,即便只是我一个人,可能今天跟明天的想法也会有区别,即便我把某个VBA脚本写得我自己满意,但说不准过上一段时间我又会有新的想法,觉得某些地方可以做某些改进。之所以这样,是因为首先我还一直在思考。其次,之所以一开始想得不周全,是因为我根本不知道周全应该是怎么样的,很多方法是参照过来的,可能在其它的编程里面是那么个用法,但什么才是最适合在VBA里实现的,又是另外一回事。比如其实VBA通过api是可以调用Excel自己前端函数,但那一定不是VBA最高效的方式。在VBA里,只要你玩好了判断和循环,对高手来说,就能解决几乎所有的问题。数组才是VBA的核心,但是数组不仅仅是一回事。可能是我一开始学VBA的时候并没有意识到原来数组是那么的复杂。因为在我印象之中,C语言的数组不是这样的。

VBA里的数组千变万化,虽然都用数组去命名,但实际定义赋值使用等等完全不一样,又或者是说它们的确有共性,但是它们的特性会让你觉得它们大概都是一回事的人无数次掉坑里,我就是这样的人。当我掉坑里很多次以后,我才发现原来它们是有很多特性的。

要清楚了解我的工具是做什么的。可以怎么用,然后我才能在用的时候得心应手。什么场合应该用什么样的数组,得到了数组以后,我又可以对那进行什么样的改造都是我应该烂熟于心的。

大概一周之前,我跟网友谈起我在VBA里遇到的烦恼的时候,我的网友说了一句,可能你连怎么VBA里调试都不知道。其实调试我是会的,因为如果我完全不懂调试的话,搞循环就是在数组瞎掰,显然除了碰壁就是碰壁。但是我真的没有系统的学习过在VBA里怎么高效调试。既然知道自己弱在哪里,我就得把这个补回来。现在我的调试要比之前高效那么一点点了。

在AI流行的现在,我还靠我自己写VBA,写那个超级八股又非常奇怪的编程语言,在别人看来非常反人类反潮流,但是当你从不大认识到比较熟悉一种编程语言,当你能得心应手轻而易举实现之前你想做到,但是却无法做到的事情的时候,那种成就感是无法言语的。

2023-08
21

见鬼后攒经验

By xrspook @ 16:16:16 归类于: 烂日记

回到家后我依然控制不住自己,要打开Excel的VBA实现各种功能。

前几天说过,我想把一个一维数组输出到Excel的列单元格。发现即便我用了转置,依然无法实现,于是我硬是把那个一维数组变成二维数组,然后不需要转置就可以把那输出到列单元格。这样我就需要在赋值的时候多写一些字,输出到单元格那里时完全按照一维的大小去设定。后来我在某天尝试之中偶然发现普通的数组的确是可以用一个转置输出到列,教程也是这么说的,但是如果那个数组里面有一个空值,就会导致错误。系统就会显示出现“类型不匹配”。到底这个不匹配是个什么东西?我觉得如果这是python,如果这是在VSCode里,问题会被描述得很精确,实际上就是因为我输出的那个一维数组里面有空值。为什么二维数组里面有空值可以随意输出,但一维数组却不行?这是让我觉得非常无语,因为我就是对同样的数据用过一维数组跟二维数组输出,就内容来说,两个没有任何区别,但问题就是VBA这个奇怪的东西,当你把有空值的一维数组输出到列单元格就会出错。一维数组正常输出到行单元格的时候是不会出错的,而列的时候之所以出错,是因为输出到列必须在外层套一个转置。处理掉那个null对我来说很简单,因为我要输出到列的那个数组是从其它数组里赋值过去的,赋值的时候我多一条判断,如果那是空就直接送一对双引号,也就是让那个元素变成空字符串,而不是null就行。这样的话我就可以在一维数组外面套一个转置,然后输出到列单元格。对所有编程语言来说,null都是一个让人觉得很敏感的东西,很难说得清那到底是什么,所以几乎所有编程语言都有个isnull去判断那个东西是不是null。如果你要对某些字段进行运算,一旦在里面遇到null,你的汇总全部会失败。那种风格跟在Excel里面处理器空的单元格,有没有都无所谓完全不一样。

第一次我是在Power Query里遇到null,当时我就觉得很奇怪,为什么明明应该是有数的,但我连加之后汇总列却没有数?后来发现原来被连加的某些列是空的,这样就导致其它列即便有数,最后汇总也是空。所以我就经常做很无聊的事情,如果我要连加,我就先把那些列全部转为0,然后在整个操作结束以后,再把那些0全部转为空。这些看上去很无聊,多此一举的事情如果不干,根本得不到正确的结果。当然,如果我不是在PQ里可视化操作,我完全可以在汇总列那里用条件语句把之前连加的那些列全部都用公式先判断,然后再加。如果所有这些事情都是在高级编辑器里面完成,显然修改汇总列会比较简单,但如果不想敲键盘,直接选定那些可能被连加的列,然后设为0,最后再把那设为空,从鼠标和人的逻辑操作上来说是比较直观的。

我发现如果要在VBA要进行工作簿open的操作,界面会闪,但如果用的是ADO+SQL的查询,完全没有那种感觉,但实际上ADO+SQL是可以进行写入操作的,所以我到底能不能通过那个东西无感新建文件呢?

2023-08
20

USB摄像头又挂了

By xrspook @ 10:57:21 归类于: 烂日记

到此为止,我试过四次给自己剪头发,只用三次在家里。第三第四次我都用上了谷客队HD98 1080P摄像头。但就是在第四次剪头发的时候,好不容易我终于剪完后面,当我要换个角度剪侧面的时候,一个踉跄,卡了一下,直接让我扯了那个摄像头的USB线并踩了一脚。接着我就发现笔记本里摄像头的画面直接停留在扯淡那里。当我拔掉USB再插回去以后。电脑可以识别到有USB摄像头,但是屏幕一片漆黑。也就是说这一个踉跄直接毁掉了我的这个摄像头。这个谷客摄像头的购买是有一段风波的,我先是在闲鱼上买,收货后发现全部都是马赛克,接着我就在淘宝上又买了一个,但闲鱼那个是1080P的,淘宝上那个新的是720P的。720P收货发现没有问题。当我即将要回家,在那之前打算把1080P的丢掉之前我试了一下,发现。我领了半天以后那个东西可以了,于是我赶紧联系卖家,把款还给他。在第四次剪头发之前,我把720P的带回来单位,家里只剩下1080P。其实把720P带走的时候,我有想过万一这个1080P坏掉了,我还有个720P的做替代。我不知道这种事情是不是根本就不应该去想。因为事实证明,有时候你不去想那个东西就不会发生,但如果一个不小心不知道为什么想了一下,接着就真的应验了。幸好头已经剪完了后面,也就是最需要摄像头的地方。侧面虽然也挺难搞的,但是用镜子大概差不多凑合着也能行。

坏掉的摄像头插到电脑上电脑可以识别出有USB摄像头这个设备,而且电脑说这个设备运转正常,所以说我觉得这意味着这个摄像头的硬件是没有问题的,但有可能USB里面的某条数据线断了。为什么我会有这种猜想呢?因为当我把摄像头插到电脑上,然后掰那条线的时候,曾经试过有两回,摄像头的监视画面从黑色变成了白色,但只有那么一刹那,仅有那么两次,接下来无论我怎么把那个线怎么甩那个摄像头都是黑屏。但我又发现,当我狠狠地折腾那个摄像头的时候。老旧台式机的USB也好像出状况了,因为首先是我那个USB的网卡接收信号变得很差,接着是那个网卡好像直接就不工作了,处于断网的状态。所以我赶紧把那个摄像头拔掉,然后把电脑关机。我不知道是不是我折腾那个摄像头USB线的时候,数据线里面断掉的那个部分又与某些东西短路了。拔掉摄像头以后,我就把台式机给关掉了,所以台式机之后有没有好过来我不知道。我感觉应该没有问题。理论上是没有问题的,因为我试过单位的那台台式机的某个USB口质量实在太糟糕,所以在某一次插进去的时候插不进去,我感觉机子直接就短路了,直接关机。当我把那个U盘拔出来的时候发现那个USB口直接里面某些东西就翘起来了。那一次真的把我吓得够呛的,在断电的情况下我尽量又把那翘起来的金属还原,然后尽可能地让它们完全不会互相触碰,接下来我就直接用胶纸把那个USB口给贴上,再也不能插那个地方。当然了,在贴那个胶纸之前,我还是试过的电脑能开正常运行,什么问题都没有,只是USB口少了两个。如果要保证在移动搬动情况下,那个USB口也不出状况,我感觉最好还是在里面打一些胶。最好当然是硅橡胶,但是没有的话,热熔胶估计也行。但是我还没那么狠真的要那么干。

既然我判断是USB线断了导致摄像头用不了,所以我就把其中一条充电线剪了,然后跟摄像头的线接起来。两条USB线都是黑红白绿。USB充电线红线和黑线特别粗,摄像头的四线没有特别粗特别细的,但从剥线的难易程度来说,红线跟黑线剥得轻松一点,绿线跟白线实在是太难剥了,但是当我把摄像头跟充电线接一起以后,发现无论是白对绿还是绿对白,电脑都再也无法识别到USB摄像头。也就是说,我把摄像头的USB线剪断再接上这个操作宣告失败。

这个波折的摄像头,我得拿回单位用万用表测一下原装的USB口和充电线的USB口。确定那4根线的接口位置完全一致。如果那两根USB口的线任何一根或者全部两根都没办法在线头和金属口那边连通,就意味着我这是在瞎折腾,再换一条USB线连摄像头估计就可以了。

一个USB摄像头,怎么会这么的纠结

2023-08
19

活过来了

By xrspook @ 10:15:14 归类于: 烂日记

昨天说到,我遇到了码农的蓝调,吐槽了那么一番以后,我感觉好些了。之前觉得过不去的那些坎直接忽略掉一些,然后把重心放在另外一些上面,好像我又可以继续开展下去了。周四晚上没做运动,在办公室待到10点多才回宿舍。有单位作业的原因,也有我在纠结SQL的原因。埋怨不能解决问题,除非我不想用这个工具继续干下去,否则我就得想出对策。

常言道,退一步海阔天空。当我在那些点上没办法继续下去的时候,我往后退了一步,从整体上思考我为什么要做?我要做到一个什么效果?其实一开始的时候我并没有很具体的目标,有很多东西我想实现,而且我也知道我应该可以实现,所以杂乱无章的东西,应该从哪里开始?当我折腾了好几天以后我发现在已经做出来基本成熟的东西其实是雷同的。主体思路可以这么说是完全一样的,但是具体实施有一点点条件上的区别。它们的整体思路都是先设定一个日期范围,然后计算出期初库存、期间变化以及期末库存,最后把这三个东西拼起来,从整体上说就是这么简单。这其中主要区别是分组的条件。到底要分组多少个因素?在没有很仔细考虑这个问题的时候,你会觉得这些因素可以随意组合,但实际上把它们随意组合出来的那个效果到底你有没有其实不用的呢?还记得在我做这个之前我就研究过别人怎么把小计合计总计这种东西放在最后。结果原来是它们增加了一些排序的列。明细是1汇总之2,排序的时候先排这个,后面的再继续,这样就保证了汇总一定在最后。当时我不明白为什么那个人要把那个字段叫做排序A。当我自己实操过以后就明白到,因为排序估计是一个系统关键词不能直接用。之所以是A,因为非常有可能还会有B和C。如果你的那个表有小计合计和总计,就得有排序ABC。这样再组合其它的分组条件,你才能最终能让这三个汇总在它们应该有的地方,而不是乱糟糟的随意出现。当然了,之所以有三重的汇总,肯定是因为里面的条件列至少有三个。从技术上,的确能生成这样的表格,但实际上从使用角度考虑其实挺麻烦的,要一层一层选虽然关键词很明显,你把那些“计”选上了,那就是汇总的,你不选那些“计”全部都是明细。当我终于学会了这种明细汇总合并,学会了让它们正确排列以后,我反倒在纠结,乱糟糟一团东西真的很碍眼,当你要找自己想要的,反而得费点眼睛。当我有那个疑惑的时候,我上了个洗手间,蹲在坑上的时候我突然想到,如果我用VBA生成一个明细,然后我那些”计”就不用那么费劲。想生成就生成,不想生成就不用管他。要汇总还是要明细,任君选择。但我马上也明白到。因为现在我那个表格实际上是一个二维表,计算字段挺多,要把它们一个一个拉透视表值那里显然挺费手,而且一般的数据透视表没办法完成字符串拼接。最重要的是我花那么多时间,实际上只是通过一些参数去查询一个大表,最终我得根据查询出来的那些结果还去做数据透视表,我为什么不直接对数据源进行这个操作呢?想到这一点,你会觉得之前的努力好像全部都没有意义了。

然后我又马上明白到,要在一个普通数据透视表上面体现期初库存、变化数和期末库存(横向)是不可能。但是通过这种VBA的高度定制,我可以实现。所以我花时间做这种定制的目标就是能一目了然展示一些我经常想知道,但是以前我只能通过东拼西凑折腾一番才收集得到的信息。这样的好处除了方便以外,还有就是如果这种制作流程完全符合事实,我根本不用担心某一次自己手贱制造错误。要让这种费时费力的定制有意义,首先我得非常明确自己到底要的是什么,而不是一边做一边突然想到好像雷同的我也能做一做。

周四晚上退一步的时候,我还真想清楚了自己到底要的是什么。

2023-08
18

蓝调了

By xrspook @ 8:24:16 归类于: 烂日记

周四的傍晚时分,我突然有点码农蓝调的感觉,因为好像无论我怎么整,前面总有无数的奇奇怪怪的问题。这些问题居然没有大路的答案。原因是Excel的SQL已经被阉割到一种没人能说得清的程度了。我就想知道到底Excel里的SQL有什么样的函数,知道有什么函数,知道函数怎用,才能以各种叠加的方式得出我的招数,但问题是人微软自己的手册都没有说清楚到底Excel里的SQL可以怎么个用法?相比之下,Access写清楚了,SQL Server也写清楚了,不同版本的函数不一样,些高版本能轻而易举函数就能实现的功能旧版本也有替代方法。但是Excel里的SQL像一个谜一样。你得不断尝试直到绝望。因为你拿着那个问题去搜索,没有结果,结果都是其它数据库的,虽然都叫做SQL,但差别真的很大。

的确用VBA+ADO+SQL搭配能解决一些小数据的问题,而且速度很快,但为什么微软在这个基础上还要继续整出 Power Query和Power Pivot,因为他们知道在操控数据方面,VBA本身真的有很多限制。当我死磕了一周以后,我发现VBA要死要活折腾半天出来的东西如果在PP里两下就搞定了,而且那还是在可视化的情况之下。至于PP,那是不允许你用不可行的方式去操控的,所以虽然三个都在考验逻辑,但是在Excel的SQL里面,我觉得对我最大的考验是,我明明知道要那么干,我明明知道用其它工具应该怎么干,但是无论如何我在这个Excel VBA里面就干不出来。

我遇到的某些问题,跟SQL没有关系,纯粹是VBA数组的问题。VBA的一元数组,如果要输出的话,它会在一行里输出,但如果你要把这个一维数组在列里面输出,你就得做个转置。我遇到的问题是,即便我已经设定了转制。系统依然说我的类型错误,最后我是怎么干的呢?明明我那个是一维数组就可以实现了,但为了可以顺畅输出,我硬是把那个东西设置为了二维数组,另外一维完全是空的。这样的话在我输出到单元格的时候只给予一列的空间也就是那空的第二维根本不用管他。经过SQL处理生成的记录集,如果要输出到数组,通常是一个二维数组,那个二维数组跟VBA自己的数组又是转置的关系的,那个记录集的数组编码是从0开始的,VBA默认的数组是从1开始的。如果在VBA里把一个字符串打断赋值给数组那又是从0开始的。在python里,默认就是从0开始,什么东西都从0开始了,所以你不需要为长度跟起始数值还有突然间又有个转置之类烦恼。

周四我遇到一个算是逻辑意外的事件。我要筛选某个表里某一字段不包含某个关键词的记录,但问题是那个字段里的东西有关键词也有空,我需要筛选出来的记录是关键词以外的其它字符以及空的。当我where 字段A not like ‘%关键词%’的时候,结果出乎我的意料。因为那个关键词是包含的关系,所以我没有办法精确控制,所以我必须在关键词的前后加上%。这句筛选的结果是字段里所有那个字段的记录都没有被筛选出来。不就是一个包含的关系吗?Excel的SQL里面允许用正则吗?最终我用的方式是在where里面用两句话,一个是not like,筛选到那个字段里没有关键词,但是有其它字符的记录,另外一个是用or的关系搭配一个isnull(字段A),这到底是什么情况呢?如果在其他地方,一个contain之类的东西就能表达出来,如果允许用正着,正则也能很好表示不包含关键词,Excel的SQL到底允许我用什么工具呢?

SQL in Excel这把刀到底应该怎么玩???

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