写给VBA初学者的随笔: 相信, 实践, 理解(二)
接前文……
两条腿走两路的VBA
1:'命令式'
一条腿利用office'内置'对象方法(Find,Atuofilter等等),甚至是Wroksheetfunction来完成程序任务;
2:'语言式'
另一条腿读取单元格内容到内存数组,利用VBA的程序语言功能来执行业务逻辑,最后写回单元格。
'内置'的问题要稍微说下,VBA作为脚本寄生于Office,其存在的方式是内置,但与Excel数据并非直接无阻交互,仍然要通过COM接口提供的一套对象与Office进行交互,在这一点上并非VBA独享,任何其他基于ExcelCOM类插件都可以调用,
所以从交互角度来讲,VBA并非与Office无缝契合的内置存在。
显然论坛很多帖子的内容在第2条路上走的太远了,无所不用其极。计算机系的科目搬到VBA中来,VBA内置没有的数据结构再造一个轮子、多媒体应用,VBA实现不了的用API,其他语言擅长开发的内容扩展到VBA里来,林林总总诸如此类'屠龙术'打造的'牛'贴随处可见。甚至把第一条路视作'低级','初级'应用原因就是它容易,在初学者面前营造出这样一种氛围:
'哇,Excel,VBA还可以这样玩?太强大了!'
'哇,Excel,VBA真是博大精深,深不可测,无所不能!'
'牛,职业的吧?科班出身的吧?'
手段和目的,工具和应用,技能和学问,价值取向基本背离了Excel VBA的初衷。MS在VBA加几个内置的数据结构难吗?很轻松,但为什么不加呢?
人们潜意识把'难'的,'高深的',但不常用的东西划分为'高级','容易的'而常用的功能定位于'低级'。VBA设计的初衷就是“简单易学',结果'精英'们大有不把'容易'搞'复杂'誓不罢休的架势,背道而驰。
那么何谓'高',何为'低'呢?与其说深入学习,不如说是在挑战Excel VBA的极限,更不如说是在进行一场无意义的挑战自我极限的游戏,轮回的终点仍然是起点。
插播小故事:
有一位年轻人依靠着一棵大树晒着太阳,神态怡然。有一位过路人从此经过,好奇地问道:“年轻人,如此好的阳光,如此难得的季节,你不去做你该作的事,懒懒散散地晒太阳,岂不辜负了大好时光?”年轻人答:'干什么该做的事?'
过路人:'去努力工作呀'
年轻人:'工作为了什么呢?'
过路人:'工作可以挣很多钱呀'
年轻人:'挣了钱以后呢?'
过路人:'挣了钱你就可以买房买地'
年轻人:'那然后呢?'
过路人:'之后就可以娶妻生子了'
年轻人:'再然后呢?'
过路人:'你就可以在这晒太阳了'
年轻人:'我已经在这晒太阳了呀'
应用是目的,作为辅助性手段的工具本身直接演变成了研究目标。Excel,VBA作为技能它不是学问也永远成为不了学问,演变的结果:技能当成了学问来作。
函数版帖子表现的淋漓尽致,目的早已经实现,为节省几个字符消得人憔悴?灵活使用Excel函数,穷尽掌控VBA之极至,成为了终极目标,在沉迷中已经
分不清是'玩Excel'还是'被Excel玩'。
话从来不敢说得太重,就怕伤害热情坛友的感情。<我的团长我的团>中有这样一句台词:
'上天宠爱骄傲的人,给他们一颗永远孩童的心。我说的不是天真淳良,是他们永远只顾自己的喜好厌憎。
他们爱死了虞啸卿和那个能让他们全体丧命的作战计划,他们有多爱那个计划就有多恨我们。
验证勇气很难,表现勇气就只要对我们同仇敌忾。虞师绷得像弓,今天断了弓弦,没人想你也许救了他,人们只恨拿走了希望和信心的人。'
VBA的'优点'和'缺点'--弱化的可比性
对比是存在的根本。VBA的优缺点是和其设计定位紧密联系的,是相对于其它对比对象而存在的。抛开定位在其适用范围之外与其它开发语言比较来谈VBA的'缺点',这种比较本身就是有失偏颇的,因为它就不是为了开发而设计的,所以也就无所谓什么'缺点'了。同样,基于设计出发点的用途和功能也就不能称之为'优点'了,本身就是干这个用的,又何来优点?但这些的确可以作为VBA的特点。
听起来比较混淆,就用2个单词作为标记更容易区分些:Advantage,Feature。其实称谓不重要,也没必要较真分的那么清。重要的是和定位联系起来看待VBA的存在及其特点。
1:作为程序语言和其他开发语言比较,VBA的特点:
(1)'天然'强大的输入输出平台
对着'大黑框框'学程序一学就是几年,太没成就感了,什么样的控件能有Excel强大呀。
(2)使用便捷
无需搭建任何环境,IDE,调试器(debugger)齐全;Office装机量大,VBA到哪儿基本都可以拿出来用,就像哪部电脑都有浏览器一样,JavaScript随时可以用;
无需保存,编译,即可运行;代码数据一体化(同时也是'缺点'),发布简单,无需运行环境。
与其它自动化操纵Office的方式相比,与COM交互更加容易便捷。
(3)简单易懂,门槛低,学习周期短
为了完整性,还是罗列出一些所谓的'缺点'
2:VBA的'缺点'
(1)不好封装
(2)需要宿主解释器的解析,所以速度慢
(3)安全性差
(4)无法提供面向对象的结构式编程方式
(5)单线程
(6)................................
概括起来基本上涉及底层,大型应用的方面根本做不到,较为复杂点的应用系统在与数据库结合后并非不能做到,但仍不适合。上述'缺点'基本上是脚本语言具有普遍性的'通病',显然VBA就不是针对完成上述功能而设计的。但相对于寄生于Office的脚本来言,VBA是唯一的存在(VSTO不是这样的方式),独此一份没有可以比较的对象,所以优点就无从谈起。
本楼准备写点儿平实但或许对新手有用的东西,避免前面几楼'假,大,空'的问题。先从新手常见问答(FAQ)开始吧,这些问题都是论坛(不止是这里)常见学习过程中的疑问,仍然不涉及细节问题,只谈认识。在开始之前按照惯例还是稍作声明:
'适合'与'正确'
正如之前所讲,对于新手的疑问,稳妥的答案通常相对是'正确'的或者说是'标准'的,因为它是全面的。'包罗万象'的分情况讨论是得出所谓'正确'答案的唯一途径。
由于很多情况新手未曾遇到过,没有感性认识,难以理解,容易造成困惑和纠结。左右逢春可以变成模棱两可,唐僧式的阐述可以导致索然乏味。
'正确'的未必是'适合'的,'适合'的可以是'正确'的。(这里要展开的东西太多了,就不唐僧了)我希望简洁,明确,错误概率小的答案,个人认为这是'适合'新手入门的。
'Believeit,Doit,Knowit!'--'相信,实践,理解'
然后就会把握什么是'正确'的答案。ExcelHome论坛精神:Let'sDoItBetter!',我更想传递的思路是:'Let'sDoIt'RIGHT'!'。
插播调味小贴士:08奥运期间很多品牌征集英文翻译,最经典的莫过于:狗不理=GoBelieve。
新手FAQ
【Q】:'数学不好,能学习VBA(编程)吗?'
【A】:完全可以。
【注释】数学不好自然不会去写涉及与数学相关的应用程序,一般应用程序不需要有数学基础。
加减乘除都不会的话,那是不会算数,不能算成数学不好。
【Q】:'不会英语,能学习VBA(编程)吗?'
【A】:能,有障碍可以克服。
【注释】不会英语对于学习不同的程序语言造成的障碍稍有不同。主流语言多用操作符来搭建语法,而VB多采用'说话式'的语法显得有些啰嗦,不够简洁。
诸如:Then,Is,Not,Nothing等等这类的英文单词很多,就是为了一看就能理解关键词的含义并且组成句子。所以简单易学是针对英语用户的,会说英语就能上手是打造VB语法的初衷,结果对于非英语用户反而造成不小的麻烦,让老外学习易语言,估计要疯了。不会英语或者英语不好对于学习VBA并非不能克服,毕竟要用到的关键词,对象属性,方法只是英语单词中非常微小的一部分,用习惯了自然就不会成为障碍了。退一步讲,英语都可以学会,更何况编程中要用到的一些关键词呢。
【Q】:'文科出身,能学会VBA(编程)吗?'
【A】:当然可以。
【注释】科学一统天下的时代,文科和理工科在方法论上的区分越来越弱化和模糊。理工科同样不少学生不会编程,文科生照样很多人写出很好的程序,
这已经成为不争的事实。如果把逻辑思维也划分到理工科独有的范畴内,恐怕只有文学艺术类才能算真正的文科了。关键是不是用到编程,用到
自然可以学会,并且无障碍,所以文科出身成为不了学不会编程的借口。
【Q】:'VBA(编程)难学吗?'
【A】:容易学。
【注释】原因有二:(1)VB本身的特点(简单),知识点相对少;(2)网络大量文献以及交流平台起了主要作用,任何程序语言没有完备的文献,'容易'的也
也变成'难'的,反之,'难的'也比较容易学会。
【Q】:'学习VBA(编程)看什么书?'
【A】有书无书皆可。(所答非所问)
【注释】好的书籍是作者精心的总结,对于新手的意义不言而喻。但本人一本VBA书都没看过,所以没有发言权。我只能告诉你善于搜索不用书也可以学会,
只要输入的关键词合适想在第二页找到答案都难,一般前10个条目大多数问题都可以解决了。不得不说有大量的VBA用户群体是学习者的福音,溢出效应明显。
【Q】:'学习VBA(编程)过程中最重要的是什么?'
【A】:做中学。(learningbydoing)
【注释】编程是一项通过实践提高熟练度的技能。代码量肯定不是衡量编程好坏的充分条件,但绝对是必要条件之一。读书再多遍,不动手去写仍然会感到无从下手。
多实践包含:多动手写,多调试,多借鉴好代码,多总结。最初可能分不清什么是好代码,以后在实践中自然就知晓了。'做中学'永远是学习编程的不二法则。
【Q】:'学习VBA(编程)周期需要多久?'
【A】:因人而异,因程度而异。
【注释】这个问题只能这样回答了。不过还是给出大致的参考指标:没有任何程序语言基础,能保证持续学习时间和频次的情况下,半年或数月基本上可以达到
掌握VBA并解决实际问题的目标了。(参考指标比较保守,可能会更快的)
【Q】:'VBA的职业前景如何?'
【A】:目前VBA无法成为职业规划的目标。
【注释】零星的招聘或招募客观存在,但没有形成规模化,市场化的职位供需关系,所以既然不能成为职业也就没有前景可言。然而并不意味着完全不能利用VBA挣钱,
这还要取决于'挣钱'的标准,以及稳定性等等诸多主观及客观环境条件。
【Q】:'VBA是否会消亡,学了VBA白学?'
【A】:还将在相当长的一段时间内存在,长期不好定论。
【注释】VSTO的出台无疑加重了初学者的疑虑。可以肯定的是MS不在加大发展VBA的力度,但VSTO的出现到底是提供多样化的开发方式呢,还是用来替代VBA?
从以下几点来推测:
(1)由于VSTO不具备VBA的特点,(或者说它们的方式不同)所以不是'完美'的替代品;
(2)VSTO已经出现了若干年,MS仍然没有用它替换掉VBA;
(3).Net环境的推出,MS打造了VB.Net,充分说明MS还是会考虑到大量VB6用户的感受,做到一定程度上的向下兼容(虽然只有沿用了VB6的语法,真正意义上
和VB6是两个不同的产品)。同样的道理,MS仍然会顾及广大VBA用户的感受保留VBA的一席之地。基于以上3点有理由相信VBA还将会在一定时期内存在的,初学者不必过于担心。
…………
未完,待续。