写给VBA初学者的随笔: 相信, 实践, 理解

作者:本站编辑 时间:23-09-18 阅读数:4833人阅读

本文作者 DataBus 首发于EH论坛

絮叨

     近段时间论坛流行面向初学者的对话, 初学者通常处于懵懂状态,这种讨论和探索具有很好的前瞻性指导意义。本贴也希望在此方面

进行一次尝试, 主要是对散落在伦坛各个角落的问题和观点进行归纳总结发表一些自己的看法。苦于本人整块空余时间非常有限无法

构架系统性,条理性,规整性较好的帖子,只好想到哪说到哪,更新也不能及时,整个帖子拖得时间可能会很长,有时间了才能写点,

最后太监了也说不定。先打好预防针希望各位看官谅解,所以称之为随笔,但我会尽量保持内容的独立性和完整性。一直想写这样一篇帖子,但没有时间,今天终于下笔了,呵呵。


     最后声明本贴观点不一定代表正确的观点, 希望大家保着批评,辩证的态度来看待帖子的内容(要是把您误导了,责任可就大了)

由于本人水平时间有限,纰漏偏颇在所难免, 期待大家斧正。本贴内容比较"负面", 无意引起争端, 挨砖在所难免, 给初学者提供一个看问题的角度吧,希望对初学者能提供一些帮助。


                                                                   (一) 根儿上的问题:学习具有目的性

      初学者学习VBA之前(不仅仅是VBA, 这个话题可以推广到Excel以及其它领域),最好能问问自己:


1: 【目的】为什么学习VBA或Excel, 学习VBA的出发点是什么?

      (1)应用性学习:"出于应用而学习, 学以致用";

      (2)守株性学习:"技多不压身,越多越好,学了再说,等待某天派上大用场";

      (3)娱乐性学习:"出于兴趣而学习, 纯粹为了学习而学习,学习VBA或Excel能带来巨大愉悦";

      (4)逻辑性学习:"为了锻炼自己的逻辑能力而学习Excel或VBA";

      (5)献身性学习:"出于帮助他人而学习";

      (6)虚荣性学习:"出于虚荣而学习, 网络虚荣? 现实虚荣?";

      (7)空白性学习:"出于填补空白时间而学习,实在是闲得没事干了";


2: 【认识】 把VBA或Excel作为什么看待而去学习?

      (1)电子表格高级应用工具?

      (2)应用程序开发工具?

      (3)无所不能的程序语言工具?


3:【功效】 学会了以后能干什么?

      (1)提高工作效率;

      (2)升职加薪,增强职业竞争力;

      (3)成为职业代码开发工人;

      (4)为了(3)打基础;

      (5)自主开发模板插件,接活挣钱;


4:【态度】 学到什么程度?

      (1)使用工具:  够用性原则;

      (2)"玩"工具:  "玩"转VBA或Excel;

      (3)被"工具"玩:  被VBA或Excel"玩";


5:【内容】什么值得学习?什么不值得花时间精力去学习?

      (1)对象,方法,录制宏,Excel内置应用;

      (2)程序语法类:循环,判断,字符串,文件操作;

      (3)数组,字典;

      (4)界面,系统等等;

      (5)类模块;

      (6)vba封装,Win32 API;

      (7)算法?结构?........略去K字;

      (8)..................


6:【替代】VBA或Excel是唯一应该花时间学习的?不花时间学习就活不了了?

      没有比较就失去了存在性...............................................

      珍惜宝贵的时间, 花时间在最值得做的事情上...................


        如果您是一位初学者,您抉择好了吗?

        后面慢慢围绕论坛散落的各种观点展开......

        这点东西写了1小时+,我的时间呀, 泪奔中......


Happy Coding!


DATABUS

03/16/2013 于3.15后

       先从最近的帖子说起吧,参考连接:
         面向VBA初学者→ VBA代码中有关【变量】的误区
        [讨论] 关于变量声明的讨论
        [求助] Dim与不Dim
      本来不是问题的问题,讨论的双方过分夸大某一方面使得此帖成为了关注的焦点问题。

      楼主:作为初学者没有必要声明变量,变量名可以简单化定义;
      反方: 声明变量好处很多,是个好习惯,坏习惯一旦养成不好改,变量名最好遵循命名规则;

      其实帖子的楼主表达的是:
             "初学者没必要墨守成规, 把非必须的一些规则放到一边, 放开思路大胆的尝试",
      但由于言辞及表达方式的问题造成了进一步的争论。对于此观点我表示支持, 分清轻重缓急可以对学习进程产生很大的积极促进作用, 眉毛胡子一把抓不利于知识的积累和梳理。

      但其实,一方面"是否声明变量"问题并没有在"分清轻重缓急"或者"避免麻烦"的问题上产生很大程度上的积极作用。
      既然声明变量有诸多的好处,而初学者反正程序都写了,声明变量能带来多大的麻烦和约束? 难道声明比代码还长? 唯一可能
      的烦恼来自于初学者弄不清变量的类型,那么直接定义为variant好了, 在地方窗口察看VBA自动识别为什么类型。

      另一方面,就算是一开始没养成声明变量,遵循命名规则的好习惯也不是什么大事,又不是戒烟, 很好改。举个简单的例子,
      职业代码民工在这方面是没得选择的, 进入一个新单位, 几乎第一件事就是看公司发给你的 <代码规范>,如果和你以前习惯的规范, 命名规则不同,
      难到推托说"我习惯已经养成, 很难改, 这工作我干不了? "不好"的习惯改为好的习惯并没有想象的那么难, 适应几天就好了,就这么简单。如果定义几个
      变量就烦得影响写代码了,我看您还是别学了。

       至于说option explicit可以避免手误, 那么就把变量名起得有意义好记些, 而一个过程内的变量也就那么几个, 手误也就不是大问题了。如果一个过程
       里变量很多记不住怕出现手误, 那么说明你的程序需要分拆成子程序调用了, 在一个过程中变量个数多于10几个基本上比较少见。当然不就是加上个option
       explicit吗? 多大点事儿呀,怕受误随手写上就行了。

        所以初学者用不着在这问题上纠结, 对于学习vba这根本就不能算个事儿。我个人还是倾向建议把声明加上, 同时变量名最好有意义(当然平时10几行的习作无所谓了)。
        "变量名再长都没用, 也必须加注释才清楚" 这基本上是抬杠,实际上注释也不能完全说明变量在程序上下文中真正的作用,  难道还要写个几百字的变量注释? 那干脆别写
        代码了,改写作文了。实际上变量名和函数名是一个意思,你把instr非要起名为xpjdm,就算是有完备的帮助和注释,每次用还得查效率太低下了, 而 instr用2次就记
        住了,马上就写出来了因为意义很明显就是在字符串中查找。

今天回到我们顶楼的话题吧。我会在帖子里插入一些相关帖子链接使帖子更充实, 由于我得花时间找, 所以稍后补上, 先说内容吧。

首先对于VBA初学者要说明的是:
      论坛里不少内容已经大大超出了VBA应该适用的范围, 有"滥用"VBA之嫌, 清醒认识, 请勿隋波逐流, 人云亦云。

    【定位】包含两层含义:
     1:Excel VBA 定位: (与顶楼的【认识】相对应)
        MS 设计VBA就是面向"终级用户"类似于数据透视表的"office 高级应用工具", 以脚本的形式存在(宿主就是office),
        用来达到"自动化驱动office来完成规律性, 重复性任务"的目的。而不是提供一个"应用程序开发工具", 最大程度可以
        扩展到针对office的某些二次开发。严格来讲VBA不是为了"开发"而是为了"应用", 并不是说完全做不到二次开发, 但
        和 MS 设计 VBA 的本意不相符甚至是背离。更加不是"无所不能"的程序语言,有太多的事是 VBA 实现不了的,严格来说
        它都不是一种程序开发语言,只能算作脚本。

     2: 学习目的定位:(与顶楼的【目的】相对应)
         顶楼列举了一些可能的学习目的,但这个属于"主观判断"的范畴,不予评价,只提醒两点需要注意的地方:
        (1)不少学习者在学习过程中目的不明确,没有清楚地想过自己为什么而学习VBA;
        (2)学习VBA的目的时常体现出动态性,随着学习的深入学习的目的已经不知不觉地改变了。

      所以初学者最好在学习之前梳理下自己的学习目的再下手不迟,并且要清醒地意识到学习的目的可能已经改变,是否应当或者值得
      为了这个目的深入下去。下面用一段真实的对话来说明一下:
         记录一位VBA学习者这样的提问:

        /**************************************************************\
         <甲>:请问如何学习API?
         <乙>:学它干吗用?为什么要学 win32 API?
         <甲>:(沉吟片刻)我看论坛很多高手都用API,觉得很酷。
         <乙>:那么你知道API是干什么用的吗?
         <甲>:不知道,只知道它能让我写出一些VBA实现不了的功能。
            我的想法是用API实现界面,VBA自带的界面功能少,而且不漂亮。
         <乙>: 那你知道那些高手学习API的目的吗?
         <甲>:不知道,高手们的用意不是我们菜鸟能猜到的,
           我连他们的代码都看不懂,很深奥。
        \***************************************************************/

         没有任何笑话的意思,只是举例说明,不少朋友学习某些知识的时候不清楚自己的目的,甚至对自己下决心要学的东西没有基本的了解。
         这位朋友不仅把VBA拔苗助长成为了基于Excel的应用程序开发工具,甚至升华为基于winodws消息机制的应用程序开发工具。殊不知
         他眼中看到的高手研究API的动机有可能是"闲得没事干,利用api打发空白时间"呢?如果您不是出于这样相同的目的,也选择学习这位
         高手研究的东西,那不就是南辕北辙了吗? 再或者这些高手也是像他一样看到他们的前辈这样玩API, 从而出于对前辈们的敬仰,
         出于对“未知的神秘",出于对“酷”的追求,这样一直传承下来的。很可能这些高手当时学习的时候也不清楚学习的目的和用处。
         如果让这些高手重来一次,不知道他们会不会还是选择研究API呢?对于花时间精力研究过API的高手们很少有人愿意承认学API实用价值不大,
         谁又愿意说自己擅长的东西坏话?

         盲目的崇拜,容易导致论坛高手研究什么初学者就跟着学什么,高手研究的初衷不一定和初学者学习的目的一致,高手的情况,境遇也
         和初学者未必相同,盲从危害很大。况且作为初学者不具备分辩谁是高手的能力,只能借助论坛级别,精华贴,技术分来判断,
         相反,殊不知级别越高可能意味着误入的歧途越深。根据自己的实际需要,考虑自己需求和知识点的相关性, 善用时间选择性学习相关的知识尤为重要。

         在windows环境下可以用图形库,linux下win32不用说也知道什么用没有了,所以当然谈不上跨平台。大多数职业的码农都不去研究它,
         作为业余选手研究它除了因为不知道怎么回事,要不就是无病呻吟,闲得没事干,我想不出其他的理由。

        不同的声音:
      【肯定有人会说api研究好了无比强大,然后列举出来】:
    问题是这种必须用api才能解决的情况有多少?花大量的时间精力去搏小概率事件就属于偏执。

      【存在即是合理的,没有用为什么会有win32 api?】:
        api当然有用,开发图形库必须用它呀,问题是您学习VBA的目的是去开发图形库吗?

VBA的边缘性
       说VBA不是一种程序语言吧, 不公平, 它的确提供了程序语言能完成的功能; 说它是吧, 和现代程序语言相比功能又很不完整。说它不是面向
       对象的语言吧, 它有类模块, 提供部分类的功能; 说它是面向对象的吧, 类的最只要的特点又不具备。当然了,这些主要都是从VB6继承过来
       的"遗传病"。所以通常的结论:"基于对象, 但非面向对象"。MS早就停止VB6的升级了, MS对VB6的放弃直接导致了VBA的功能不会在本质上变得更加强大,
       但未尝不是一件好事,作为使用者不用整天跟着屁股后面学习新的功能。事物发展就是这样的,在解决了一个问题的同时又带来另一个新问题。
       在加强了工具功能的同时又会加重学习新功能的负担。其实我想说明的一个道理:

        "充其量内容就这么多了, 学习VBA是可以有止境的, 差不多的时候是完全可以收手的, 就算这些内容也完全不用全部学会, 够用就可以收手"。

        作为VB6这款产品个人觉得满尴尬的, 历史的车轮带走了它的青春,留下来的尽是沧桑。VB6曾经拥有相当数目的粉丝, 简单,方便,入门快捷,使得
        它非常适合轻量型应用程序, 其中界面设计便利是他的最大特点,那个年代和其他语言配套的图形库不够简单,写界面还是比较麻烦的。所以VB6还曾经
        充当过"门面"工具,调用其它语言填写的内核。这个时代完全不一样了,很多语言的配套界面设计同样简单甚至更美观, 我能想到VB6具有的唯一
        优势就是简单易学。所以在VBA和VB6比较的问题上,个人更倾向于VBA呢,VBA更专注于和office的契合, 在这点上比VB更方便。而专业的应用程序
        VB6很容易被其它开发类语言替代。当然VB6和VBA毕竟同宗,相互写法上差异并不大, 学一下会两个也是满划算的。

       -> 插播一个真实的小段子:
           一次和几个初3的学生聊天, 他们告诉我最近两个学期开了2门计算机类的课程, 一门是FrontPage写html,另一们是VB6入门课程(练习带界面的小程序)。
           其中一名同学:"听说C++的循环比VB快100倍, 比VB牛多了!",然后我跟他们讲了一番话,他们在不耐烦中,不屑的鄙视我一下后,直接不睬我了。我只好
           讪讪的走开了。(这帮孩子都来自于北京最好的一所中学)

           我的一番话:
           1:马上中考了, 让孩子分心花时间学这个不是耽误时间吗? 非得显摆你们学校是"素质教育"?
           2: 怎么能用2个"停产"的产品开课呢?时间也花了,学也不能学这个呀;
           3:C++的强大并非体现在一个命令或者循环有多快,你说的“快”不是有意义的快;
           4: 不要用唯一的标准来评价程序语言, 这样只能得出错误的结论;
           5: 尊重老师但不要当作"明星"来盲目崇拜。(明星也不应该盲目崇拜吧,呵呵。)

           从上边的小故事可以看出:
           1: "硬"规则的力量
               我想说,又不敢深说,怕孩子们信了我的观点不好好上课,到时候拿不着学分,我不是千古罪人了,好心未必一定办好事。

           2: "明星效应"真不是盖的
               人们更愿意相信"明星"带给他们可以理解的"错误“概念, 而不愿意接受"平民"讲述给他们不太能理解的"正确"观念。
               关键点:"错误"的概念往往直观,感性容易被理解和接受, "正确"观点往往全面而抽象,经常是没有真实体会过就不能理解,
                            自然不容易被接受。

           3:懵懂的"高低贵贱, 三六九等"
              程序语言的比较和选择以及争论从未停止过。左右逢源的结论从来都是最稳妥的,虽然看起来是废话一堆。
             "程序语言没有高低贵贱之分, 没有最好,只有最适合,选择什么语言取决于用来干什么?" 这是最稳妥的但未必是完全正确的。
          我没有能力告诉你什么是完全正确的,但我可以告诉你什么理解是错误的,什么是相对稳妥的(即不会错的离谱)。
          至今我们仍无法找到一份完备精准, 比较各种语言优略的文献。理论上并非完全不可能,实践中可不能的原因就不赘述了。

           需要提醒的2点:一是留意网上文献的准确性(搭建环境是否科学); 二是比对的是否有意义。

           说点题外话吧, 写着玩艺挺累人的,像个大傻子似的又花了将近2小时, 我不知道自己写的东西是否有意义,如果没人看的话,我也实在是懒得写下去了,
           白白浪费我的时间。我追求的不是大家对观点的赞同, 只是想让更多的初学者看到,但没有您的支持马上贴子就会沉下去看不到了。现在搞
           的我就像起点的写手一样求推荐票,月票呵呵,很无聊。

            还有一点需要说明,帖子试图通过身边真实发生的小事来说明普遍性的问题,比如例子中我并不是真的要说API,我无意于讨论技术细节,
            但好像初学者更愿意看到技术性细节的帖子,所以不喜欢我这类帖子, 我对技术非常不感兴趣,所以请原谅我没解释这些细节。
            希望大家能够以泛化式的抽象来看待例子,例子是论坛中某些普遍问题的现实写照, 反映的是方法论,认识论的问题, 这是随笔类的特点。

            最后非常感谢ctp_119的热情支持!  没有你的支持这篇我都不写了。

DataBus

两条腿走两路的VBA

        1: "命令式" 一条腿利用office"内置"对象方法(Find, Atuofilter等等)甚至是Wroksheetfunction来完成程序任务;
        2: "语言式" 另一条腿读取单元格内容到内存数组, 利用VBA的程序语言功能来执行业务逻辑, 最后写回单元格。

        "内置"的问题要稍微说下, VBA作为脚本寄生于Office, 其存在的方式是内置, 但与Excel数据并非直接无阻交互,
        仍然要通过COM接口提供的一套对象与Office进行交互, 在这一点上并非VBA独享, 任何其他基于Excel COM类插件都可以调用,
        所以从交互角度来讲, VBA并非与Office无缝契合的内置存在。

        显然论坛很多帖子的内容在第2条路上走的太远了, 无所不用其极。计算机系的科目搬到VBA中来,VBA内置没有的数据结构再造一个轮子,
        多媒体应用, VBA实现不了的用API, 其他语言擅长开发的内容扩展到VBA里来,林林总总诸如此类"屠龙术"打造的"牛"贴随处可见。甚至
        把第一条路视作"低级","初级"应用原因就是它容易, 在初学者面前营造出这样一种氛围:
                    "哇,Excel, VBA 还可以这样玩?太强大了!"
                    "哇, Excel, VBA 真是博大精深,深不可测,无所不能!"
                    "牛,职业的吧? 科班出身的吧?"
        (实话实说, 职业的码农肯定不会用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)开始吧, 这些问题都是论坛(不止是这里)
        常见学习过程中的疑问, 仍然不涉及细节问题, 只谈认识。在开始之前按照惯例还是稍作声明:

                                                                                        "适合"与"正确"
        正如4楼所讲, 对于新手的疑问, 稳妥的答案通常相对是"正确"的或者说是"标准"的, 因为它是全面的。"包罗万象"的分情况讨论是得出所谓"正确"答案的唯一途径。
        由于很多情况新手未曾遇到过,没有感性认识,难以理解, 容易造成困惑和纠结。左右逢春可以变成模棱两可,唐僧式的阐述可以导致索然乏味。
       "正确"的未必是"适合"的, "适合"的可以是"正确"的。(这里要展开的东西太多了, 就不唐僧了) 我希望简洁, 明确, 错误概率小的答案, 个人认为
        这是"适合"新手入门的。从开贴以来此篇随笔一直都没有标题, 在6楼这里把它冠名为: (全部更新完毕后添上去)


                                                                     "Believe it, Do it, Know it!" -- "相信, 实践, 理解"
        然后就会把握什么是"正确"的答案。ExcelHome论坛精神:Let's Do It Better!", 我更想传递的思路是:"Let's Do It 'RIGHT'!"。


插播调味小贴士: 08奥运期间很多品牌征集英文翻译, 最经典的莫过于:狗不理 = Go Believe。

                                                                             新手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】:做中学。(learning by doing)
               【注释】编程是一项通过实践提高熟练度的技能。代码量肯定不是衡量编程好坏的充分条件, 但绝对是必要条件之一。读书再多遍, 不动手去写仍然会感到无从下手。
                           多实践包含: 多动手写, 多调试, 多借鉴好代码, 多总结。最初可能分不清什么是好代码, 以后在实践中自然就知晓了。"做中学"永远是学习编程的不二法则。

               【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还将会在一定时期内存在的, 初学者
                          不必过于担心。

                                                                                            新手学习的几点建议

               1:调试
                   经常看到新手学习了很长时间的VBA之后仍然不会使用调试功能, 一遇到问题马上就请教他人, 这样不利于自身的成长。调试非常重要, 是学习代码本身
                   不可或却的一部分。是诊断, 梳理代码逻辑的过程, 可以避免逻辑错误的重复性发生。善用调试新手很多的问题都可以得到解决, 即可摆脱对他人的依赖性,
                  自身又得到长足的进步, 一举两得。
                  三个窗口, 三个功能键:
                        地方窗口, 立即窗口, 观察窗口, F1(帮助), F2(属性方法), F8(分步执行)
                  途中诊断:
                        断点, stop 等等。

               2: 分拆
                  (1)语句分拆
                       长而难懂的句子分拆成基本单元, 利用调试功能一个个解决, 很容易就理解了它的含义。
                        如:         intRow = Range("A" & Rows.Count).end(xlup).row
                       立即窗口:   ?Rows.Count
                                          Range("A" & Rows.Count).Select
                                          Range("A" & Rows.Count).End(xlup).Select
                                         ?Range("A" & Rows.Count).End(xlup).row
                      用眼睛都可以看到每一步Excel选中的哪个单元格, 那么自然就不难理解了。这个小范例同时揭示了学习程序过程中一个非常重要的方面: 动手尝试。

                 (2)子程序分拆
                     把一个冗长的程序按照功能拆分成一个个相对独立的子程序来调用, 使得程序具有一定程度的组织性,结构性,规整性大大提高了代码的可维护性,扩展性,
                     重用性。这是贯穿程序语言发展的一条主线, 因为它直接指向了程序开发的终极目的之一:开发效率。

               3: 耐心
                  学习目的明确 ≠ 急于求成。无论学习目的如何直接和明确, 学习的过程仍然不是一蹴而就的, "捷径"只能是建立在扎实的阶梯式基础上。
                  有些新手基本代码还没写利落就开始用界面写"系统", 甚至还没学会调试, 结果是步履维艰, 一步一问, 三步一错, 无以为继。还有的朋友
                  学习VBA是为了研究彩票, 还没学习一星期就开始写各种计算方法, 自然处处遇"难", 大挫学习兴趣, 随之放弃。抱着明确的目的学习是好事,
                  不管目的是否"明智"(这是另外一个话题), 但明确的目的不等于"急功近利"。学习的进程总是遵循渐进式的规律, 跳跃式的一夜暴富只能是空中楼阁,
                  所以耐心在学习过程中就显得尤为重要。

        此楼单独说说效率和速度的问题。程序的效率大致包含两层含义(1):执行效率;(2)开发效率。执行效率又可分为时间效率和空间效率, 空间效率不在本贴讨论范围内, 所以
        执行效率简化为速度来讨论。之所以单独拿出来说这个问题是因为论坛很多帖子在"速度"追逐上所表现出的"热忱"比较极端, 走的路比较偏执, 希望初学者能够以一个相对
        平和的心态来看待效率。

                                                                                                          执行效率 与 开发效率
        从字眼上分析就知道, 程序的最优目标是两者并重。遗憾的是兼顾并非常态, 凸出一者的同时往往伤害到另一者。当两者出现矛盾时, 职业代码工人较为普遍接受的原则是:
                                                                          "只有在必须考虑速度的时候才优化执行效率, 否则以开发效率为重"。

        换句话说, 只有在不得不考虑优化速度的时候执行效率的目标高于开发效率因为要保证功能性,有效性。否则只考虑开发效率不考虑执行效率。职业程序员和职业"玩家"在这个
        问题的认识上经常会产生分歧。

                                                                                                             追求务实的程序员
        设身处地的想一下, 职业程序员在意的是什么? 他们在意的是快速,顺利的完成工作, 在意的是软件的稳定性,有效性尽量避免老板和客户找他们的麻烦, 最终目的就是挣钱,
        吃饭,养家。花费几个小时来提速几个程序模块, 工资没多一分钱, 延误了进度, 工期老板肯定不干。基于这样的原因, 他们顺理成章的注重与可维护性, 稳定性, 扩展性,
        重用性相关的开发效率。
                                                                                                             追逐"手筋"的"玩家"
        相比较而言, 职业"玩家"写代码并非为了工作, 没有项目压力, 无需考虑开发时间, 开发成本, 追逐的是华丽的"手筋", 以及速度飙升所带来的愉悦。其次, 速度本身的属性
        决定了它是一把极其规范, 可量化的标尺。基于速度为标准的代码具有极强的博弈性和竞技性, 不仅可以独乐还可以众乐。


                                                                                                              "有意义"和"无意义"
        前边我们就曾提过"有意义的快"和"无意义的快", "有意义的快"可以包括两种情况分别称作"根本性速度提升" 和 "规模型速度提升"。

        插播小故事:    "这事儿不赖我"
        某日一油漆工找到一份新工作: 刷马路中间的白线。
        于是油漆工把一个油漆桶放到了起点上开始工作了。
        第一天, 油漆工刷了300米, 老板大喜, 夸奖油漆工:"工作很出色!"
        第二天, 油漆工刷了150米, 老板不露声色, 鼓励油漆工:"工作干的不错!"
        第三天,油漆工刷了30米, 老板大怒, 吼道:"今天只刷了第一天的1/10, 到底怎么回事?"
        油漆工回答:"这事儿不赖我呀! 我每天距离油漆桶越来越远了啦!"


        这个小故事形象的描绘了这样一个事实: 改变工作方式可以带来根本性的效率提高。在遇到类似于上述情况时, 初学者可考虑优化代码提升速度。
        在VBA中当遇到速度慢的不可忍受的情况时, 粗略的说可从以下几点入手:
        (1) 合理化数据源的结构;
        (2) 用数组一次读写单元格内容, 避免频繁操作单元格对象;
        (3) 查询搜索改用Collection 或 字典。

        所谓"规模型速度提升"是指对于应用频次高的问题, 可以考虑一次优化速度, 应用无数次, 追求规模效应降低开发效率损失。至于"非根本性速度提升"
        的例子可以在论坛看到很多, 诸如循环是用指数索引快? 还是For Each 索引快? 等等, 这里就不一一列举了。

         此楼用一句话来总结:"程序的本质是用机器来解放劳动力, 而不是用劳动力解放机器!"

         本来此楼和尾楼想写很多内容, 一来由于没什么初学者看所以无收获可言; 二来如果深入的话恐会戕害一些坛友的感情; 三来目前此帖已有万余字,
         再多就不像帖子了。再深入展开下去实属下下策, 故此楼略显单薄, 但基本意思都点到了。剩下关于算法和数据结构的认识和态度在本楼没有提及,
         如果初学者有兴趣可跟贴讨论。另明天或许可以结贴了。

      到该结束的时候了, 想必大家能理解本贴的态度:不褒不贬。你用,或者不用它, 你喜欢, 或者不喜欢它, 它就在那里, 不远不近, 无所谓“强"无所谓”弱"。
      一致性, 对称性是匹配的原则。对称匹配, 你收获你想要的, Excel,VBA发挥应有的效力; 反之, 错位匹配引发牵强附会, 捉襟见肘。既然谈过了VBA的定位,
      自然不可避免的要谈一下对其宿主Excel的认识。话题就从这里开始吧......

                                                                                            灵活是把双刃剑

      相比VBA而言, Excel的边缘性更强。相信大家都积累了多年的使用经验, 是Excel的行家里手, 提及某某功能如何实现均可娓娓道来。如果问一个这样的问题:
     "Excel到底是什么?" 一言以毕之, "电子表格工具"。这种定义只是给Excel起了个别名(alias), 不是一种理解, 认识和定位。曾经问过自己这个问题, 我发现
      自己答不上来或者说自己的能力不足以回答这个问题。边缘性强主要表现在使用范围广泛, 尤其它还是一款不断升级的产品并且有诸多第三方插件对其进行功能扩展,
      这时候你会发现无论怎么回答这个问题都是错的, 难免给初学者造成"Excel无所不能"的错觉。但如果不能予以概念上的定位, 就无法回答"适度"使用的问题,
      结果就是一切和表格有关的工作都用Excel来做。

      Excel简单易用, 功能强大, 所见即所得(这可是个不得了的特点), 这些都是耳熟能详的特点。个人认为Excel最大的特点来自于灵活:
      (1)自由设计用户自己的蓝图, 天马行空, 个性十足;
      (2)Excel分享了数据库的一些特点, 具有一定程度的记录和数据存储的功能。虽然可以说Excel缺乏关系结构, 但由于灵活的特点, 可以用工作表打造出关系结构;
      (3)通过各种计算和图表功能, 提供多视角数据体验;
      (4)腾挪空间广阔, 运用水平差异大。

      然而灵活性并非是无成本的, 灵活的同时就意味着规范性差, 同样功能的表格10个人设计出12样儿来, 格式,表头,结构,实现方式等等花样百出。
      规范性差导致用户交流困难, 随着逻辑业务设计复杂程度不断提高, 有效性控制繁杂, 错误几率增大, 急剧加重了设计者的负担。逻辑业务关系越复杂设计成本
      的增长幅度就越大(呈非线性增长态势)。前些日子看到一位坛友希望把一套表格封装, 表格集成了一套用公式表达的复杂逻辑业务关系。其实这套关系本身就是
      一道加密壁垒, 把其中的逻辑梳理清楚比破解还费劲。

     个人的一点看法:既然很难在概念上抽象化Excel的定位, 只好用一条条描述性的特征来概括Excel, 但这种列举是无法穷尽的。
     从正面说:
     (1)Excel"适用"于:逻辑业务关系相对简单, 数据规模不大, 一锅端式的集成应用; (可惜无法量化定义"简单", "规模")
     (2)对于业务逻辑复杂, 规模较大的数据, Excel"适合"充当数据库和用户之间的缓冲层(buffer)。致力于数据的展示,整理,综合,"分析"等体现灵活性的职责。

     从反面说:(表象)
     (1)避免用Excel设计大规模业务关系复杂的"系统";
     (2)避免大量数据存储造成Excel文件尺寸过大; (动辄几十上百M的Excel文件经常能够看到)
     (3)避免大量公式集成, 重算可以导致文件打开速度过慢, 运行速度过缓;
     (4)避免搭建Excel文件系统;(几十上百Excel文件组成的文件集也是屡见不鲜)
     (5)......

      上述情况可以适当考虑使用数据库的功能, 毕竟他们之间是有本质区别的。这里只是以我的观点来看待Excel, “不适合"不代表Excel不能做到, 最终的评判要交给
      用户, 谁用谁有话语权而不是设计者和所谓规范的探索者。在能意识到"隐患"的条件下, 如果您觉得好用, 完全可以避免庸人自扰式的思考, 坚持走自己的路。
      既然Excel的特点是灵活, 我们就以一个灵活的态度来认识和对待它好了。

     至此关于Excel和VBA的话题就告一段落了, 最后再补充一句:
                对于业务部门职员来说, Excel, VBA解决工作中的问题真的是够用了, 也是很好的选择。如果不够用说明您的工作应该是由IT部门来完成的工作。
     业务部门的员工扛着VBA去干IT部门的工作, 无论是工具和还是工作内容都错位的离谱。

      下面写一些对论坛常见观点的看法, 最后收录一些经典语录。既然是收集, 就是一个开放和相对漫长的过程, 先把帖子的架子搭完, 对观众有个交代,
       如果有时间希望能慢慢的补充和完善。

                                                                                              观点点评

     【存在即合理】
       <评>:理解"合理"的着眼点才能正确的认识, 对待, 运用好这种存在。一言以毕之不是试图掩盖存在本质的借口就是盲信。

     【细节决定成败】
       <评>:方向决定"成"是否有意义。

     【不管什么, 只要学好了都牛】
       <评>:愤青的态度抹杀客观存在的差异性。
                只要听到"不管....只要....就...."的句子就是错的?

       ...............

                                                                                              经典语录

     【学习总是要走弯路的】
      ID:香川裙子
      <补>: 但希望弯路不是方向上的。

    【吾生也有涯, 而知也无涯】《庄子》
      ID:灰袍法师
      <补>: 以有涯随无涯,殆己。

    【在EH人眼里,Excel就是一部游戏机】
     ID:kangatang
     <补>: 而且还是一部联网的游戏机。

      ...............

       以一首老歌的歌词来结束本贴:"These things that are pleasing you CAN hurt you somehow"。 *(完)*

       最后鸣谢所有给与本贴支持和厚爱的朋友!!! 欢迎批评指正。
       感谢总版加精, 以及ExcelHome论坛提供的平台让我有机会表达自己的观点。

       祝好
       DataBus

[本文转自仇朝权随笔_写给VBA初学者的随笔: 相信, 实践, 理解 ](http://zawen.net/post/33.html)

分享到:

♡♡♡转载请保留上面信息♡♡♡