2023-08
5

用VBA秒变身

By xrspook @ 11:07:04 归类于: 烂日记

说到就做到的,感觉非常的美妙。

前天说到我应该可以在VBA上更进一步,把数据整理以及最基本的汇总通过VBA一步搞定,结果我昨天真这么做到了。前天也说到VBA的copy让我非常的烦恼,但在我印象之中,以前我的烦恼并没有这么明显,之所以这样是因为以前粘贴时我不是直接粘贴单元格的内容,而是先把单元格的内容赋值给数组,然后处理数组,然后再贴回单元格。copy看上去很简单,但是在单元格的层面直接赋值好像无论如何都没有任何效果。把所选区域赋值给数组,相对好理解一些,但是要把数组再贴回单元格,相对于python的解决方案来说,VBA就很不人道了。因为我习惯了用python的方风格,所以回到Excel,之所以贴来贴去贴半天都得不到结果,就是因为我在数组复制内容到单元格的时候并没有设定单元格区域。不设定那个区域,永远都是贴了个寂寞。除非你使用Excel自己的那个方案,那个特殊粘贴的方案。我觉得这挺奇怪,既然我用特殊粘贴的方案可以不选定区域,为什么我直接粘贴数组就必须得这样呢?情况就像数组一开始就得设定好,得多大。当然有些数组是不需要事先设定长度,比如如果那个数组传入的数据是一个被打断的字符串。我不知道为什么被打断的字符串就不需要这么干。VBA数组一旦设定了大小,很难改变的。长度如果一开始长了,但最终你没用那么多,我也知道了最终的长度是多少,今天我的解决方法是先把这个二维的数组转置,在保留原数据的基础上限定最终的长度,然后我再把数组转置回来。之所以这么绕,是因为VBA只允许修改最后一个维度的长度。如果你是一个二维的数组。第1个维度是行,第2个维度是列,所以我的方式是行列转置,再转回来,但如果数组是三维的或者多维的,中间的某些要改,显然就不能这样了,但如果你执意要这么干的话,估计可以再建一个数组,设定好目标长度,通过套叠循环的方式把前一个数组的数据赋值到下一个数组里。但是为什么非得这样干呢?如果要限定数据输出的话,你只要限定数据输出的单元格是你最终的范围就可以了。但实际上,像我这种得到了这个数组之后,还得加工,还得在这个基础上汇总,我的数组就不能有空行。比如这一次我要在得出的数组的基础上再进行一个多条件的单汇总,如果我的数组里面有空行,最终得到的字典将出现一个键的内容为空,键值为0的玩意。我也不想这么折腾但是不这么折腾,真的没法玩,当然了,在输出字典的时候依然可以先做一个判断,让键是空的内容不输出。

字典这个概念,我首先是在学习python的时候了解到的。在学习python字典的时候,我就曾经用字典做过字母或者单词的数量计算。现在,如果我要进行前面我说到的多条件单汇总,我就需要用到字典。

至于在VBA里怎么用字典法实现我的目标,下回分解。

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上努力的。

2023-08
3

又一个跨文件查询

By xrspook @ 23:59:18 归类于: 烂日记

花了两天时间,又做了另外一个PQ的跨文件查询。这一次思路我感觉相对比较简单。某一个大表基本已经满足了所有需求,唯一需要查询的是某个类别的合同号,另外一个类别的合同号在大表里已经有,所以需要做的只是研究该怎么分组。分组这个东西也是个学问。东西一旦分组就可以节省很多,然后你再把大表里面的列删减到你需要的范围,又能节省很多。这些东西节省下来必定意味着效率提高,最后我只把最终的版本输出,其它脚手架查询仅限连接。删除列有两种方式,一个是直接删除,另外一个是在分组的时候直接不理睬,这就意味着分组出来以后那些不被理睬的列被删除了。

一开始之所以想做这个跨文件查询,是因为很早很早以前,准确来说大概是2017年的时候我就考虑过应该用什么方式把客户跟数量,再把同一天的多个客户数量连接起来。这个东西思路简单,但以我当时的知识是没办法做到的。我现在用PQ、PP或者python都可以实现。首先是让客户数量已经称量单位无缝连接,接着是把一天内多个客户数量通过分组结合在一起。我觉得PQ的分组挺奇怪。文本没有给出聚合的方式,但实际上通过生成代码后修改公式,实际上可以把文本聚合,为啥就是不让可视化一步到位呢???同样,明明某些数字是可以用计数的方式表达出来,但是聚合的界面就只有行计数,对某些列来说那又是不可选的,但实际上同样先选择sum或者average生成代码以后,把那个东西改为count就能实现功能,没有任何问题,所以为什么在可视化生成的时候,就是不给我这样的选择呢?分组这个东西本来是很自由很牛逼的,但我估计很多人会被PQ这种阉割的可视化逼退,觉得可能那样做不到。

在这两天的研究中,有两个东西耗费了我比较多时间。一个是有时间区间的查询,比如说一段时间之内是第一个合同号,另外一个时间段是另外一个合同号。这就意味着你要查询某天对应的合同号,首先你得先知道某天是落在了哪个时间范围之内,然后在找到相应的合同号。有人在知乎上说这样的解题思路是先对那些一段时间内的合同号生成一段连续的日期,然后再对需要索引的时间以及合同号做日期以及客户的索引。这样的思路没有问题,但是这太劳民伤财了吧。如果需要被用作索引的合同号很多,那得浪费很多连续日期做索引。直接的解题思路应该是先以客户单因素做合并查询。查询的结果将是一批时间段和合同号,然后用新增列的方式再次定位需要索引出合同号的日期的时间段。筛选的结果将是一个列表,最后只需要把列表深化出来。需要注意的是深化出来的列表可能包含不只一个合同号,这样就需要做文本聚合。每次说到深化,PQ总会有两个可视化的选项,一个人是直接列出结果,另外一个是聚合,但是聚合的那个地方除非是数字,否则就只有计数,但实际上跟之前的分组一样,完全可以把文本用分隔符连接起来。

第二个让我耗的比较多时间的是怎么替换某一列的多个内容,而不需要先建立一个条件列,然后删除原列,最后再改条件列的名称为原列名称。这样的思路一点问题都没有,但是既然我可以在原列上修改,为什么我要这么折腾分三步呢?要说到这个就得好好研究用作替换的那个公式。玩好了替换的公式可以自己列的内容自己换、其它列的内容决定自己列怎么换,也可以换一遍又一遍嵌套着换。

上周折腾PQ主要是以实现功能为主,这一次除了实现功能以外,我也对代码进行了整理,比如最大程度简化代码,把步骤的名称变得更人性化等等。

两天的时间就把一天到晚都得做的事情直接规范化了,虽然这其中的某些细节还是无法做到,但起码那是极少数的特例,所以两天的努力,我感觉已经解脱了95%以上的日常工作。

2023-08
2

脚本能批量导出导入?

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

我觉得自己已经迷上了PQ,沉迷于那种盘曲折叠的状态,一发不可收拾。我不知道为什么,如果要生成某个表格的话,我首先想到的是PQ,大概是因为出来的东西相对于PP来说PQ更像个表格,但是PQ又不是一个普通的表格。虽然到现在为止,我还没搞清楚到底限制PQ性能的到底是什么。还有另外一个让我很抓狂的是我在PQ的高级编辑器里面写了好多东西,除了进到里面复制粘贴以外,我还可以通过什么手段获取那些脚本呢?若某一天我换上了个低版本的office,可能用不PQ,所以我可能需要用Power Bi来代劳,那个时候如果得把脚本一点一点贴过去就实在太痛苦了,有没有一个脚本导出的方式呢?虽然实际上我问这个问题是因为其实我也没搞清楚如果我在某个Excel文件里面设置了宏,我该用什么方法把那个脚本复制出来。毕竟实际上Excel就是一个幌子,脚本才是最核心的部分,同样的疑惑,我在PP上也有。所以,微软到底是怎么想的呢?实际上无论是PQ、PP还是VBA,最终都是用某些脚本去控制Excel本身。把那些脚本在这个Excel可用,在另外的Excel也可以。我自己用VBA的习惯,就是喜欢把脚本都丢在某一个下文件里,那个东西里面什么都没有,只有脚本。当我打开这个文件,我再打开其它文件,我就可以在其它Excel文件上运行我想要的脚本。所以实际上那些脚本是些独立的东西,我甚至可以觉得,如果脚本编辑器能单独放出来,把文件拖进去以后就可以直接展示结果,有可能是直接把最终数据展示出来,也有可能是生成一个文件。对于小型的图表直接展示数据显然是最方便的,但是对一些比较长篇的东西,直接生成一个结果文件才是我们想要的,但是Excel没有把这个脚本控制器单独放出来。根据我自己的运用习惯,我觉得把PQ、PP跟VBA一起单独,变成一个就像Word、Excel、PowerPoint之类的独立 office套件完全说得过去。但显然,可能微软并不想这么干,因为一旦这样把高深的东西都暴露出来,很快就会被抄袭。因为实际上这些功能并不是office这三剑客独有的,其它编程软件也能实现。还有另外一点就是显然三剑客不是给普通人用的,因为对一些很新很新的手来说,Excel甚至不是用公式的,而是用来单元格加单元格加单元格获取结果的,还有就是把单元格设置成手动彩虹的颜色。如果那里用的是条件格式的色带我觉得很靠谱,但是某一天当我看到某人Excel设置成手动彩虹的时候,我彻底震惊了,他们直接把Excel变成了画板。

不是人人都会着迷于编程,但因为我的算力不好,我老会粗心大意,叫我一个一个单元格叠加,加这加着我就点漏了。所以我得让机器帮我做重复的工作,而我则躲在远远的控制端负责发号逻辑命令。

2023-07
30

半半的坎

By xrspook @ 11:14:37 归类于: 烂日记

当我把python的脚本修改完毕,觉得没什么问题了之后我把那发给我的同事,理论上她的电脑上已经安装过python,但实际上当她双击打开py的时候,会默认弹出VSCode,并不能运行python本身。这是我之前从来没有遇到过的,因为我安装的都是python的官方程序,启动器在安装的时候只要你默认,基本上都会装上,但问题是我同事安装的是anaconda。现在的python教程通常都会推荐用anaconda,那里自带的编辑器是jupyter notebook。jupyter notebook到底怎么用实际上我没搞懂的,虽然实际上py文件也能运行,但jupyterr notebook默认的保存文件不是py,所以用普通的python到底能不能打开jupyter notebook保存的文件我还真没试过。从我开始学习python,我用的就是VSCode。当我很长时间不用VSCode以后,当我再次打开,我会发现VSCode里面默认帮我装上了jupyter notebook的插件。

双击点py文件就用VSCode打开,然后还得找终端,但实际上因为可能anaconda安装python的时候并没有默认安装启动器,所以在那里双击没有运行cmd,双击打开py文件的时候,依然是VSCode本身,变成一个运行不了的死循环。 VSCode本身没有问题,问题是py文件的关联没做好,这才是问题所在。

要做到的不过是双击就能直接打开py文件运行,所以把py文件默认用cmd打开运行就好了。在cmd里输入python会显示拜访的版本,这没有问题,这意味着电脑已经安装了python,但问题是当输入where python的时候显示的是一个C盘很长很长的地址。按照那个地址打开文件夹,的确是有python的。再把这串地址上面的exe文件输入到py文件的打开方式的时候,py文件就终于可以双击运行了。双击的确可以弹窗运行,但问题是如果py文件运行的时候出现状况,比如说一闪就没了,就意味着可能文件没有正常运行,而是遇到了某个东西中断了。第一次成功设置好双击的时候,的确就出现了这种情况,直觉告诉我肯定是出状况了。在py文件所在的那个文件夹里输入cmd,然后再运行py文件,结果发现提示没有安装pandas插件。我的同事觉得很不可思议,因为anaconda本身理论上这些插件都是齐全的。我觉得之所以会这样是因为anaconda把插件安装在了自己的那个地方,而现在是单独运行python本身,而python本身的文件夹里面没有这个插件,所以这就导致了插件缺失。需要安装插件,要怎么个装法,对我这种人来说,我第一个想到的就得先设定插件下载来源为清华的镜像。如果你使用python官方路径下载,估计要很长时间,即便花了很长时间也可能会下载不全,因为非常有可能因为时间太长,网速太差丢包。虽然安装一个pandas的插件,但实际上要支持电脑运行,也要安装其它的插件,任何一个不齐全都可能会导致最终无法运行。在知道她得重新安装pandas的时候,我就已经把清华镜像的设置发给了她,但是她还要是没有意识到必须得先设置国内的镜像路径,然后再去下载。虽然单位的网速进行了限制,但是下载清华大学的镜像还是很快的,相比于python官方的下载来说清华基本上可以说是一些典插件安装的必然选择。如果你安装的是一些开源性自行设计小众插件,清华的镜像可能没有,那时候你就只能通过开发者提供的路径去下载。

其实我并不需要她完全按照我的思路来,我告诉她要什么,她只需要实现就行了,现在挺反映出来的状态是她大概知道我要做什么,但是她没有反应到用她的方法应该怎么做,有可能是她没想过要去想。一半他的一半的最终结果就是,我不知道她到底卡在了什么地方,因为以我的方式是完全不会卡的,她估计也会觉得我带她走了不少弯路。

不是人人都天生喜欢自发创新,该怎么找到这种人呢?

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