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-10
30

雨后春笋般的物流园

By xrspook @ 9:12:59 归类于: 烂日记

不知道哪一天的公众号说东莞是个非常年轻的城市,平均年龄不到35岁?看到那条消息的时候,我直接觉得自己是个超龄的存在。的确东莞有很多人,从我的感觉来说,麻涌的人更加是越来越多,因为各种物流园拔地而起。以前工厂是劳动密集型的,现在的物流园是劳动密集型的。如果你只是开车,只是走最短的线路,从家到单位你不会体会到这种变化。过去就这一两个月,我坐了很多的611和618,见过很多各种各样的人。如果我不搭乘这里的公交车,我怎么可能看得到这里的人。

611算是到过麻涌镇,618基本上走的都是偏僻的路线,完全不入麻涌镇的中心。白天的时候在那些镇上的站点或许你会看到本地的阿婆或者学生,但相对于616来说,611上面的阿婆很少。因为如果阿婆要从马从镇上回漳澎,为什么她要搭乘那一辆很绕的611呢?直接搭616就好。在星河广场,611没来,于是我选择616的时候,就会在上面看到阿婆看到学生。无论是611还是618,我觉得都是属于麻涌的工业线路,走的都是港口码头、老牌工业区以及新生的物流园。这种线路就意味着客流会一波一波的。如果运气好,你可能会遇到塞满一车的人,但如果运气不好,可能十几个站,一个乘客都没有。

工业线路站点上来的人基本上没有一个是本地人。物流园那边可能上来一大波都是与各种物流相关的工人,可能是扫码的,可能是打包的,可能是拼多多的,可能是良品果子的,可能是京东的……以前我从来没有听说麻涌有拼多多的仓库,但现在无论是611还是618经过的仓库我都看到了拼多多的招聘信息。就是因为一下子在这片区域附近崛起了太多的物流园,用工需求一下子就上去了,于是也就可以理解,为什么我们这边如果要买什么东西用的是申通、圆通或者极兔的时候,会经常出现物流异常情况,明明快件已经到了麻涌但却没人派送投递。可能相比于开个小车去派件,在那些物流园里打工赚的钱更多。打工人选择更轻松的工作、能赚更多的钱,无可厚非,但是我们这个偏僻旮旯的地方也得继续买买买,也得继续有人为我们服务啊,这该怎么办呢?之前我一直不明白为什么会出现这些情况,但是当我一个又一个周末搭公交从家回单位看到了很多很多从无到有的物流园以后,我总算有点明白了。

作为等待物流派送末端的消费者,在这种情况下,我可以怎么办呢?我不买东西吗?这显然是不可能的。又或者某一天他们会直接把我们这里的快件投递到一个他们觉得离我们最近的地方,要我们去自提。这种神经的状况就像一下子我们这里的物流服务倒退了10年。

都不容易,除非物流企业加价才有人肯干这份工作,否则我们的无解难题会持续无解。

2023-10
29

什么时候才变凉啊啊啊

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

都说了冷空气要来,但实际上来了一周都还是没来。天气一直处在闷热的状态,没有风、扩散性很差,所以也说不清那到底是雾霾还是什么的,反正就是远远望去灰蒙蒙一片。偶尔会下雨,但是因为那个雨太小或者持续时间太短。所以最终只会增加空气湿度,最终变成了虽然温度不算非常高,但因为湿度超过了90%,所以人的体感反而很热。理论上秋天不应该是这个样子的,春天有时会这样,但今年就这么个状况,从天气预报的数据看来,在11月之前,估计我们都不会等得到下一张清凉试用卡。

打开购物app,看到那些保暖的衣服,虽然自己衣柜里已经有很多,但是总会忍不住想继续买。买什么颜色买什么款式,当我折腾了一大番,最后在即将提交付款的时候,突然意识到可能我根本就没有机会穿,因为现在的天气好像会冷的几率越来越低了。还有就是实际上我衣柜里有不少类似的东西,而那些东西已经塞满了我的衣柜。一整个寒冷的季节下来,很多衣服可能一次都没穿过。我不知道这种现象其他人会不会有。那些每天都换一件外套的人,到底是不是每天都欢喜,还是说只是每天都换一件,之前的那一件只是拿回去放一边囤起来,然后过上一段时间再拿出来继续穿?我不知道其他人是怎么做的,我到了冬天就是那种可能一件外套穿一整个星期,一周才换一次。当然只是外面的那件会这样,里面的衣服肯定是天天洗澡天天换,但可能我那些外省的同事不是这种习惯。有些同事说她来大姨妈的时候就会一直不洗澡。多年以前,当他们把我派到河南工业大学习一个月的时候,我第一次见识了澡堂,我也意识到了那里的人不是天天都会洗澡。也就是说他们不会天天都去澡堂,澡堂一周有一天是不开的。澡堂不开的那一天我就会在公共的洗衣台那里把头凑到水龙头那里洗头,但我仅仅也就只能洗个头而已,因为那里没有其他方可以供我淋浴,即便我可以忍受冷水。他们不习惯天天洗澡,但是他们很注重天天都得泡脚。每天睡觉之前都会泡脚。现在我就觉得他们不需要这样了,又或者是他们依然是这样,虽然现在的新校区新宿舍可能不需要澡堂,可能每个宿舍里面会有独立的厕所和淋浴间,但也有可能厕所是独立的,但是淋浴间依旧没有。如果那样的话,我还能自己烧水在厕所里进行我习惯的那种淋浴。冬天很冷的地方和冬天不太冷的地方,水资源丰富的地方和水资源一般的地方习惯真的很不一样。如果他们来到了广东这种地方,而又不采取广东人的习惯,因此而产生的各种味道估计无论是他们自己还是别人都会很快受不了。

冬天能穿很多各种各样的衣服,但因为天气一直冷不下来,所以一直穿不了,但即便这样,我依然希望能再买一些,人永远都这么矛盾。

2023-10
28

纯粹的快乐

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

为什么运动非得叫上小伙伴?为什么理论上需要小伙伴一起才能做的运动,就不可能一个人完成?对我来说没有什么不可能,因为当我还是个孩子的时候,我就经常一个人玩理论上得两个人或者以上才能玩的运动。现在回想起来,以前我好像从来就没有着迷过一个人就能完成的运动。我很讨厌跳绳,短跑我感觉还行,但是我很讨厌长跑。以前在家里玩得最多的是乒乓球,但实际上在家里玩乒乓球,一开始的时候我连一只乒乓球拍都没有。踢毽子理论上也不是一个人完成的,但实际上。我踢毽子的能力就是一个人在狭窄的走廊里练就的。如果没有那些练习,我就不可能掌握控制力,于是比我年纪大的小孩在他们玩的时候也会让我加入。后来,当我在小学或者中学,跟我的同龄人玩踢毽子的时候,他们会有点惊讶于我的控制力。显然这东西不是天生就有的,肯定得经过长期的练习,但是什么样的人才能耐得住寂寞?要练习多长时间?要怎么练习?当我还是个孩子的时候,我根本不知道这些,我只知道要把那个毽子一直踢,尽量不要拉掉到地上。我可以用身体的任意部分辅助。在那个狭窄的走廊里,我甚至可以利用各种东西的反弹。如果是现在,估计反而更没有空间让我练习踢毽子。因为在家里到处都是东西,一个不小心就会碰到。如果是在外面,而我又是一个小孩,外面又不仅仅是我一个小孩,为什么我会耐得住寂寞自己在那里练习。其他小孩会不会主动过来跟我一起玩?我之所以成为现在的我,一定程度上是很多很多的机缘巧合叠加出来的。我是我那个家族里三个小孩里最小的,我是外公外婆公租房某片区域里倒数第二小的孩子。那最小的那个我们直接不跟她玩,因为她太小了。在其他大孩子的眼里,其实他们也不想跟我玩,但是碍于长辈的命令,不得不让我加入。我不喜欢跟比我小带孩子玩,估计比我大的那些孩子也一样这么觉得。

羽毛球是我小时候唯一不能一个人玩的东西,那个时候我的羽毛球玩伴是我的表姐,其他人很少跟我们玩。我的表哥直接不屑跟我们玩。现在的人觉得打羽毛球必须得去羽毛球馆,光是地上画线不行,不仅画线还有网也不行,要保证灯光,要保证无风,要保证地面的材质足够防滑,但是当年的我们只要有一副球拍,只要有一个毛没有掉光的羽毛球,我们就可以一直下去。我也不知道是以前的羽毛球特别耐用,现在的羽毛球特别容易掉毛还是什么的,反正在我记忆之中,除非羽毛球飞到了树上拿不下来了,否则我们好像根本不需要更换羽毛球。我们从来没想过羽毛球居然是一个易耗品。如果乒乓球得换新,通常是不知道滚到什么地方找不到了,又或者不小心踩了一脚踩扁了。不小心弄凹的乒乓球还能放在热水里滚一滚,凹了的地方就会重新凸起来,虽然不再像一开始那么光滑了,但是还能继续打。虽然打到那个不平的地方,弹跳的轨迹肯定会有一些走样,但是相对于我家那堵凹凸不平的墙,那个不规则的轨迹根本不算什么。

现在的人之所以运动,之所以比赛是因为想赢想钱想奖品想荣誉想健康,但对我来说,那些让我着迷的运动只有一个原因,因为那好玩,因为那可以给我带来快乐。

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