2023-08
8

在Excel VBA里折腾SQL

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

又花了几乎一天的时间去研究在VBA里使用SQL。上午我主要卡在为什么我运行不了SQL这个东西。最主要的原因是我贴过去的那个例子是2014年的,那个时候的office跟现在的很不一样,所以是不是代码里的某些参数要改过来?4跟8改成12,我的确改了,但还是不行。吃过午饭以后我我把ExcelHome论坛前天大家才写出来的SQL查询复制过去,发现果然就可以了,因为除了12要都改以外,还得改一个Microsoft之后的单词…… 为了这个运行不了我还折腾的一番到底我需不需要装32位的AccessDatabaseEngine.exe,因为我发现自己的电脑是默认的那个是64位的。一开始我还以为自己的Microsoft 365是32位的,因为以前自动安装的的确是32位的,但是当我安装了32位的AccessDatabaseEngine.exe以后,发现还是不行,接着我就去看自己的office,原来已经是对64位了。因为据说64位要比32位快那么一点点,我已经不记得自己到底什么时候换了。换一个office对我来说毫无难度,因为只要登录我的账号,随时都能把那个离线文件下载回来。

总算可以在Excel里运行有SQL语句的VBA。据说要在Excel里运行SQL有三个方法,第1个是用远古的MS Query,这种方案在我用Office 2003的时候尝试过。接着是在新建连接那里输入一大串的SQL语句,这种事情我好像也干过。最后也就是现在主流推荐得最多的在VBA+ADO+SQL。这是我之前完全没有接触过的。你说我完全不懂SQL吧,也不是,实际上我也是有一点点懂的,因为高中的电脑课程里面就有Access,那就是一门电脑课,因为用得不多,所以印象不深刻。相对于其它编程语言,我觉得SQL的单词算是非常简洁了。入门是简单的,但是你要把它玩得很溜,一点都不简单。

从别人的代码语句构造来说,我觉得SQL要比VBA的数组好理解一些,但是当我自己要写的时候发现哪哪都不对。主要是虽然是SQL,但是不同软件里面的限制可以称得上是五花八门。当你搜索出一种SQL写法以后,发现在Excel里面无论如何都不行,最后发现原来是Excel不支持这种玩法。比如我要做一个多条件判断,我肯定毫不犹豫会想到用switch的方法,SQL里面都有case解决方案,但问题是Excel里不行,所以如果是多条件的,你只能不断地嵌套if。因为我多条件最终实现的是一个文本替换,所以我就足足套叠了5层replace才实现了我的功能。

用过VSCode你肯定会觉得Excel VBA最让人吐槽的就是VBE的各种奇奇怪怪的限制。如果你要在VBA里面用SQL语句,你就得用双引号把那圈起来,而且在双引号里面是不允许换行的。这就很让人抓狂了,不能硬换行可以,但编辑器为什么就不能给我一个软的自动换行?视觉上给我换一下行有什么问题吗?当你不得不把那串SQL圈起来,就意味着里面所有成对的符号自动识别一律失效,全部变成了白开水字符串。本来那就是很大串的东西,还没有方法帮你自动确认格式有没有错误。如果可以换行可以缩进,你可能一眼就看出自己在哪里出毛病了,有些配对没配对上,但是因为你只能一笔写到底,所以你怎么可能不犯错呢?犯的这些错误有可能是你不知道规则原来是不允许的。比如如果你只有一层select,字段里有别名,那么group by的时候你就不能用别名,因为group by比select先执行。在某些软件的SQL里,是允许加having语句,从而改变 group by和select的先后顺序,但在Excel里面加having是没有用的。如果你非得要在group by的时候使用别名,那么你就得嵌套select。内层select先别名,外层用group by。这些神神经经的限制实在让人抓狂死了。同样是分组,如果我是在PQ里进行,重命名列这种事情放前面放后面都无所谓,变形改造列这种事情放前面放后面也无所谓。因为重命名、变形、分组这件事情全部可以分步。但是在Excel的这个SQL里面,所有东西都得一次到位。明明可以短句实现的功能不得不写一大串。实际上在Excel以外的SQL写法里,是不是也非得这样?VBA的古板是显而易见的,但是当你见识过他们把SQL阉割限制成这个模样。你就会立马觉得python的自由奔放实在太好了。

死磕得越多,我越发现自己喜欢VSCode+pyhon。

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
28

跨表查询python版搞定

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

花了一整天的时间去做python版本的发跨表查询,最终还真的被我做到了,唯一有点小瑕疵的就是出入进度里我还没有实现批次小计。我基本已经想好需要一个什么样的数据处理,但是怎么把那些东西结合起来我还没有一个成熟的思路,估计会有一些类似的案例,我可以参考一下。

之所以这个脚本居然用了一整天,是因为最后我算了一下字数,居然有4000多字。因为我用的是VSCode,所以实际上敲代码已经很高效了,因为几乎所有符号都会配对出现,一旦有手误的地方基本上都会提醒,但是有些东西是VSCode不会提醒我的,比如我要用到pandas各种格式的数据,有些事不能直接用print打印出来的,必须要用个循环才能把那些东西展示出来。如果我用python处理Excel,我会用xlwings进去,然后用pandas。之所以用xlwings,因为这个东西支持Excel的版本比较多,老一点的插件有的只支持xlsx有些不支持xlsb,有些仅仅支持xls,而我选择的这个xlwings基本上我用的Excel格式都支持了。现在我主要用xlsx和xlsb。因为做这个python查询之前,我已经在PQ和PP上做了两遍,所以我完全知道自己要做些什么,但具体那些东西该如何实现,应该用什么样的表达式去实现,是我花时间的地方。

昨天之前我对pandas里面的dataframe并不太熟悉。我知道那个结构很类似于Excel的表格,但实际上用起来又跟表格不太一样。我觉得那个东西最好的地方就是不像PQ那样,经常被高手套叠起来,于是你想半天都搞不懂那到底是什么。作为一个不是python新手的人,我还是喜欢用短语句完成,然后再连接起来。自学python让我觉得最成功的地方在于我喜欢用for循环,而且还非常习惯使用套叠循环。如果在我大二学C语言的时候,我也能把循环玩得这么溜。估计我就不会为冒泡法这种东西发愁了。

虽然花了一整天时间,才终于把这个东西整出来,但我个人感觉还是比较愉快的,尤其是敲代码的过程,因为相对于在Microsoft 365的PQ或PP的编辑器里面敲代码,VSCode里敲代码实在太爽了。PP会经常提醒我公式错误,因为PP那个你看不到的循环实在会把你整得很惨。PQ里我不过是删了个文字,不知道为什么它会自动给我加半边括号,所以搞了半天,我都搞不懂自己到底哪里错了,最后发现不知道为什么,多了个括号,又或者在调整某些语句的时候多了或少了个逗号。英文和中文逗号在编程的世界里是有区别的,在VSCode里可以看得很清楚,但在PQ的高级编辑器里。因为字体太小,你还没办法快捷变大,非常折磨我这种眼睛不太好的老人家。

高中的时候我的数学老师经常一节课就只讲一道题,他会用很多方法把那道题解出来。现在,我也喜欢上了这种别人可能非常难理解的行为。

2023-07
21

外部数据查询

By xrspook @ 9:37:46 归类于: 烂日记

近几天都沉醉于做Excel的数据合并,实际上就只是两个表,一个是交易情况另外一个是出入库明细。出入库明细是一个大表,交易情况里面除了交易本身以外还有货款明细以及损溢明细,所以原始表格合计有4个。相对于我之前纠结过的那些东西来说,这几个表有一个数据是必定唯一的,也就是交易情况里面的合同号。损溢明细里一个合同号可能出现多次,货款明细里一个合同号可能会出现多次,出入库明细里一个合同号绝大多数情况会出现多次。所以这些表里,交易情况的合同号是1,其它是多。以前在Excel里面用Power Pivot建立表的关系的时候,我是直接把某一个列拉到另外一个表的列建立关联,但这一次我发现交易情况和损溢明细无论我怎么拉,PP都默认,一是损溢明细,多是交易情况。直到昨天我才知道原来建立表关系的时候是可以不用手拉的。理论上我已经把PP的界面看过一遍又一遍,不仅仅是软件本身,关于它的书我也看过一些,但是好像在昨天之前我就从来没有发现原来有那么个界面。1对多到底谁是一,最重要的一点是哪个表先选定,后选定的表在Excel的Power Pivot里默认是多,但如果二者关系不成立,会建立不了关系。我不知道Excel的PP为什么会这么设定,理论上应该还有1对1,多对多之类的关系,显然在Power BI里面就有,但Excel就是这么神经。用Excel PP默认给的那个1对多的关系,在用透视表的时候,无论如何都得不出我想要的结果,但实际上我想要的那个结果我想了半天也都是合理的。结果手动建立正确的1对多关系后,透视表的数据就正常了。之前,我在Excel的PP上耗了好长时间研究其它东西,之所以有些坎无论如何迈不过,无论如何觉得有毛病我猜是不是也跟这个1对多的关系自动默认给我生成错了。

在玩PP之前,其实我已经折腾了一天的Power Query,之所以从PQ转投PP,是因为我发现虽然我的原数据很简单。最大的那个表才几千行,载入以后进行初次筛选,剩下700多行,另外的那些表只有几行和几十行。但即便这样,它们关联了以后,做全体刷新的时候依然会出现卡顿,依然会偶尔告诉我数据不是我期待的那个格式,所以刷新失败,但实际上当我重新再去刷新失败的那个表,又会成功。在不修改参数的情况下刷新同一个查询,有时都能刷出来,有时一些刷不出来,有时刷的时间要长一点,有时刷的时间挺短,到底这是为什么?各种缓存的参数我都试过了,各种PQ本身设置相关的参数我也试过了,但是PQ自己就是这么不稳定。快的时候可能5秒就出来了,但是慢的时候可能30秒都出不来。折腾了我一天后,当我用PP做出跟PQ完全一样的功能的时候,发现PP的稳定性好很多,几乎不会出现数据刷新失败,大多数情况下,PP刷新需要10秒钟,但是它俩最大的区别在于PQ这个查询文件只有50KB,但是PP的查询文件是800KB,之所以这样,是因为实际上PP把整个原数据都抓过来了。考虑到这些查询文件我肯定会在不同的机器上运行,所以虽然PP可以直接连接某个外部源文件,但我还是选择先在PQ里做一个动态接口,然后再转到PP的模型上,同时在一开始的时候让PQ把3000多条数据出筛成700多条。

10秒钟和不知道到底要多少时间,以及50KB和800KB这两个答案我都不太满意。所以接下来估计我会尝试一下python方案。

2022-11
22

我想用Python

By xrspook @ 10:24:39 归类于: 烂日记

几天前我开始看关于把Python跟Excel结合的书。其实那些书一年多前我已经已经买了,只是一直都放在那里,甚至还没开封。因为同期购买的还有一大堆Power BI的书,所以Python跟SQL我都还没有开封。现在之所以开封是因为突然想到想抓取一下网上的官方新冠疫情数据。之前我没想过要自己抓取,后来发现各大门户网站的看板都只有几个月的数据。顶多只能看到今年8月,之前的就没有办法了,要怎么抓取那些数据,然后以我想要的方式展示出来,显然依靠看板是不行的。那个东西不是给我这种较真的人去看的,只是给大伙看一下今天的情况怎么样,近期的情况怎么样,而且都只是了解个大概而已。新冠疫情的数据应该是官方的,当然是找国家卫计委和各省的卫健委。国家卫健委的东西我感觉我暂时用不上,原因是颗粒度就只是到省份而已。我之所以要收集这些新冠疫情的数据,是因为我想看一下新冠疫情和我单位的业务到底有没有关系,是否因为新冠疫情的零星散发导致广东省又或者是东莞市周边的各种防疫政策突然严格起来,甚至出现区域封控,最终导致我库的业务量大受影响。因为总的来说,和我库发生业务的那些单位大都是拉到周边,跨省的偶尔也会有,但不多。相对于之前来说,今年的装卸船都没有那么繁忙,所以新冠疫情数据主要看广东省,尤其是深圳、广州、惠州、佛山这几个地方大概就差不多了。因为从东莞疾控发布的消息来看,东莞是非常看重跟它接壤的那些地市的疫情情况的。我的真实感受是广州卫健委那边还没官方宣布消息,东莞卫健委这边就已经在官方公众号上发布要对广州采取加码防控。

广东卫健委的网站,我感觉挺漂亮,没什么多余的东西,开的速度也很快。我研究了一番那个网站的源代码,好像没找出是基于什么做出来,但我总感觉从那个网址的展示形式看来非常有可能是基于WordPress的网站。从网站的头部信息看来,写脚本的那个人很用心,因为他把信息整理得非常整齐,不同类别的还会特意用个空行分隔开,css也是整理得很漂亮。那个网站如果在不同的终端查看,估计会是不一样的效果,会有针对平板或者手机之类的版本。网站做得这么细致,里面也有不少的javascript,所以会不会有反爬技术还真很难说。最终发现如果我用最初级的爬虫去抓取数据,仅仅能爬到网页头的搜索,然后就戛然而止了。或许用上一些高端的手段能把网站爬下来。但我需要的不过是其中一段少则百余字,多则几百字的东西而已。尝试太凶猛,卫健委把我的IP给封了,我连看都看不了,问题更大。所以最终我采取的措施是在Firefox浏览器上安装一个叫download them all的插件,批量下载他们的网页。在做这些事之前,我已经试过手动下载其中一个网页,然后用Python正则提取我想要的东西。事实证明批量下载网页是可行的,Python正则抓取信息也是可行的。最终问题就归结为抓取到了某些信息以后,怎么才可以让那些信息以我想要的方式表达出来。最终我要什么效果,要什么样的颗粒度,实际上我没想好,但起码离线的网页已经在手,就没什么好纠结了。

于是这也带出了我翻出那些Python跟Excel结合的书,找一下灵感。

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