2008-7-11 星期五 终于又完成了一个独立的模块。这一个模块是对每日下载的邮件、小信封进行登记、编号、搜索、打开调用。通过这个模块的编制,基本上掌握了VBA对文件的操作技巧。 心得: 1、 VBA 对文件的操作既可以利用标准功能,也可以利用文件对象模型,我觉得这两者可以结合使用。我的方法是: 先用 subfolder 调出指定目录下所有的子目录, 然后用 getfolder().file 取出每一个目录下所有的文件, 然后用 getbasename 取出每一个文件的基本名, 再用标准功能的 filedatetime 取出文件的修改日期。 再把对这些文件的信息(文件基本名、修改日期等等)进行适当的处理,存入sheet里面。 为了能够调用这些文件,在登记文件基本名之后,把该文件的超链接也写入文件基本名所在的单元格。 掌握了对文件的操作技巧,我感觉 VBA 的编程更加灵活了,所有的模块都可以单独写,然后进行简单的拼装就可以了。 而且,理论上说,可以在excel里面对整个电脑的文件系统进行操作,换一句话说:完全又可能把 Excel 做成一个绝对个性化的【资源管理器】。 ——当然这只是理论上可行,应该不会有人这样干的。 2、文件的记录总是不断更新的,因此,每一次更新都需要检查是否已经做了记录,而这个比较的过程很难把握。如果不加限制,我粗略估算了一下,程序在极限情况下要循环将近一百万次,这显然是不现实的。因此,先对记录进行排序,然后设定一些条件进行比较,使得这个比较的过程被限制在很有限的范围内。如此程序才是一个切实可行的程序。 所以说,写代码并不难,难得就是设定这些条件,你得考虑如何根据实际的工作需要去设立。 即便如此,最终的代码也还是很复杂,4层的for循环是家常便饭,for 循环里总是少不了分支,分支里差不多也都嵌套着一个for 循环。为什么会如此复杂呢? —— 我觉得,一个真实的程序(而不是教科书上的程序),总是对应着实际工作中很多的细节需要,这些需要基本上不会是单一的,而是复合的、交叉的,所以,程序为了避免各种错误的操作,就不得不考虑 N 多的操作可能性,为这些可能分别编写分支。 for循环是计算机的精髓,而如何使得for循环的次数减少则是算法的精髓,让for循环次数减少的关键,也还是来自于实际工作中存在的诸多限制,利用这些限制,我们可以极大地压缩运算的步骤。这些限制,就是我们在实际工作时的边界条件,如何设定边界条件,是很有趣、也很烦人的一件事。 3、制作了一个模仿 google 风格的搜索界面,每一次搜索的时间大约3~5秒(还是比较长的),在搜索过程中,屏幕象死了一样,因此,又编了一个进度条,这样等待搜索结果的时候就不会觉得枯燥了。进度条的运用使模块看上去更加象那么一回事,自我感觉非常得爽(^_^)。 4、但是进度条的使用也带来了一个新的问题:为了使用进度条,就得引入新的窗口界面,并且得把搜索的代码写在进度条的窗口里,由于搜索的结果是一个范围,这个范围是用数组进行传递的,于是就出现了这样一个问题 —— VBA 提示“数组不可以作为公共变量”。为了不影响编程的进度,折腾了一会之后,我用起了 VBA 编程最后的那根救命稻草 —— 通过sheet表进行数据的中转。 把搜索的关键字通过“”(空格)进行拆分,放到65535行里,把搜索的结果(记录的范围)放到256列里,每次搜索前、搜索完毕之后,及时把记录清除,如此根据关键字搜索的功能就顺利实现了。(11日晚上写这个搜索功能,前前后后折腾了将近4个小时。) 5、编写这个模块,耗费的时间比例和以前很类似: (1)、构思表格(记录的格式)、初步构思界面,1天; (2)、精确构建界面,3~4个小时; —— 这两步基本上决定了你所写代码的复杂程度。 (3)、编写核心代码,使得模块能够初步运行起来。一般而言,这包括窗体装载和激活时的初步设置、窗体要显示的各项内容、翻页、记录的修改和添加、必须手输的数据录入界面(能用组合框的尽量用组合框),窗体退出时的设置。编写这个模块一般都在半天左右。 (4)、调试 —— 这又是一个漫长的过程。前前后后时间累计约8小时。一边调试,一边不断地修改代码,有时甚至要对整段的代码段进行重写。而且常常会在调试的过程中,发现需要增加一些功能,也就是要整段整段地添加代码。 如此,编写一个独立的功能的时间比例是: 构思:入手:核心代码:调试 == 5:1:1:2 可见,编程的过程是一个两头大、中间小,开头比结尾大的过程。而最重要的,还是开始的酝酿和构思的过程,这个过程决定着从局部模块到整个系统的水准。 |