2023-08
9

终生Excel学校

By xrspook @ 8:40:47 归类于: 烂日记

当我还是个学生的时候,虽然有电脑课,但实际上基本上没有教会我什么关于Excel方面的知识,最牛逼的那个估计得算是高级筛选,仅此而已。我觉得学生时代用得比较多的是Word,Excel可以说完全是一片空白。因为不懂,所以畏惧。那个全部都是表格的Excel到底可以做些什么呢?其实直到大学毕业,我的Excel都挺水的。能用,但是就只是把它当做是一个普通的表格而已,有什么高端好处,其实那个时候我并不知道。Word也可以画表,为什么我要在Excel里面做,不在Word里面做呢?工作了以后更加不会有人会教你这到底是什么情况。他们只需要你把东西做出来,至于你用什么方法,你是怎么做的,即便他们教你,你可能也会很嫌弃,因为他们用的是那种纸质表格的思路。

直到有一天不知道为什么,我突然认识了数据透视表,我已经彻底不记得我为什么会突然认识这个东西。然后我的世界彻底的不一样了。几乎可以这么说,数据透视表让我成为了真正的“表姐”。迷上数据透视表,才算是我认识Excel的零点。在那之前,我也会用一些公式,也会做一些合计,但是相比于后来我说感知的那个天地。之前我所做的那些感觉是幼儿园小班的事情。我认识了数据透视表以后,我算是刚刚上Excel小学了。

还记得高中的时候,我的某个同桌非常喜欢Excel,因为她爸爸是一个会计,所以估计她看他爸做表看多了。对我来说,Excel很神奇,高中时候同学就已经迷恋的东西,几乎10年以后我才刚刚不知怎么的入门了。

先是数据透视表,然后是Excel的公式,但相对于Excel五花八门不断更新的公式来说,我还是比较喜欢性价比极高的数据透视表,也几乎是同期,我喜欢上了ExcelHome。我不知道那个东西到底是怎么发展出来的,反正我一开始认识他们的时候,是个论坛,现在这个论坛还在依然,有非常多的高手。 ExcelHome里非常牛逼的专业人士会出书,出各种 office相关的教程。看过他们的书,也看过别人的书以后,我觉得他们真的很靠谱。当然不是所有都一定靠谱,但基本上你认住那几个人,只要确定那本书是他们主笔的,基本上不会出乱子,即便有些时候可能会吹水,但是起码能保证他们说的话你能懂,他们给你的方式你照着做,能得到一样的结果。如果你得不到同样的结果,他们会清楚地告诉你,是因为什么版本什么参数的原因造成的。看到他们的书买就行了。到现在为止,我依然觉得他们的书如果要入门的话直接入手Excel三剑客——数据透视表、公式、VBA。虽然VBA那本可能你用不上,但之所以为什么叫你顺便带上,是因为如果三剑客捆绑销售,而且又遇上促销,不买VBA只买那两本的价格可能比三本一起买还要贵。买的时候或许会觉得 VBA可能永远都用不着,甚至那本书都不需要拆封。但说不准什么时候,你想学习一下呢?那本书的好处在于不仅仅直接把案例丢给你告诉你源数据是什么,目标是什么,怎么去做。前面很大一部分的章节他们给你说清楚了那个东西是什么、原理是什么、可以做些什么。也就是说最基础的东西他们都告诉你了,以后再有什么超级牛逼的操作,就只是在使各种招数的组合拳而已。内功心法学好了,招式什么的只要懂得个套路就可以打出来。

我觉得让我走得越来越远的其中一个很重要原因是虽然现在我做的事情,我已经可以顺畅地做出来。经过多年的验证,没有问题,但是我不满足于现状。有没有一些更准确高效的方式呢?之所以有这种追求,最根本的原因是因为我懒。既然我有这个时间,既然我有这个需求,为什么我不趁着这个大好机会学习更多的东西呢?

如果这个是别人逼我的话,我一定会很反感,但是自学这种事情我是真心喜欢的。

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方案。

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