2023-12
21

确定使用365家庭版

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

38岁生日的这一天做成了一件事,就是终于找到了一个方案更换同事的office软件。因为我发现在win11系统之下,用office 2016的确会出问题,但这种问题你又说不准到底是因为什么,有时候会出现文件报错。公式自动发生了变化,比如某些不是数组公式的会变成了数组公式,让人觉得非常无语的是数据透视表的部分完全没了,只剩下纯粹数据本身。除了这些核心问题以外,表格的格式也发生了变化,比如行列距离,但最根本的问题我觉得是当我在用365的Excel的VBA访问某些被office 2016修改过的文件的时候,会出现一些莫名其妙的错误。之所以这么觉得,是因为这些错误发生的时间跟2016修改文件的时间比较吻合。在没有找到VBA出现问题的根本原因之前,我首先得排除这是2016造成的。2016 proplus的版本里也可以使用Power Query,但实际上数据刷新的时候,非常容易卡住。在365里可以刷出来的数据,2016会卡在那里,可能多刷几次也能行,但是那种体验会让人觉得挺崩溃。因为我是一个用了365好几年的人,但因为同事的电脑是2016,所以虽然365已经引进了一些动态公式,但是我却一直不敢学习使用,因为只能我能看得到,别人看不到,这样就没办法工作了。现在如果大家都用了365,我就可以怎么高端怎么方便怎么来。

近期我发现很普通的vlookup公式在365最新版本之下,会自动会变成一个动态公式,根本不需要把公式往下拉,它自动会显示一个蓝色的窗口,里面就是你需要下拉的那些东西。那种动态的感觉直接让我联想到了超级表格。365的其它查询公式也有这么牛逼的功能,我在看其它公式介绍的时候就发现了,但直到某一天,我自己用vlookup的时候才发现原来传统的公式也升级了这项功能。

本来我的设想是买office 2021的密钥,跟同事经过一番讨论以后还是觉得单位购买Microsoft 365家庭版比较划算。首先因为家庭版可以绑定的电脑比较多,其次是因为如果电脑经过一批又一批的更新换代,新的电脑自带了office,365可能就不需要购买了,但如果只是一次性买2021的话,经过几年的迭代,那个东西虽然买回来很贵,但实际上还是会有老化的时候。

我足足花了一个上午的时间才总算最终确定了这个Microsoft 365家庭版的方案。,但把365装在同事的电脑上,并确定可以使用,又不得不拖到了下午。首先找做表的人,然后是找要签名的人。接着找建立账号的人,最后找付款的人。付款的人说因为申请表还没有列出来,所以还不能那么快就付款,因为付款就会自动生成电子发票,电子发票的时间不能早于申请表的时间。所以最终的决定是先把office 2016卸载了,然后安装Microsoft 365,接着是用同事的某个家庭账号里面的共享子账号暂时支撑一段时间,等单位的家庭账号买回来了以后再把同事的365账号更新上去。

生日这天让我没料到的是明明是星期三,消消乐却有了更新,当我好不容易干完了20级以后发现原来星期四还有一个更新。1220的算是节日加更,我搞不懂这到底算是什么节日,圣诞吗?元旦吗?还是说澳门回归?平平淡淡就好,每周20级就可以了,一周折腾两次很心累。

2023-12
13

VBA神经质了

By xrspook @ 13:28:44 归类于: 烂日记

星期一上班的时候跟往常一样,我打开了其中一个我常用的VBA脚本,结果发现当我按下按钮的时候,马上闪退。接下来会自动打开一个Excel。开始那几次我直接把那个关掉了,后来我选择新建一个空白文档,然后会看到左边显示可以恢复我之前闪退的那个Excel。到底为什么那个VBA脚本会闪退呢?上周四离开之前我没有做任何奇怪的设定,基本上查完数据就关掉了,最后的保存时间是下午5点多。放置VBA查询脚本的文件夹是本地文件夹,没有设定同步的。无论是我关闭的时候,还是说我关闭之后文件都没有被修改过。为什么之前一直没有问题,这一次却闪退了呢?重新载入,打开失败的Excel文件之前,我从同步的文件夹里把同款的VBA脚本文件复制了过去,结果发现那个VBA脚本就没有闪退这种问题。就VBA的核心编程来说没有任何区别,为什么一个会闪退,另外一个却不会?闪退了之后重新保存那个文件不闪退。

VBA脚本闪退这个问题,当我第一次看到的时候我是挺慌的,我赶紧把其它VBA也打开试了一下,发现其它没有问题。为什么就只是这个文件有问题呢?一天下来,我也再也没有发现其它的问题。周一的晚上我要用另外一个VBA文件转化数据,结果却发现不成功,被卡在了某个步骤,那个步骤是把当前工作簿的某个工作表复制到新的工作簿。我一直都是采用那种操作方式,为什么之前就没有问题呢?接着我打开另外一个同样需要复制工作表到新的工作簿的VBA文件,结果发现那个更糟糕,显示的是activeX错误。转化数据的那个VBA脚本直说卡在了另存为那个步骤,我还可以手动把已经生成的数据复制到我想要的地方,所以工作是可以继续下去的,但另外一个activeX出现问题的工作簿是属于那种另存为也不行直接保存也保存不了的状态,无论如何都说我数据错误。这就让人觉得很无语了,因为上午下午我都打开过那个文件查询过数据,为什么一直都没有问题呢?

当windows出现问题,绝大多数情况下重启一下就好了。无计可视之下,我重启了电脑,转换数据的那个VBA直接就好了,没有问题了。和另外一个activeX出现故障的那个,好像一直都是那样,但是当我把同步文件夹里面的同款复制过去以后也好了。是Office某个安装文件损坏导致的这种问题吗?为什么同样的文件复制到某个文件夹里就好了呢?VBA脚本是我自己写的,其中关联了什么我自己清楚。VBA脚本放在什么地方跟使用没有任何关系。所以到底是什么原因到导致了VBA的这种神经质呢?

星期二早上,什么都没干之前,我赶紧看了一下windows的更新,结果发现对上一次更新是在11月,显然跟我出状况的那个时间不吻合,但Microsoft365到底是什么时候自己做的孽?这个我查不出来了。反正周二的早上我首先对win10进行了更新,然后也对Microsoft365也进行了更新。如果依然出现严重的VBA问题,我觉得我得对Microsoft365进行修复。如果问题依旧,估计就只能重装Microsoft365。

一开始我以为这只是VBA的问题,结果发现,我的某个word里面的交叉引用也出现了错误。我非常肯定之前是没有这种错误的,因为那个文档我复核了很多遍。如果有那种错误,我肯定会复合得出来,之所以我完全不知道那个错误的存在是因为我复核的时候,根本没有那种错误。交叉引用的错误跟VBA的随机错误到底是不是同一个问题引发的呢?那个又到底是什么类型的问题呢?我真的希望有人说那是因为win10的某个更新导致的,卸载那个更新就可以解决问题。

现在我依然没找到原因,所以就只能祈求不要遇到这种问题,又或者遇到这种问题的时候见招拆招。

2023-11
1

不闪烁的跨表复制

By xrspook @ 8:00:17 归类于: 烂日记

昨天说到当我想用VBA把一个工作簿里面的某些工作表复制到另外一个工作簿的时候,如果要复制的工作表有多个,复制过程中就会出现闪烁。如果需要复制的工作表很多,闪烁的时间会比较长。我觉得批量选择,最后一次性复制是一个解决办法。如果不是用VBA,而是手动实现这个复制功能,的确会用批量选择,然后再复制。现在按住Ctrl,然后用鼠标选择需要复制的工作表,最后进行复制。如果要在VBA里面实现这个批量选择,该怎么做呢?

一个工作簿里的工作表该如何判断哪些是需要的,哪些是不需要的,对我来说只需要判定工作表的名称就可以,所以我可以对需要的工作表以某种方式结合起来,比如形成一个以固定分隔符的字符串。VBA里要表达批量选择,然后复制,到底该用什么东西呢?这一次我没有搜索,而是直接录制了个宏。结果发现原来批量选择再复制,在宏里默认是通过数组的。需要把目标工作表的名称组合成一个一维数组,然后用最普通的复制方式把拷贝到新的工作簿。所以我要做的就是把目标工作表的名称赋值给一个一维数组。因为不知道到底要复制多少个工作表,所以这个数组应该是一个动态数组,我马上想到的方式就是以默认分隔符打断字符串的方式赋值给一维的动态数组。这个操作非常高效,而且动态数组的大小完全不需要在一开始就定义好,字符串里面有多少东西就可以生成多大的一维数组。

接下来,我要做的是经过一轮循环筛选出某个工作簿里我需要的工作表的名称,然后把这些名称以固定分隔符的方式连接起来。最后在打断之前我还要干掉一个分隔符,因为无论我把分隔符放在最前面还是最后面,整个字符串还是会多一个分格符。我不知道多一个分隔符在赋值给一维数组的时候会不会失败,作为完美主义者,我宁愿手动把那个分隔符去掉。那不过是一个字符串取值的简单操作而已。处理好字符串以后,就可以打断那个字符串赋值给一维数组,最后通过经典的复制方式,把工作簿里的目标工作表拷贝到另外一个工作簿。

我没有测试过这样处理耗时跟基础经典处理有多大差别,但就肉眼来说,差别挺大。因为如果进行这般批量选择一次性复制,基本上可以秒杀完成,但如果使用经典的方法、工作表又比较多,我感觉得闪烁一秒钟以上。秒杀就能完成我感觉那个耗时会在0.3秒以内。

批量选择再复制的确可以秒杀实现拷贝工作表,但是光标会停留在最后一个被复制的工作表里,我需要光标仍然停留在我的点击VBA控件的工作表。所以最后我又增加了一个激活目标工作表,把鼠标锁定在某个单元格的功能。这个功能不是非如此不可的,没有也不影响数据处理本身,但就方便程度而言,这是显而易见的。就如没有初始化和拷贝数据那两个模块,核心功能没问题,但是多了这些贴心的小步骤。整个核对的过程会变得更顺手。

如果使用的时候能更顺畅,我宁愿把代码搞得复杂一些。毕竟复杂的代码是一次性的。

PS:测试
复制19个工作表:批量法0.85秒,经典法7.25秒。
复制8个工作表:批量法0.59秒,经典法3.02秒。
复制4个工作表:批量法0.48秒,经典法1.59秒。

Sub 批量拷贝工作表-批量法()
    Application.ScreenUpdating = False '关闭屏幕刷新
    Dim book As Workbook
    Dim sht As Worksheet
    Dim my_name As String, stringArray() As String
 
    my_name = ""
 
    For Each book In Workbooks
        If book.Name <> "AAA.xlsm" Then
            For Each sht In book.Worksheets
                If Not sht.Name Like "*BBB*" Then
                    my_name = my_name & sht.Name & ","
                End If
            Next
            my_name = Mid(my_name, 1, Len(my_name) - 1)
            stringArray = Split(my_name, ",")
            book.Sheets(stringArray).Copy before:=ThisWorkbook.Worksheets("条件")
        End If
    Next
 
    With ThisWorkbook
        .Worksheets("条件").Activate
        .Worksheets("条件").Range("A27").Select
    End With
 
    MsgBox "完成数据抓取!"
    Application.ScreenUpdating = True '打开屏幕刷新
End Sub
 
************************************
 
Sub 批量拷贝工作表-经典法()
    Application.ScreenUpdating = False '关闭屏幕刷新
 
    Dim book As Workbook
    Dim sht As Worksheet
    For Each book In Workbooks
        If book.Name <> "AAA.xlsm" Then
            For Each sht In book.Worksheets
                If Not sht.Name Like "*BBB*" Then
                    sht.Copy before:=ThisWorkbook.Worksheets("条件")
                End If
            Next
        End If
    Next
 
    With ThisWorkbook
        .Worksheets("条件").Activate
        .Worksheets("条件").Range("A27").Select
    End With
 
    MsgBox "完成数据抓取!"
    Application.ScreenUpdating = True '打开屏幕刷新
End Sub
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的付费用户,而且是专业版的。可能会好很多,但是,我们在中国,我只能说希望越大失望越大。

我还是用好手头上的工具,实现我的小目标好了。

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