2023-10
31

老脚本加新模块

By xrspook @ 10:52:25 归类于: 烂日记

几年以后,我终于又在某一个我用来核对账本的VBA脚本上加了两个新的模块。之前这两个模块的内容我都是手动实现的。第一个模块是初始化,就是把已经核对过的明细数据删除掉。初始化这个步骤眨眼间就完成了,因为是在同一个工作簿里进行。另外一个模块做的是数据抓取,抓取我需要核对的那个工作簿里的明细工作表。我要核对的那个工作簿里的汇总,那个工作表默认不抓取,因为那是用来核对的。另外一个跟明细数据和汇总数据不是一伙的工作表也不能抓取,因为那个表的数据格式跟其它的不一样。过去这几年来我做的事情都是手动的在VBA脚本所在的工作簿里删除掉已核对的数据明细,然后再把我需要核对的那个工作簿里的明细粘贴到VBA脚本所在的工作簿。这个操作很机械很单一,完全可以用VBA去实现,但是我却一直没有这么干,为什么呢?大概是因为最初的时候,我写的那个VBA脚本核心部分实现的功能已经减少了我绝大部分的工作量,简单实现了非常麻烦才能实现的事情,所以我觉得自己已经上岸了,相对来说,这些复制粘贴删除的东西比较简单。简单归简单,很容易能实现,但是日积月累经常性习惯性每一次都要整那么十几二十遍也是很烦的。为了简化初始化的那个步骤,我每次核对完就以不保存的方式关闭VBA脚本所在的工作簿,然后重新打开。

我不知道对以前的我来说,写着两个模块有多难,对现在的我来说,对今年已经在VBA脚本里浸润了好几个月的我来说挺简单。实现方法很简单,但是出来的效果我感觉上应该还可以改进。初始化的那个脚本已经很完美,没啥需要再进一步了,但是那个拷贝数据的脚本,如果需要复制的工作表有很多,屏幕会出现长时间的闪烁。那种闪烁源于不同工作簿之间切换导致聚焦位置改变。之所以这样,因为我所使用的复制方式是VBA教程里最简单的那款。微软的默认教程就是那样,当然你也可以使用不一般的方式。闪烁是因为不同工作表之间切换以及活动工作表活动单元格之间的变换。这个问题之前我已经发现。我以前的VBA脚本里也有这种问题。做一个循环,把某个工作表名称符合要求的就复制到 VBA所在的工作簿,这个循环是显而易见的,但是一个一个工作表去判断,一个一个复制显然就会出现很多次闪烁。如果我先去判断,然后把符合要求的全部选定,最后一次性复制,这样会不会就可以从多次闪烁变成一次闪烁呢?多次闪烁你肯定能感觉到闪烁的存在,但如果只是一次,估计那种闪烁感就会感知不到了。有人在网上提出过如何避免闪烁这个问题,但好像大家都没有在批量选择然后一次性复制上面想。我也想参考他们的做法改进,但好像不太适合我的实际情况。

我觉得闪烁这个问题是可以攻克的。

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
26

一次一个小愿望

By xrspook @ 10:58:44 归类于: 烂日记

每次都定下一个小目标,然后去实现。结果发现一天多一点的时间居然就能搞定一个问题,这种进度有点出乎我意料,因为之前的那些问题让我挣扎了好长一段时间,起码有两三天,之所以后来进度加快了,大概是因为我明了了我要做什么,但是尽管是这样,还是会遇到很多奇奇怪怪的问题。

这周初我解决的是批量生成月度核对表。我把这个任务分成两个步骤,一个是查询到底要生成多少,接着就是把查询到的结果生成文件,但是那个结果跟文件又不一定是完全对应的,根据不同条件可能10条查询结果最终会生成9个表。因为实际上某些条件是需要合并才能得到我想要的文件。在怎么设定条件,如何进行循环方面,我纠结了好长时间,几乎可以这么说,上个周末我一直在做各种尝试,为的就是最终实现这个目标。

在完成了批量生成月报以后,接下来我要做的是生成某个仓的分仓台账。相对于之前的月度核对表,这个单仓台账相对而言条件是固定的,而且必定只生成一个文件。同样我首先做的也是做一个查询,查询一下这个仓到底有多少条记录是可以生成分仓台账的,我又要生成具体哪一条。有些是无法自动实现的,因为实际情况是某些仓某些筛选条件是不一样的,但实际上应该反映在同一个分仓台账里。这个时候就需要手动合并一下条件。这种例外的事件不确定会在什么时候发生,所以必须给手动留有余地。之所以分步骤,其实一个很重要的原因是其实有时并不是为了生成分仓台账,只是要查询一下这个仓的情况。批量生成月度核对表,我花了好几天的时间,但是生成分仓台账,我只花了一天不到。

接着,我研究的是库存查询。在不同的条件之下进行库存查询,最后的结果是以一个透视表的方式展现出来,根据不同的查询条件透视的项目不一样。虽然我想到透视的项目是不一样的,但实际上在我研究的过程中,我先在单一的条件上做尝试,当单一的条件生成的数据没有问题以后再把它扩充到动态条件。因为有了之前月度核对表的锻炼,所以动态条件该怎么做我是有点底的。

SQL最基本的查询语句基本上我已经比较熟悉,这一次库存查询最后一步需要做一个透视。透视这个东西是我之前没有尝试过的,虽然我是Excel数据透视表的超级粉丝,但是在SQL里面控制这个东西,我还是很不在行的。所以到底什么条件可以控制,可以控制到什么程度我是不知道的。教程通常都只是最简单的那些,用上面的数据你重复100遍都不会出什么幺蛾子,但是在实际情况下你会有更多需求。比如当我要控制被透视列的排序的时候发现好像在Excel的SQL里无法做到。即便我在透视之前那一步已经排好序了,但是透视的时候依然是我行我素。让我比较挣扎的是,在透视之前我已经通过分组合并计算出被透视的列的合计数了,但是透视之后合计混在了那一堆被透视的字段中间。最后我已经想到不计算合计,在SQL里面生成透视以后输出到数组,我在数组里面做合计。就在我几乎要放弃的时候,原来合计可以通过在透视的select里用一个聚合函数实现,这样的话透视之后的表格就是先是条件列,然后是合计,接着是那些被透视的列。虽然合计不是放在我想要的最后面,但起码放在了最前面。

库存查询研究过程中让我纠结的问题是什么,明天继续。

2023-08
10

开始VBA+ADO+SQL

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

几天之前我第一次听说VBA+ADO+SQL可以组成一个非常牛逼的东西。当我听说要在VBA里面运行SQL的时候,我有怀疑过这是不是我以前遇到的那一款?但是在SQL的外面又有一个ADO,这就很不一样,因为ADO这个东西你甚至可以控制只执行一次,然后就自动消失.当然你可你也可以用打开的方式去折腾,但是对低端用户来说,光是执行就可以完成大多数事情。

在学习VBA的时候,首先会告诉你,如果要操作工作簿,就得先把它打开。用完不用了,你还得把它关上,不打开工作簿是没办法进行操作的。同样,在学习用python控制Excel的时候,也是这么个思路。按照正常人的想法,你要获取里面的东西,当然得开门,哪怕实际上你只是进去看一看,你并不改动里面的东西。比如在做查询的时候,实际上你不过是收集里面的资料,你不需要改动里面的任何摆设,把资料收集回来了以后你可以再加工,但是原始的那个东西是不变的。为什么跨表表查询的时候,我首先想到的是Power Query,就是因为那个东西本来就是开发出来做数据清洗的。核心的观点就是不改动原始数据,通过可重复的步骤,你就能得到规范的东西,然后再给其它玩意调用。但是VBA+ADO+SQL彻底颠覆了我过往的认知。因为这三个东西加起来就意味着你要获取工作簿里面的东西,你根本不需要打开它。通过链接的方式,就可以到达那个地方,虽然实际上这样是无法修改文件内容的,但是跟PQ一样,可以对已经获取的东西进行再加工。所以准确来说,虽然做出来的菜是不一样的,但实际上原料还是那些,牛逼的地方在于,那三个东西甚至连文件都不用打开,但是PQ在运行的时候,实际上是要打开文件。如果你的查询设置比较复杂,他还得把同一个源文件一次又一次打开。因为PQ里的查询是并行的,你没办法控制哪个先哪个后,所以当它们抢着打开同一个源文件的时候就会出现错误,就会出现刷新失败,然后说不准什么时候就会告诉你原始的数据格式不对,反正最终结果就是刷新失败,但是当你再次刷新的时候又好了。

VBA这个东西在我听说有PQ和PP之前就已经存在。大家可以通过VBA的方式批量打开文件夹批量合并里面的文件,但问题是合并是合并了,但是却非常不智能,因为最简单的模式只能保证内容都给你贴上去了,但是对不对得上你自己碰运气。比如第一个表跟第二个表某些列的顺序是不一样的,结果你就会拼出个寂寞,但是PQ和PP就不会犯这种错误。因为他们有连接方式这种概念,同时,它们所处理的不是某个单元格,主要操作的是字段,又或者说是列。当然,如果你条件足够,可以精确到记录。我在python里,只要把从Excel读取到的数据赋予pandas,接下来你就可以用 dataframe的方式去处理那些东西。我个人觉得,只要格式化了,只要那个数据框架定下来了,SQL、PP、PQ、python这4个好像不太一样的东西都能干非常类似的活儿。

首先是Power Query版本,接着是Power Pivot版本,第三个是python版本,现在我做的是VBA+ADO+SQL的版本。SQL in Excel是一个非常屌丝的东西,相比于其它软件里面的SQL,Excel里可用的公式我个人觉得会让人非常抓狂,是阉割版的SQL。本来就很难找到一个标准的说法告诉人你SQL in Excel到底有什么可以怎么用,当你用其它方式套在Excel里发现用不了的时候,才知道原来根本不能这样。对我这个新手来说,我只是大概知道SQL可以这样,应该这么整,但是套了一个Excel的条件以后就变成了大概应该是这样的事情实际上不行。

一天到晚都在为代码纠结。反而让我日子过得很实在,虽然运动和打游戏的时间被严重侵占了。

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可能永远都用不着,甚至那本书都不需要拆封。但说不准什么时候,你想学习一下呢?那本书的好处在于不仅仅直接把案例丢给你告诉你源数据是什么,目标是什么,怎么去做。前面很大一部分的章节他们给你说清楚了那个东西是什么、原理是什么、可以做些什么。也就是说最基础的东西他们都告诉你了,以后再有什么超级牛逼的操作,就只是在使各种招数的组合拳而已。内功心法学好了,招式什么的只要懂得个套路就可以打出来。

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

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

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