2019-06
5

用恰当的工具做恰当的事

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

有些人喜欢拿Word去做表格,有些人喜欢用Excel去画画,这都是神一样的操作,但是做前者的人却绝大多数不会看作是异类,但是做后者的人你就只能觉得他真是个艺术家。的确,Office的软件能解决很多问题,而且基本可以这么说,对一个中小型企业来说,你根本不需要其他额外的软件,光是玩好这套Office,就足够满足你所有的需要。前提是你的业务量没有达到百万级,但其实这个数据量我也是瞎掰的,因为实际上,通常我最原始的数据,一年下来不到2万条。从而不到2万的数据就可以衍生无数多的东西。Excel教会了我原始数据和汇总数据是两种彻底不一样的东西。在那些不怎么懂的人眼里,表格永远都是混搭的。最让我痛心疾首的是,他们把混搭的表格当作原始数据。于是你还得一条一条地把那些无关紧要的东西删除掉,有些时候可能你能找到规律,但有些时候,规律真的不明显。

如何筛选信息,把无关紧要的删除掉,对我来数这是一个必备技能,但对有些人来说那是高深的学问。你可以用Excel的筛选功能。但相比于Word,可以精准的使用通配符,显然Excel就没有了。我还记得,我的大学课程里有一门叫做文献检索,在那里面,老师介绍了国内国外常用的数据库。国内的数据库,查询大都是那样,最高级的要算是中国期刊网的,但是外国的那些,不同的数据库总有不同的通配符。你要玩转那些地方,就得记住某个符号在那里是怎么用的。在程序语言的世界里,也经常会用通配符,尤其在正则搜索。当然,在不同的编程语言下,这些符号又会有差异。回到之前那个Excel删除信息的问题,在软件的数据筛选里,可能你用的是某些组合方式,但是如果你用的是VBA,用的是写脚本的方式筛选,那又是另外一回事。最终如果你足够厉害,无论用哪个方式都能实现你的功能,但显然,对新手来说,你打算用软件自带的套路直接放到VBA里面使用,那就不合适了。也不是说直接使用就不能实现目的,但显然,如果你从机器的角度考虑。你就会明白其实你用了一个不怎么懂的人给你做翻译,虽然最终事情也能做成,但显然效率就不高了。还记得从前我选择理科而不是文科,原因是我觉得“学好数理化,走遍天下都不怕”就是这么回事,这句话就意味着那些符号在各地是通用的,但是语言就不一样。编程语言又跟一般的语言不同,编程语言在哪里都是通用的,因为命令的规则都是一致的,无论你说的是哪一国的语言,只有遵守那些规则,才能让程序达到你的目的。在编程的世界里,只有高端的算法,没有狗屁不通的语言障碍,因为实际上,跟你交流的不是别国的程序员,而是机器。暂不说现在的AI有多厉害,一直以来机器这种东西是最直白的,懂与不懂他不会给你一个尴尬的回复。机器最终只会给你两种结果,一个是你想要的,一个是你完全没有料到的。有时候,相比于跟耍滑头的人类玩,我更喜欢跟那些耿直的机器对话。

很多东西都是你越是深入,你越会觉得他伟大。

2019-05
16

自适应打印格式VBA

By xrspook @ 11:33:48 归类于:烂日记

昨天我只用了一个下午就折腾出了某个专门自动调节打印格式的VBA。相比于之前的尝试,这个算是比较快速了,而之所以可以这样,是因为之前我已经积累了一定的经验。昨天的快速是之前的龟速累加出来的结果。如果倒过来一开始我先做这个,然后再做那些的话,估计在这个上面我要耗很长时间。

这一次我并不需要对数据进行处理,我只需要改变格式。工作表的格式有些是直接可以看到的,比如说行高及列宽,而有些格式必须到打印界面才能体现的出来,比如说打印页边距、单色打印以及页脚。控制某个格式具体要用什么语句我不知道,如果我直接去查的话,估计要一段时间,所以我先录制了一个宏,然后从里面发掘一些我需要的东西。人肉定制和软件录制的区别在于机器录制里面有一大堆我根本用不着的语句,那些东西我不需要控制,所以如果人肉编写的话,它们可以全部都不存在。因为Office软件是外国人开发出来的,所以即便表面上看已经进行了汉化处理,但实际上代码层面他们依旧用的是外国人的思维。比如说打印设置里面的页边距,虽然在软件里我们看到的默认单位是厘米,但实际上看代码的时候他们居然把我们设置的厘米转换成了英寸,而且还保留了很长很长的小数位,估计是能保留多少个小数位就保留了多少个。这种逆天的操作只存在于录制代码的时候机器自动生成,如果是我们人肉操作,我们不可能写成英寸以及保留一大串的小数点数据。

昨天的那个VBA我首先是自己写了一些我力所能及的东西,接着是用机器录制了一段代码作参考,然后实行拿来主义,抄写过去。当我把东西合并起来以后,发现了一个奇怪的现象,本来我的代码针对的是工作簿里面所有工作表,但实际上有些工作表起作用了,但有些工作表却没有。在这个工作表里调用代码,但这个工作表有问题,其它的却没有。后来我才发现这是因为我把自己写的代码跟系统自动录制生成的合并起来了,但我没有在自动生成的代码里在人工加入某些语句,导致虽然在循环之中,但在执行某些代码的时候指代不明,于是就发生了一些我意想之外的事情。系统生成的代码几乎可以这么说,那不可以用于一个工作簿里面的所有工作表,从代码的构成就决定了这一点,而且相对于人肉写的代码,机器生成的代码有很多废话。但即便这样,机器代码还是非常值得人去学习,因为那就是机器的思考模式。

昨天的VBA耗费我最多时间的是在控制列宽上面。有些列是没有数据的,所以那些的列宽可以小一点,但是不能太小。因为太小的话表头的字即便进行了自动换行,还是有可能显示不全,因为那个表格在某些地方进行了单元格合并。如果遇到某一行,发生了这种事。。即便你使用了自动换行,也未必能达到你想要的效果。所以我的程序必须设定为在一定区域范围内有数据的单元格所对应的列使用自适应的列宽而其它列则使用固定列宽。自适应的列宽如果小于某个数值,也让它等于固定列宽。之所以要写这个VBA,是因为原始导出的表格列宽太大了,即便用A3纸打印上面的东西也很小看不清,更何况我要把它打印在A4纸上面。所以尽可能地缩小列宽是我写这个VBA的主要目的。

过去接近两年,我都以人肉的方式调整表格的格式使之尽可能地放大到A4纸上。现在借着VBA代码的东风,我终于忍无可忍,实现成功升级换代。

PS:有视频有真相!一开始我用手机录显示器,但摩尔纹简直让人崩溃。于是我就去找PC录屏软件,但要安装要注册要破解有病毒,最后,我用的是PowerPoint里的录制功能,真的很好很强大~这是我装了Office 365之后第一次用PowerPoint,实在太爽了!

2019-05
6

潜心写代码

By xrspook @ 17:41:34 归类于:烂日记

昨晚我本可以很闲,留出一大堆时间来做运动,但实际上我却耗在了办公室,坐在电脑前写Excel VBA代码。我也搞不懂这种选择对我来说到底是因为我懒不想动,还是因为我觉得在检查过后或者之前我总是很有冲动做这些需要思考的事比如说写代码。这种时候我的激情会特别澎湃,可能是因为紧张,也可能是因为放松。这种时候我更容易集中精神专注在一件事上面,而且因为在做紧绷的神经以外的事,所以对我来说那是另外一种放松,虽然实际上写代码这种事对我来说一点都不轻松。

上个星期我写了能够进行分仓汇总的代码,那个代码是汇总,会自动汇总工作簿里面除了文件名含有“总”字的工作表的某些特定区域。而昨晚我写的那个代码是加一个选择项,只汇总我指定的含有某些关键字的数据。因为我需要汇总的是账本,所以这里我选择的关键字是月份,而因为我做的那些账本只在月末有数据,所以我只需要指定月份就可以了。理论上在之前的代码的基础上,我应该不需要费太大的劲,但昨晚我却又耗掉了一个晚上大概两个小时多的时间。一开始是构思应该在哪里加循环、在哪里加判断,但当我把代码组合好以后却发现我没办法让某个单元格里的值与我的目标值以我设想的方式对比。首先是获取单元格的值我没有写好。当我把那个写好以后却发现从人的角度考虑,那两个东西已经是相等的,但是程序却判断那是两种不一样的东西。原因在于我用作比较的那个东西是用InputBox录入的,而如果不以方法的形式使用InputBox,InputBox获取到的东西是字符串,但我单元格里的却是一个数字,用数字跟字符串比较,虽然看上去一样,但实际上是两回事。如果不是在VBA里用逐行调试,我不会发现这个问题。同一个数字,有双引号跟没双引号是不一样的。所以后来我在录入数据后,在把单元格的值跟录入作比较的时候我进行了一个格式转换,把字符串转为数字。进行了这些操作以后,我终于达到了我想要的效果,我不确定这么干运行时间一定会比我汇总全部的更快。虽然最终汇总出来的东西肯定短很多,但是理论上要进行比较筛选更复杂。

在自动汇总了多个工作表的数据以后,实际上我还得手动用数据透视表对汇总出来的数据进行处理。通常来说处理方式是恒定的,但也不排除会有一些特殊情况。既然数据透视表能生成某些效果,我觉得如果在VBA上更进一步我可以直接生成一个直接就是我目标汇总形式的数据。但话说回来,这种方式虽然一步就位,但是在查错方面反倒不如数据透视表爽快。因为数据透视表除了能展示合并数据以外双击单元格你还能看到详细的源数据,但如果我一步就位显然就做不到这个了。又或者我可以在VBA程序里加入一个生成目标格式数据透视表的过程,这样估计就能两全其美。

数据的分与合当我能把握的很好的时候,我就再也不怕什么智能化系统几万年都上不了线,即便上线了也是满屏的傻瓜bug了。

2019-05
1

继续折腾吧

By xrspook @ 11:27:21 归类于:烂日记

软件设计出来唯有在使用的时候你才能体现出它的价值。昨天和今天我把自己写的两个VBA用了好多遍,感觉真的是爽歪了,但有些东西只有当你用的时候你才会明白到某些手续的必要性。

比如我写的第1个VBA,那是用来套打的,可以打一个工作表里面的指定行。一开始的时候我的思路是把要打的表都复制到有保存VBA的工作簿里,当时打印结果出来的时候我傻眼了。因为页边距的问题,所以打歪了。打了第1页以后,我就已经意识到这个问题,于是我修改了有VBA代码的工作簿,但即便这样,从其它地方复制过去的工作簿还是不以我理想的方式出现。所以最终我把需要打印的工作簿复制到一个别的地方,文件重命名,然后同时打开那个工作簿以及含有VBA代码的另外一个工作簿。在需要打印的工作簿下快捷键调用另外一个工作簿里的VBA代码。这样的好处是我不需要把VBA代码到处复制,只要我同时打开两个工作簿,我就能实现这个功能。一开始我是不知道的,虽然之前我已经看到过网上有人说可以这么做,这样做的好处就是不需要到处复制VBA代码,因为在Excel里面,2007以上版本里最普通的xlsx是无法保存宏代码的,如果要保存宏代码就必须使用xlsm,当然可能如果你把它降级为2003的版本就可以在里面保存代码。显然最普通的工作簿里面不允许你默认打开或者保存使用宏代码能提高了文件的安全性。自己用的宏代码放在一个自己的文件里,需要在别的文件调用的时候同时打开工作簿,这其实也很方便。自己的工作簿设置的宏快捷键在其它工作簿也一样可以用这很爽。这些东西在我写代码的时候我没有想考虑过。因为我只是个新手,不可能一开始就那么周全。

我写的第2个VBA是用来汇总数据的。理论上我还需要添加一个筛选的功能。这样的好处是每次我不需要把每个工作表里面的所有内容都复制到大表里,而是先进行筛选,然后再选择性地复制过去。这可以减小文件的体积以及代码运行的速度,但另一方面,其实筛选也是需要时间的,是全部东西拷贝快一点,还是先筛选再拷贝快一点呢?对我来说,因为我的数据不算太多,所以目标以外的东西我完全可以视而不见,但是如果我把这条代码给别人用的话,或许先进行筛选然后再复制会更合理一些。设定筛选会让我落入另外一些烦恼,筛选范围是个问题。最简单的当然是某个指令数字的筛选,靠谱一点的是某个范围的筛选,但某个范围又分为了连续以及间断。显然要全部满足这些,从逻辑上我还没想通。在非大牌软件里同时满足这几种东西的貌似我还没见过,所以我没想通可能是因为要实现这些有难度,但并非不可能。比如在设定打印页面的时候,我就可以用单数字,连续数字或多数字实现我的要求,所以这个功能是可以做到的,只是我还没想到应该如何实施。

折腾是一个没完没了的过程,但我会乐在其中。

2019-04
30

写出我的VBA

By xrspook @ 9:39:13 归类于:烂日记

自己有多努力自己知道,别人有没有感觉到无所谓。那就像减肥一样,一开始的时候,身体些许的变化只有自己明白,比如整个人不再那么嗜睡了,身体的围度在减少,主要的体现是衣服或者裤子的哪个部分松了,又或者是爬楼梯或者做其它运动的时候不再那么容易累。别人看到你的改变大概是在当变化接近5公斤的时候,如果你根本没有那么大的基数或许你要控制的目标体重根本和开始的那个体重相差不到5公斤。所以说自己的状况只有自己明白。对我来说,当我弯腰坐着的时候不再感觉到肚子上折叠了肉肉,我就知道自己的减重有成效了,另外一个方面有可能是大腿或者屁股的某个部位不再那么紧绷。相对于几年前,我觉得现在控制体重比当年难多了。我也不记得从前大腿或者臀部围度发生变化是开始持续运动多久以后的事,反正现在即便我觉得自己已经在努力,但那两个地方还是坚决不改。不改就不改,反正只要身体总体的感觉在向好的那方面发展,肥肉堆在那些地方其实也无伤大雅。我不是那种靠脸吃饭的人,身材只要不要太过分我觉得一点问题都没有,但如果那些地方已经堆积了很多,甚至于蔓延到全身的其它部位,发展到一定程度的时候,我会觉得无法接受。接着我会开始下一轮的稍微克制,但是克制一段时间以后,我肯定又重新开始过放纵的过日子。

昨天下午上班的时候被告知今天检查组不来了。其实总的来说,我准备的东西已经足够了,没有什么可以再准备的,我只是等那帮人过来,而在那之前总会有各种的紧张。知道他们这个月底不来,五一节以后再来的消息以后,我彻底丢下了那个紧张的包袱。过去好长时间我都没有主动去写符合我需要的VBA程序。之所以要学Excel VBA,就是因为有些功能是数据透视表做不到某些个性化的需求。在那个明细数据与汇总数据混乱的表格里,难以用简单的方法把该合并的合并出来,即便我用的已经是最新版本的Office 365。虽然在数据提取及组合方面,最新版本的Office已经比前代强了很多。昨天我用了大概一个下午两个多小时的时间写出了我想要的那个效果。虽然那个东西的运行效果在加了某些句子以后慢得让人有点难以接受,于是我又用了好几个小时的时间对程序进行了优化。到晚上8点多的时候我终于把东西整了出来。最终的成品我挺满意,因为一个有900多条需组合的数据的100个工作表的工作簿里,用我的VBA程序提取汇总耗时不会超过两秒。在我优化之前,即便只有80多条需要合并的数据数据也需要起码10秒的时间。以前写C语言程序的时候,我从来没有感觉到用不同的表达方式效果会差那么远。大概因为从前我处理的数据没有现在多,而且在C语言里。除了单个数据就是数组,但显然我在Excel里使用VBA,我并没有使用数组,而是纯粹在工作表的单元格之间不断循环。有些东西我一开始觉得是不是一句话说完,不搞那么多个变量会好一点。但后来发现变量多完全不是问题,如果你把一个变量以很复杂的句式表达出来程序会很慢,一开始的时候我犯的就是那个错误。搞那么复杂的句式不如再建一个变量,以走直路的方式表达出来。

做同一件事为什么有些人需要不断地通过加班完成,而有些人却可以潇洒地准时下班,甚至在上班的时候也在摸鱼。工作效率高低决定了这一切。而我觉得提高工作效率这种事你需要反复地思考和实施,直到进化出一种最适合你的方式。别人曾经把精力投放在思考和实施上面,但你却从来没有在那些方面努力过,于是某些加班纯粹是活该。

Page 1 of 212»
COPYRIGHT @ 我的天 | Theme by xrspook | Power by WordPress | Valid XHTML 1.1 and CSS 3 Go to top