2023-08
4

又绕到了VBA

By xrspook @ 8:37:44 归类于: 烂日记

习惯了用VSCode写python以后回到VBA,感觉怎么整怎么都不对。首先相对于python来说,VBA的编写规则好像有点八股,因为那些专有名字总是老长。有一些让我想不明白的是某些东西为什么就不能先存储在某个地方,往后在别的地方调用?比如复制,理论上是很简单的事情,就只是从这里到那里而已。在python里,你喜欢怎么整就怎么整,但实际上你要用VBA控制Excel,做一个复制,远远没有你想象中的那么简单。对python来说,数据是没有格式的,没办法决定这一串数字到底是什么颜色、什么字体、大小、背景是什么,但是Excel的单元格有这些东西,你要复制一堆单元格到别的地方他默认就会把所有格式都带上,但实际上你不过想贴一个纯粹的文本或者数字而已。因为这样你还得在复制粘贴的时候用上其它东西去强调说明,而一旦有这个强调的操作,这就是一个特殊的复制粘贴。复制英文是copy,如果你直接把一堆单元格copy到另外一堆单元格,就会把所有格式都一起带过去,如果你不想干这种事你只想要数据本身,你就得把你原来的那部分单元格select,然后对select的部分做copy,最后在其它需要粘贴的地方再用特殊的粘贴方式。所有人都觉得最直观的方式点copy,当你要实现最纯粹粘贴的时候却无法做到。

copy本身很简单,是我们理解的很简单,但是对Excel的设计者、对VBA所控制的东西来说,copy实际上一点都不简单。昨天有段时间我曾经想过,能不能在某个单据格式改造的时候直接在VBA里做分组,然后得出汇总。但是我又非常明白,VBA本身是没有类似pandas的那种dataframe的东西。PQ和PP都有类似dataframe的东西,所以你不需要很努力一个一个数据去处理,不需要考虑其中的数组,你只需要操控好行和列的盘曲折叠就可以了。但是在VBA里,效率最高的一定是数组,数组没办法给你判别行还是列。在增加数据的情况下,你还不能在行业里增加,你必须把行列转置,然后在列那里增加,最后再把它转回行,这个东西很绕。虽然行列转制这种东西在pandas跟PQ里都有,但是在增加行或者增加列的时候,远远没有VBA的数组那么绕,于是你就可以花更多的时间去考虑我到底要怎么折腾那些东西,而不是在数那些东西到底有多少行多少列,我要增加什么,该如何插入、得插入多少。

C语言考试的时候我也是这么被C语言的指针搞得迷迷糊糊。如果我可以把C语言的指针玩得很溜,可能我对VBA的数组操作就不会有太多槽点了。可以肯定的是,当年的我跟现在的我对数组操作都比较畏惧……

因为不想用VBA去加工数据,所以我临时干的是用PQ做汇总数据,然后用VBA把得出来的数据精确地按照需要的格式生成文件。虽然实际上这样不过是点一下变成多点几下而已,但我觉得如果我能在VBA层面就完成了汇总,我就不需要 PQ运行的那几秒钟。我抠门的不是鼠标多点几下,而是刷新PQ那几秒钟,所以我还会在VBA上努力的。

2020-08
14

垃圾评论,滚!

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

习惯了用python以后要我写php的代码,我各种不习惯。为什么变量前面要加个“$”?为什么要写“{}”这种东西?为什么居然可以乱七八糟不缩进?python估计是不用数组表示东西的,但实际上,在历遍的过程里有数组,而php这东西貌似不像python那样分列表和元组,字符串是肯定有的,字典可能也有,但这个我不确定。在计算某个东西长度的时候还得纠结到底我要分解到什么程度,我不就是要计算一下数组里元素有多少嘛。可能是我使用的方式不对,print_r的确把数组表达出来了,但一坨东西各种嵌套,你给我个缩进好不好,我都分不清谁是谁了。python里计算长度用len(),我已经用得很熟练很爽了,到php里变成了count(),如果数组里还有数组,也要算出长度还得加参数。不得不说,数组这个东西挺让我头痛。记得从前学C语言的时候我就挺烦数组这个东西,我感觉自己一直没学好。当我接触了python,让我明白到其实数组不就是那些东西,为什么就非得用索引号把他们定位表示呢?直接把数据按照数组的排列方式直接表达出来是可以,json就是这么玩的,那是一个混合长度的数组,同样的事情也可以发生在python的列表、字典和元组里。好像在C语言里数组的长度得一开始就设定好,现在看来,我觉得这样不好,因为有些东西的确是很难一开始就想清楚的,搞太小了,放不下,搞太大了浪费空间。学习各种编程语言让我明白到原来某些我觉得参不透的东西其实可能没必要一定用那种思路。

之所以要死磕php,因为我有点讨厌WordPress里的垃圾评论。虽然官方自带的Akismet插件已经免去了我很多烦恼,但还是会有些漏网之鱼,所以我的垃圾评论列表里总有东西,看着心烦。那些垃圾评论虽然不在前台显示,但是在导出数据里会看到,浪费我的空间。对付垃圾评论的方法有很多,插件大法是最适合小白使用的,WordPress自带的规则也能让评论不被摆上台面,但我想做到的是根本不让那些东西写入我的数据库,没有写入就不需要删除,不适合的东西直接滚,减轻数据库的负担。虽然呢,我的小网站向来没什么流量,不会负载超标之类,但每当网站很慢,发布个文章都等半天都开不完的时候我就会暗暗觉得是不是被垃圾评论拖累了。综上所述,所以我选择的垃圾评论对抗大法是“Akismet + 自定义代码”。Akismet这个东西是安装完WordPress以后自带的官方工具,启用、填API就好。自定义代码需要在WordPress模板的functions.php里加入一些东西。网上有很多教程,但哪个才最适合自己得自己试过才知道。评论里可控的参数可以参考comments.php。我的防垃圾评论自定义代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function refused_spam_comments($incoming_comment) { 	
	preg_match_all('/http/', $incoming_comment['comment_content'], $link); // 有两条或以上超链接的,滚!
	if(count($link[0])>1) {
		wp_die("垃圾评论!!!"); 		 
	}
	$ruattern = '/[А-я]+/u'; // 俄语的,滚!暂时我还没见过大批量日语、泰语、阿拉伯语的
	if(preg_match($ruattern, $incoming_comment['comment_content'])){
		wp_die( "垃圾评论!!!" );
	}
	$name = '/Henrylix/i'; // 中文广告
	if(preg_match($name, $incoming_comment['comment_author'])){
		wp_die( "垃圾评论!!!" );
	}
	$mail  = '/(jjgfqijpo)|(.ru)/i'; // 其它广告
	if(preg_match($mail, $incoming_comment['comment_author_email'])){
		wp_die( "垃圾评论!!!" );
	}
	return($incoming_comment);
} 
add_filter('preprocess_comment', 'refused_spam_comments');

WordPress自带的评论规则里有超链接超两条就自动不显示,自动落入待审核的垃圾评论,但这样我还得去清啊,直接不让进更好,貌似我没有在其它防垃圾评论代码里见过这条。很多教程里“wp_die”那里用的是“err”,我不知道其他人怎样,反正“wp_die”我用得挺好,前台后台都正常,但“err”前台后台都不行。有些人这样,有些人那样,是不是跟不同的WordPress版本有关呢?这个自定义代码只是暂时的,我还得根据垃圾评论继续调整,debug的过程永无止境。

我感觉会了代码,人生才算是有了主动权。

2019-07
9

牛逼的数组

By xrspook @ 10:36:42 归类于: 烂日记

我把《别怕,Excel VBA其实很简单》这本书看完以后我才发现自己略略明白到了数组的牛逼之处。在书本的某些章节提到过数组,但没有很详细地展开。毕竟在Excel的VBA里,即便你不懂得数组,你也依然可以得到你想要的效果,只不过用数组跟用其它方式对比,其它方式的效率会差了一大截而已。直到我把这本书看到倒数第几页,他们举例子的时候,我才恍然大悟。看书的时候我并不觉得不用数组有什么问题,毕竟那些思路都是很明白的。暂时来说,我要解决那些问题在高手的眼里不过是小菜一碟而已,只不过对我这个新手来说,必须得费九牛二虎之力才能解决而已。

如果只是用Excel的VBA做一些格式的转换,尤其门面工程的格式转换,根本用不着数组这种高端东西,但是,如果要对批量的数据进行处理,比如说筛选或者转换,数组的效率要比频繁地操作单元格高效很多。当然,如果你的处理量很少,比如说,数据在一页纸之内,用不用数组都无所谓,反正都是秒杀出结果,但是,如果你要处理的是几十个工作表里面的几百行数据。用数组处理就意味着如果你的程序得当,可以秒杀得到结果。我这里指的秒杀,是答案会在0.5秒之内展示出来。通常来说,人的反应时间是0.2-0.3秒,0.1秒的差别几乎看不出来。而之所以我有这个猜测,是因为我做过字幕时间轴的调整。如果字幕的出现和消失完全按照音频音频来,你会觉得那人开始说话了,但是还没有字幕,或者那人的话还没说完字幕就没了,或者字幕消失得很着急,所以,通常来说,在正常语速的情况下,字幕要比音频早起码0.15秒出现,结束时间则要控制在音频结束后0.3秒左右。结束时间到底要延迟多少主要看说话人的语速,如果那是很干脆的一个词,又或者那个人说话非常快,那么这个结束时间得控制到0.15秒以内,但如果那个人说话很慢,又或者他磨磨蹭蹭,每句话之间都要间隔一段时间,但实际上那句话是连续的,那段字幕的结束时间可能要跟下一句话的开始时间连上,0.5秒的延迟很正常。某些情况下,你甚至会觉得0.5秒太少。如果Excel通过数组完成一个转换用时不到0.5秒,对普通人来说,那是稍微顿一下的功夫而已。而昨天,我写的那些运用了数组的汇总程序在处理80多个工作表300多条数据的时候,如果要加上最后的删除空白行,尚且用时不到0.4秒,如果去掉删除空白行的功能,那么总用时将只需要0.2秒不到。0.2秒是什么概念?那就几乎等于鼠标按下去,你觉得结果马上就出来了。这就是我想要的秒杀结果。。

在Excel VBA里使用数组,我上个星期下半段才开始研究。没人强迫我必须得这么做,但是我觉得这非常有趣。对高手来说,这根本不算什么,但对我来说我觉得这是个非常牛逼的效果。其实能用Excel的VBA把那些数据自动汇总出来已经很可以了,一两秒钟的运算时间其实也不算很多,但是,当我发现了数组可以让这个功能进化很多的时候,我兴奋不已。其实,做的时候我完全没料到数组居然可以这么高效,虽然我知道它的用时肯定要比一般的方法快很多,一开始我以为可以达到10倍以上,但实际上还没到那个程度,不过这已经很鼓舞人了。

还是学生,要去考试的时候,我还是没有很好的掌握数组,但现在我对那个东西算是有点感觉了。

2019-07
8

RUN NOTE

By xrspook @ 22:45:12 归类于: RUN NOTE

星期一 2019-07-08 20:55
平均心率111,最高心率131,平均配速548,原地跳。我明明可以早点开始的,但心里牵挂着要把库存汇总的方式以数组的方式表达出来,于是就先去做那个了。我明明知道那个东西不是十几分钟就能折腾出来,但我还是毅然开始,结果呢,投进去了1个多小时。按照正常人的思路,我应该白天有空的时候去折腾,但显然我这个急性子没办法控制住强烈欲望的冲动。#xrspook未行够#

2019-06
25

VBA入门毕业

By xrspook @ 9:50:42 归类于: 烂日记

做天我把《别怕,Excel VBA其实很简单》看完了。感觉居然是原来这就结束了,但实际上,我好像有些东西还没掌握,所以我估计要把那本书再看一遍。虽然看这本书的时候我已经是一边看一边写。因为那些公式术语之类的,必须记下来,然后才有后面的运用。但虽然自感我已经写了很多,但是有可能因为看书太断断续续,所以实际上有些东西我还是没有记住。把书看到最后的时候我才发现原来在跟Excel数据库玩游戏的时候利用好数组非常重要。那本书最后那个例子是在1万个单元格里面输入1万个数字。原理很简单,实现方式很直白,但是用数组的方式录入比用常规的单元格录入效率相差一大截。数组录入的速度是常规方式的20倍,当然这只是一个大概估算,但显然,两种方式的效率差别很大。反观我自己写的那些脚本,我完全没有考虑过用数组。因为我没想过可以怎么使用数组。使用数组意味着你必须对界限这种东西非常清楚,但其实在不用数组的时候,我也是需要明确界限。如果我使用了数组,或许可以把之前需要用一两秒才运行出来的脚本进化为电光火石眨眼间之内结束战斗。

的确,昨天看到那个对比以后,我回去审视自己的脚本,但暂时来说,我还没想到可以怎么用数据去写。所以,我要把那本书讲到有关数组的地方再读一读。

写了这么久的VBA,但是每当要我准确地说出单元格位置的时候,我总要思考半天。因为用Range和Cell的时候,二者的坐标轴顺序刚好是相反的。那两个经常把我搞糊涂,所以当数组也插一脚的时候,我就更迷糊了,这三者的关系我必须搞清楚。这是做其它一切的基础。

还记得当年学C语言的时候,数组对我来说就是一个难点,貌似我一直都没有怎么想通透那个东西。在Excel里,有时最简单的一维数组可能就够了,通常来说二维能解决大部分问题,但说不准什么时候需要用到更多的维度。当年之所以把我搞迷糊,是因为那些维度总是让我摸不着边。我觉得三维已经是我的极限,更多的维度该如何表达我小小的脑袋思考不出来。现在我觉得其实我根本不用想象出具体的空间结构是如何的,我明白那种层次的关系也就可以了。

Excel这东西无非是玩好几个,文件夹基本上已经算是最大的范围,接下来是工作簿、工作表、单元格,以及单元格里面的具体东西,Excel就是控制好这些东西。VBA之所以牛逼,是因为它可以把很多重复性的东西批量完成,但是你要把命令写到位,那个软件才会以你设想的方式运行,并得出你想要的结果。玩好这个东西是为了我们以后做具体事情的时候不必那么埋头苦干地重复劳动。但在此之前,我们必须理清我们干那件事所需要的全部逻辑。就像一个高级技术人员,他或许不需要做一些非常实际的工作,但那些最基层的实际工作,他必须全部都吃透明白。

现在我才刚入门而已,从入门到基本上手是一个漫长的过程,就更加不用说往后更高层次的灵活运用了。

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