2023-12
4

数据迁移卡壳

By xrspook @ 11:10:49 归类于: 烂日记

双11之前某个亲戚就说要我跟他一起去买新的华为手机。那到底他要买什么时候的华为手机呢?当时的mate6刚出,我不知道他心里的价位是多少,反正看完小米的再看华为,我就觉得华为手机的定价让我觉得很肉痛。再看一看手机的参数,我更加不明白为什么那个手机要卖到那个价格。后来当我看某些评论的时候,有些人说。之所以能忍受华为手机,是因为某些人根本就没用过其他的手机,如果用过其他安卓手机,估计就回不去了。

某个亲戚肯定是不缺钱的,但是不缺钱的人也会对花钱有所顾忌。华为的mate6系列,哪怕是最便宜的那个,我也觉得贵得实在太离谱了。他说要换手机的时候mate6刚出,还处在一个预售的状态,他去零售店问过。那里告诉他,如果要买mate6,得等三个月。为什么要先给钱,然后再等三个月呢?虽然可能只需要付一定金,不需要付全款。不是非常忠实的粉丝,绝对做不出这种事情,一个路人甲就更加不会干这种事情。当时一开始说小米手机是PPT手机,但是小米不过是一两周之后才发货而已,货是有的,但是以前的物流没有现在这么好,还有就是以前的仓库没有现在这么多。另外一些原因就是以前的手机都是得蹲点抢,手速的快慢就意味着发货的快慢。后来的小米手机不需要蹲点,不需要抢了。可能有些时候先付个定金再付尾款,在首发的时候买会便宜一些,但只要发货,正常情况下第二天就会到,哪怕是最近的仓库没有货,三天之内也会送到。所以现在卖手机的再也不能说小米是PPT手机了,但华为就是这个样子。

小米手机是如何换机的,这个我非常清楚。因为自从有这个功能以后我就一直在用,而且每一次都会比上一次更好。但华为手机是如何换机的?这个我就不清楚,理论上这应该是一个系统的功能,根据说那个东西做成了一个APP,就像一个第三方应用一样,反正在小米的应用市场是搜索不到手机克隆这个APP。因为我不晓得华为的数据迁移会遇到什么问题,所以最保险的方式是找一家华为的零售店,让店员完成这个操作。

去到珠影的门店,的确店员很快就才开始操作,一吨操作让人眼花缭乱,点击以后然后手机开始互传文件,之所以在互传之前有一个那个复杂的操作,是因为那部新的P60手机预装了很多第三方软件,夸张到满屏都是,而且有些还放进了文件夹,于是店员在互传之前就先把那些删掉,因为如果不删除的话,估计桌面的排布就不是原来那台手机的模样了。

数据开始传输没发现有什么问题,到30多GB的时候,据说已经传送了99%。我觉得亲戚的那台旧手机是128GB的,估计里面的东西超过100GB,因为过一段时间就会提醒他内存不足。为什么30多GB就已经传说传送了99%呢?两个手机都显示理论上还剩余一分钟的传输时间,但是那个一分钟却持续了一个小时以上。最后我忍无可忍查看两台手机的进程,旧的那台手机显示2000多条短信已经全部发送完毕,但是新的那台手机只接收的6条,其它显示正在传送中。就是因为那个步骤一直卡在那里,其它步骤无法进行,这是一个死循环。我第一次发现那个问题是在中午12:53,但是到下午13:04的时候依然这样,所以我们就问了一个又一个的店员,他们都说正在传输中,你只能等,但显然这种卡住,你等也没有用的,因为不知道是什么东西卡住了。如果那是一个很大的文件,还可以理解,但是那是一条短信,一条短信能有多大呢?最大的问题是一个手机说传输完毕了,另外一个手机说正在接收,信息不对称就很有问题。手机互传,理论上是不需要连接WiFi,跟店里的WiFi没有任何关系。店员在操作数据迁移的时候,也没有连接WiFi这个步骤。所以其中一个店员说可能是因为店里的WiFi性速度太慢,所以卡在那个地方,那样的回答肯定是不合理的。另外一个店员说,你只能在这里等,没有其他办法,这也是不合理的。这个数据迁移的设计就有问题,如果是这个步骤被卡住了,理论上超过一定时间,就应该暂停这个进程,开始另外的进程,但实际上却一直卡在那里,完全没有进度可言。

最后我的亲戚觉得忍无可忍,结束了互传。他的计划是回家再试一次,如果还是不行就另外找别的门店在再试。换了那么多台小米手机,我从来没有遇到过这种问题。手机的通讯录和短信理论上是最简单的,因为相对于大块头的APP资料以及图片视频等等来说,通讯录和短信肯定很小,有些短信可能不仅仅有文字,还有其他附件,但是也大不到哪里去。华为这种卡在短信传输上面的问题,实在让人觉得很无语,这种风格跟我们单位那批华为的WiFi如出一辙。突然间断掉,突然间丢包这种事情我实在太熟悉不过了。如果说单位的那些华为WiFi比较老,出现这种问题,可能我还得理解一下,但是这个P60的手机是2023年初才出的,怎么也会有这种问题?归根到底这到底是软件的问题还是硬件的问题?

反正我不用华为手机,这种事情我不用烦恼。

2023-11
9

隐藏属性

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

又是一个下班之后继续干,干到直接忘记写blog。如果不是这么着迷的话,理论上我会先烧水,把麦片泡着,然后打开语记开始口述blog,接着开吃,但如果我过于着迷,泡麦片的时候我会在那里写代码,吃麦片的时候也在那里写代码,吃完麦片以后往杯子里加水,等待水凉的时候继续写代码。可能那杯水我得花好几十分钟才喝完(一边喝一边写代码),也可能等我喝完的时候已经过去了一两个小时,又或者是我根本就不记得喝了。之所以要加一杯水,因为本来吃完麦片就得喝水,如果我不马上洗杯子,东西干在那里很不好洗,如果有水泡着就会容易些。所有习惯,只要遇上着迷于写代码这种事,全部都会变成渣渣,除了显示屏上的东西,身边的一切我都完全没办法放任何的注意力,除非是内急之类。写代码这种事对我来说通常是一发不可收拾的,完全停不下来,所以我没办法预测我得花多少时间,我知道我的目标是什么,但开始的时候通常我不知道具体该怎么做,就更加不好说得耗多久。之所以会这样,因为写代码不是我的强制工作,我不靠那个赚钱,没人要求我必须得那么干,纯粹出于个人喜欢。

光是写出来还不行,当我觉得效率很低的时候我会不断地在那里挣扎,到底有没有其它方法呢?还有没有其它的途径实现这种功能?

遇到问题,光在那里想,是不会有结果的,但只要干,埋头苦干,方法就会自己涌出来。大概是几天前,我不知道在哪里见过意思差不多的话,对我来说,写代码的时候会这样。如果我用的是python,因为我的目标很简单,所以绝大多数情况下都有现成的解决方案,只是那个方案是不是高效,能不能再提高一点而已。但如果我用的VBA+ADO+SQL,情况就很不一样的,因为VBA里的SQL被严重阉割,虽然理论上没什么东西是SQL解决不了,解决不了就输出到VBA的数组继续解决。我第一个接触的代码是CSS,然后是HTML。有段时间我迷恋于花俏的网页特效,有些联合CSS+HTML能实现,但有些不得不用javascript。当年我无数次想开始学习javascript,但一直都没开始。后来,我的大学课程里有C语言,我还考了二级C语言的等级证书。上机是满分通过的,但笔试70不到,所以我那张证书上只是合格而不是优秀。如果能重来,我会做到优秀的。但实际上,优秀不优秀又有什么意义呢,招聘的时候那不过是别人一扫而过的一张纸,甚至不会在别人脑子里留下任何记忆,但为了“优秀”那两个字我就得在上面付出很多,因为考证的考试范围大于大学课程的教学范围。

从我开始接触互联网,我的各种兴趣就没有停止过,写代码这事也一直贯穿其中,CSS、HTML、C语言、php、python、R语言、DAX、M语言、VBA、SQL,其实我也尝试过java,因为那是安卓的基础,或许还有一些我漏了没列出来。或许,码农是我天生的隐藏属性。

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
1

9月挺过去了

By xrspook @ 10:48:02 归类于: 烂日记

已经放了两天的假,但是这两天我依然不得不跟工作有紧密联系。9月30里的晚上,从8点多开始我就在忙工作,虽然其实单位的业务是9点多才结束的,但是能干的那些我都已经先干了,但其实我又没有全部干完,但即便这样的话,还是干到了晚上11点多。之所以没干完,并不是因为我差那么点时间,而是我觉得我得主动变得不那么主动,因为我把别人的事情都干完了,别人就不知道干什么好了。所以没干完那些事是我故意留下来的。但实际上把那些事干完才算是一个完整的闭合,能保证数据准确。

这个月末是我第一次用某个VBA的脚本自动给我粘贴那些量不少,但是没什么营养的东西,起码对我来说是没什么营养的,但是上面就是需要用某种格式输出让他们看到。过去几年我都是人肉进行格式的转换,然后人肉进行复制粘贴,上个月末我来不及做出来,但是思路已经有,所以在月头的时候我就已经把这个做了出来,试过没有问题,但我不确定使用的时候会不会还有bug,结果如我所料,的确是有bug的,其中一个包非常的无语,是复制粘贴没对上位,为什么测试的时候没有看出这个问题我也不知道。另外一个不能说是我的bug,因为数据太小了,如果是四舍五入保留三位小数,那个数在三位小数以外,所以就被零处理了,但实际上那不是0。最后一个bug,其实之前我也遇到过,那是一个关于替换时选择关键词的东西,在什么时候替换?关键词是什么?如果用一般的思路去考虑,就是那样,但实际上选择那样的关键词不准确,所以最终替换出来的不是我想要的东西。

总的来说,这三个bug虽然存在,但要纠正过来还是比较容易的。对我这个写脚本的人来说肯定是容易的,因为我知道那个思路是什么,虽然已经隔了一个月,具体不再那么清楚了,但是我还在我还是很清楚当时自己用的大概是什么样的方案。如果这个第一次不是让我遇到了,而是别人遇到了,这样的bug,可能就比较郁闷,最终就可能只能用回我以前的老方式,人肉去做复制粘贴和数据汇总。

8月我花了很多时间写VBA,9月份我花了大概一周的时间做统计分析,然后又花了一周多的时间去学习《深入浅出统计学》,然后接下来就进入了疯狂的月末。因为同事出去学习了一周,9月的最后一周又是跟中秋国庆假期关联的,同事提前两天请假回家了,所以我感觉后半个月好像有很多事,好像一直都很忙,实际上也的确这样,因为单位的业务仿佛进入了疯狂的高铁模式,而且是悬浮列车的那种。几乎可以这么说,完全突破了我的想象力,无论是车还是船,作业的数量都是让我觉得是空前的。为什么一天居然可以整那么多车?为什么装的那些船永远都装不完?每天作业的仓号最多的那天有19个。明明某个客户一天就只出那么几千吨,但是每天都起码有5个以上的仓房在进出。每个客户一个仓房,但是有很多个客户,又或者只有几个客户,但每个客户都动很多个厂房,这两种情况都会让我抓狂。因为这意味着明明作业量不大,但需要做很多个汇总数据。

但总算这个9月我挺过去了。

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