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,我并没有使用数组,而是纯粹在工作表的单元格之间不断循环。有些东西我一开始觉得是不是一句话说完,不搞那么多个变量会好一点。但后来发现变量多完全不是问题,如果你把一个变量以很复杂的句式表达出来程序会很慢,一开始的时候我犯的就是那个错误。搞那么复杂的句式不如再建一个变量,以走直路的方式表达出来。

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

2019-03
13

无数次掉包

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

昨天一大早又出现了Excel操作不了的事了。上一次遇到是上周一,因为电脑刚开我就急着操作,电脑给我显示Excel的加载项失败我也没有理会。当时即便重启,也没办法解决问题,后来是我只好拿自己的笔记本电脑干活,单位的台式机放一边不理。放了一段时间之后,台式机自己就好了。

昨天早上我又遇到了Excel的问题,这一次不是文件打不开,是打开了以后单元格没法编辑。准确来说是双击定位到某个单元格以后软件会显示未响应。通常来说,出现这种问题只要等个几秒钟就好,但我等了十几秒,甚至几分钟都不行。我当然会把Excel关掉再开,但无论关掉再开多少遍都没用。软件给我的感觉是不太灵敏,单元格无法操作,但是我却可以到达设置页面,虽然那里的反应速度也有点慢,但起码还可以开,还可以选择和保存。这到底是什么问题呢?发生状况的时候,其它东西也好不到哪里去,QQ直在转圈登录不了,同样经常彩色和黑色互相切换的还有坚果云。这种状况只能说明一个问题,单位的网络很不正常。如果一开始就脱机操作,我觉得反而不会有这种状况,但显然在没有脱机的前提下,我的Office软件是联网工作的,但是网络时断时续,就会导致软件有问题。单元格无法编辑的问题最终我也没有主动解决。那个未响应我放了几分钟之后居然就响应了。第一回好了以后后面就没事了,打开多少个文件都没问题。到昨天下午,我又遇到了打开缓慢的状况。同时间出现的还有我的坚果云经常从彩色变为灰色再变回彩色。于是基本可以断定,这种问题真的跟我们单位的网络状况非常有关系。第一次遇到以上问题的时候是上周一,说不定就是之前的那个周日他们更换了机房的交换机。自从换掉那个交换机以后,我就从来没有觉得网络正常过。在命令行界面,ping网页的话,经常是时断时续的。不止是外网,内网也一样,比如昨天傍晚的时候,我正在用着单位的内系统,突然间网页就打不开了,那个时候我马上ping单位的服务器,显示的结果是请求失败。几个请求失败以后,后面又通畅了。我经常会遇到打开一个网页load半天都打不开,但马上我又打开其它网页却没事。当我把第一个网页再刷新一下,马上又开了。这就证明,在我打开第一个网页的时候,我的网络是不通畅的。我的网龄已经超过了15年,过去这些年我从来没遇到过这种事,有些时候网速真的很慢,但慢归慢,网页还是能打开的,不过是时间久一点,不会存在有一些能打开有一些打不开,而且那些原因还不是因为我去了某些不该去的地方。上个星期当我把这个情况跟网管反映的时候,他觉得会不会是我们办公室用了交换机有问题,但实际上,上周末我在家里用VPN连接单位服务器的时候就发生过连不上或者连上了一段时间以后自己断开又重新连上的情况。这种状况跟我在办公室用网线连接台式机遇到的是一样的。为什么单位的网络会时断时续呢?在没换这台交换机之前,网络时断时续习惯性发生在单位布局的无线路由器上,明明路由信号很好,但网络就是不通,而这种不通又不是一直都不通,是时通时不通。在换交换机之前,起码当时用网线连接的电脑不存在这种毛病,但现在所有都神经病了。如果那个网页是允许刷新操作的,问题还不算太大,如果那个网页是得一次性操作到底的,中间突然掉包那就得从头再来了。显然,为了避免这种状况,我们宁愿用自己的手机流量去完成一些重要的事情。负责我们单位网络硬件布置和软件开发的公司据说还是全球第三大服务器供应商,但这样的烂效果还不如随便找个熟悉这方面的人过来整一整。

新的智能系统还没用上,已经在试用的硬件设备已经让人心凉了。

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