Office及VBA技术交流

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2249|回复: 1

[分享]怎么快速学习 Excel VBA 如何快速学习?

[复制链接]
  • TA的每日心情

    2016-2-20 08:02
  • 签到天数: 1 天

    [LV.1]初来乍到

    88

    主题

    155

    帖子

    625

    积分

    高级会员

    Rank: 4

    积分
    625
    发表于 2015-12-22 16:55:04 | 显示全部楼层 |阅读模式
    著作权归作者所有。
    商业转载请联系作者获得授权,非商业转载请注明出处。
    作者:Jerry Jho
    链接:http://www.zhihu.com/question/20870802/answer/54998361
    来源:知乎

    如有条件的话,可以遵循以下的步骤学习:

    1) 理解基本的语法,上机练习简单的操作
    2) 反复阅读理解有经验人士的代码
    3) 对于一些简单的需求,可以试着自己解决
    4) 对于VBA而言,同一个目标可以有很多实现方法。故同样的需求,可比较别人的实现方法和自己的实现方法,并加以比较评判
    5) 随着学习的深入,评判、重写自己的代码

    '''''''''''''''''''''''''''''''''''''''' 我是正文 ''''''''''''''''''''''''''''''''''''''''
    1. 一点历史
    VBA,全称Visual Basic for Applications。从名称上看,至少包含了3个历史阶段的产物,依次是
    - BASIC
    - Visual Basic
    - Visual Basic for Applications

    BASIC是一门古老的计算机语言,首次发表于1964年。BASIC语言贴近于英语语法,使用者也不需要对计算机硬件知识(尤其是内存管理)有很多了解,故对于非专业程序员,也能极为迅速的上手。使用BASIC,计算机上需要安装一个叫“BASIC解释器”的软件,将BASIC程序代码翻译为计算机能够识别的机器指令。同时,BASIC解释器通常带有一个文本编辑环境供输入代码。随着个人电脑的普及,BASIC解释器通常是作为预装软件出现,故用户开机就能用上BASIC。

    用于MITS Altair 8800型个人电脑的BASIC解释器是微软公司的第一个产品,由比尔盖茨等微软创始人亲自开发。此后,微软的DOS和Windows 3系列、Windows 9X系列都预装了BASIC解释器(称为QBasic)。从Windows 2000开始QBasic不再预装,但是QBasic仍然可以运行于Windows 10之上(只限32位)。

    QBasic 运行于Windows 10

    从BASIC的历史可以看出,这门语言本来就是为非计算机专业人士准备的,而且微软公司与之有不解的渊源。之后的发展也是如此。

    计算机软件进入到图形用户界面时代,微软公司开发了可以编写Windows图形应用程序的新语言Visual Basic以及对应的开发软件Visual Basic IDE(所以Visual Basic既指一门语言又指微软为此提供的开发软件)。新语言Visual Basic继承了BASIC语言的关键字和语法,仍然保持易学易用的风格。尽管Visual Basic解释器是Windows操作系统的一部分,然而想用Visual Basic开发软件,仍然需要独立购买和安装Visual Basic IDE。

    最后一个非.Net版本的 Visual Basic,即 Visual Basic 6 (1998)运行于Windows 10

    1996年,微软开发了Visual Basic Scripting Edition(即VBScript)。顾名思义,VBScript适合快速书写类似批处理的脚本。VBScript的语法与Visual Basic一致。直到今天,Windows依然内置了VBScript解释器,以及能够直接解释文本代码的Windows脚本宿主。所以使用VBScript无需另外投资。

    微软的Office系列产品同样集成了VBScript解释器,并提供了语言操控Office软件本身的能力。这个VBScript被称之为Visual Basic for Applications(即VBA)。所有Office软件都集成了VBA的解释器和集成开发环境(类似于一个简化版的Visual Basic IDE)。换句话说不仅在Excel里,Word、PowerPoint也可以用VBA。VBA的运行环境称之为宿主(Host)。比如,你在Excel里面使用了VBA,那么Excel就是宿主。这个概念也适用于VBScript,对应的宿主可以认为是Windows本身(实际上是Windows的一个组件:Windows脚本宿主WSH)。

    那么从VBA的历史上我们可以看到,它实际上是由两部分组成的:一个是语言本身的特性,另外一个是宿主提供的功能。语言本身具有通用性,而宿主相关的部分和不同的宿主有关。这篇文章也会对应的分为两个部分,即通用的VBScript和Excel VBA。

    2. 学习VBScript

    学习VBScript,你只需要Windows系统本身。我们使用的工具是系统自带的命令提示符、记事本和Windows脚本宿主。

    2.1 环境

    首先我们建一个工作目录。以下两种操作均可:
    1.新建一个文件夹,按住Shift然后鼠标右击,选择“在命令提示符中打开”
    2.按Windows +R,输入cmd,回车。例如想建立的工作目录为 C:\Work,那么就输入
    mkdir C:\Workcd C:\Work

    以下假设我们的工作目录是C:\Work。

    接下来可以写程序了。在命令提示符下输入
    notepad hello.vbs
    当记事本提示你创建新文件时,选择“是”

    比如我们写一个从1加到100的程序。在记事本里输入
    dim i,sumsum = 0for i = 1 to 100  sum = sum + inextwsh.echo sum
    按Ctrl+S保存。
    回到命令提示符,输入
    cscript hello.vbs
    命令提示符会输出一些版本信息,然后会出现结果5050。如果嫌版本信息太罗嗦,就加一个/nologo的选项:
    cscript /nologo hello.vbs
    因为Windows对扩展名为.vbs的文件进行了绑定,所以也可以直接运行
    hello.vbs
    输出的形式略有不同,稍后解释。

    2.2 基本语法
    变量:
    与数学上的变量意义相同。变量用来存储数据。变量不得使用数字作为开头,原则上不要使用中文作为变量的名字。应使用字母和数字、下划线,例如sum、my_result_0等都可以。
    字面量:在代码中可见的数据,例如整数、小数和双引号包裹、可由任意字符组成的字符串。如100、"Hello"、"标题"等。
    运算:与数学上的运算意义相同。
    关键字:VBScript自带的命令符号,不得用于变量名称。VBScript不区分大小写。通常第一个字母大写。
    注释:单引号'直到行尾的所有内容,VBScript均予以忽略。

    声明一个变量使用Dim关键字。尽管变量在第一次赋值的时候会自动声明,但努力养成明确声明变量的好习惯。
    '我是注释dim x '声明了变量xdim i,j '声明了变量i和j
    用操作符=给变量赋值。=右侧的表达式将被求值,然后赋予=左侧的变量
    可以把字面量、运算的结果或者函数返回的值赋给变量。=赋值只适用于整数、字符串等简单类型的赋值。
    Option Explicit '强制要求变量使用之前必须声明dim my_resultmy_result = 1 '赋予字面量1'获得函数的返回值my_result = InputBox("输入一个数字","我的程序") my_result = my_result * 2 '获得运算的结果WScript.echo my_result
    函数与数学上的多元函数意义相同。函数需要零个或多个参数返回一个运算的结果。上面的代码在调用一个函数InputBox,并赋予其2个字符串参数,以逗号隔开。当不需要返回值时,括号可以省略。

    InputBox是VBScript的内建函数,而这段代码最后的WScript.echo看起来也是个函数。即WScript.echo(my_result)的简写。这个“函数”并不是VBScript提供的,而是Windows脚本宿主的功能。不得不在这里介绍是因为需要有一个输出数据的方法,而输出数据的方法VBScript本身并没有提供。事实上Windows脚本宿主对WScript.echo的解释也有不同,当用cscript hello.vbs调用脚本宿主时,WScript.echo输出到命令提示符;当用wscript hello.vbs,或者直接运行hello.vbs时,WScript.echo表现为弹出对话框。

    前面提到的代码都是逐条执行的。而条件分支的含义是根据数据的不同而选择性的执行不同的代码。举例

    dim ageage = InputBox("输入年龄")If age > 18 Then  WScript.echo "成年"Else  WScript.echo "未成年"End If
    关键字 If-Then-Else-End If形成了两个分支,习惯上分支内部的代码最好给予一些空格缩进。If后面的语句是所谓条件表达式。整个表达式会被求值,若为Ture,则运行Then之后的语句后跳至End If,否则跳过Then后面的语句,直接从Else开始直到End If。如果没有Else分支,则直接跳至End If。故Else分支是可选的,当然可以有多个分支:
    dim ageage = InputBox("输入年龄")If age < 18  Then  WScript.echo "少年儿童"ElseIf age > 65 Then  WScript.echo "老年"Else  WScript.echo "其他"End If
    实际上相当于嵌套的分支:
    dim ageage = InputBox("输入年龄")If age < 18  Then  WScript.echo "少年儿童"Else  If age > 65 Then    WScript.echo "老年"  Else    WScript.echo "其他"  End IfEnd If

    除了分支之外,某一段代码还可以反复执行。最简单的情况,例如打印5个"Hello"
    dim ifor i = 1 to 5  WScript.echo "Hello",inext
    关键字 for-to-next创建了一个循环。循环变量i依次赋值为1、2、3、4、5,每次赋值后,for-next之间的代码都会完整执行一次。

    2.3 获取帮助
    以上只是谈到了VBScript最最基本的用法,能够覆盖大概60%的常用情景。但完整使用VBScript需要掌握80%的功能。
    答主极为推荐的Tutorial是下面这个:
    VBScript Tutorial
    只需要阅读VBScript Basics的部分,就可以掌握80%。
    如果遇到了非常疑难的问题,应该参考最权威的官方文档(MSDN):
    VBScript Language Reference





    回复

    使用道具 举报

  • TA的每日心情

    2016-2-20 08:02
  • 签到天数: 1 天

    [LV.1]初来乍到

    88

    主题

    155

    帖子

    625

    积分

    高级会员

    Rank: 4

    积分
    625
     楼主| 发表于 2015-12-22 16:55:29 | 显示全部楼层
    3. 学习Excel VBA
    对于想要学习Excel VBA的非程序员朋友,可能遇到的最大的一个门槛就是“面向对象编程”的概念。但对于掌握VBA,对“面向对象编程”先能够理解到以下程度就基本OK了:

    我家有一只宠物猫。这里,宠物是一个类(class),我家的猫是这个类的一个对象(object)。猫是白色的,白色就是这个对象的一个属性(property)。我家猫去做绝育就是设置(property set)该对象的另外一个属性。猫罐头是在执行该对象的一个方法(method)

    可以认为,Excel以类库(Class Library)的方式扩展了VBScript。在面向对象编程中,对于一个类库有两种使用的方式:1是对类进行继承(例如,类“猫科动物”就是对类“哺乳动物”的继承);2是对类进行例化而形成特定的对象(例如,养一只猫)。对于Excel来说,绝大多数时候在使用第2种方式,即关心如何产生和使用对象。

    对于某种功能,Excel将其设置为属性还是设置为方法是有讲究的,通常来说,对象自身的特性(标题、尺寸)等会被设置为属性,而涉及对象与其他对象交互的功能会被设置为方法。并不是所有的面向对象系统都如此。

    本部分我们将设定一个简单的需求:在工作表中创建一个10x10的矩阵,每个元素都是1~100之间的一个随机整数。

    3.1 环境

    有两种方式可使用Excel VBA,一个是使用Windows VBS引入Excel对象,一个是在Excel内部编程。前一种的好处是,因为程序在Excel外部,故可以连续处理多个Excel文件。后一种的好处是有一个集成开发环境(Excel VBE)可以使用,便于调试,缺点是代码分散,且Excel必须启用宏。

    下面分别讨论。

    3.2 示例

    第一种方法,仍然使用本文第二部分的环境,用记事本新建一个文件,录入以下代码:
    Option ExplicitDim app,workbook,sheetDim row,colSet app = WScript.CreateObject("Excel.Application")app.Visible = TrueSet workbook = app.WorkBooks.AddSet sheet = workbook.Worksheets(1)'10x10 random valueFor row = 1 To 10  For col = 1 To 10    sheet.Cells(row,col).Value = CInt(Int((100 * Rnd()) + 1))  NextNextSet sheet = workbook.Worksheets(2)'10x10 random valuesheet.Range("A1:J10").Formula = "=Int(Rand() * 100 + 1)"

    “WScript.CreateObject("Excel.Application")” 是Windows脚本宿主提供的方法(method)
    WScript就是Windows脚本宿主对象,方法在本质上是这个对象的成员函数。当你的电脑中安装了Excel之后,会在系统数据库中注册叫做Excel.Application这样一个服务。换句话说,WScript.CreateObject("Excel.Application")相当于“启动Excel这个软件”

    注意到这里使用了Set关键字而不是直接赋值,这其中的原因是=只适用于简单数值的赋值,但函数WScript.CreateObject("Excel.Application")的返回值是一个对象句柄。凡对象句柄之间的赋值都要用Set。

    接下来设置这个app对象的属性Visible为True,意为把Excel程序显示出来。如果批量处理很多文件,则不用设置这个属性,程序将在后台运行,不会跳出很多Excel来。

    我们知道启动Excel时会自动新建一个工作簿(WorkBook),但编程创建的App对象不会这么做。实际上,一台电脑(严格的说,是一个登录用户)中所有正在打开的工作簿构成了一个工作簿集合。在VBA里面多个同类的对象通常被归拢到一个集合(collection)当中,而集合本身也是一个对象。在Excel VBA中有各种各样的集合,工作簿集合、工作表集合、图形集合等。对于集合对象有一些统一的方法,例如Add方法的含义是,在该集合中添加一个对象,并返回它。那么Set workbook = app.WorkBooks.Add这句话执行后,Excel就创建了一个新的WorkBook,程序获得了一个workbook对象。

    每一个workbook对象在创立后,它的WorkSheets集合会自动添加3个工作表(如同Excel新建工作簿一样)可以通过调用worksheets方法来得到某个工作表。(注:Excel 2013以及后续,workbook对象在创立后只会自动添加一个工作表)

    对于第一个工作表,我们设置了两重循环为10x10的矩阵设置随机值。CInt()、Int()和Rnd()函数是VBScript内建函数,具体用法可查阅MSDN。对于第二个工作表,我们利用Excel自带的公式得到随机值。这就是所谓“达成同样的目标有不同的方法”。

    以上我们的代码都在Excel外部运行。Excel内部有VBA的集成开发环境,仍然以随机数为例:

    在Excel中按Alt+F11组合键呼出集成开发环境。左侧的工程管理窗口会列出所有打开的工作簿,每一个工作簿对应一个VBAProject。每个VBAProject下除了列出所有的工作表独有的代码之外,还有一个ThisWorkbook的项目文件,代表这个工作薄范围内的代码。除此之外,VBAProject还可能有窗体、用户自己开发的类等等。


    Excel 2013 Visual Basic for Applications Develop Environment,与Visual Basic 6非常相似。

    Excel 2016 Visual Basic 编辑器(微软:对你们苹果用户做到这份儿已经够意思了,要啥自行车啊)。

    我们将代码放进ThisWorkbook中。这个代码被一个Sub子过程包裹,名字是我们自己起的。这段代码和刚才的代码稍有不同,首先,对于一个句柄变量,声明时最好指定它的类型,其次,由于代码已经位于Workbook内部,故无需创建Excel进程、也无需创建workbook对象。Worksheets成为“内建函数”。而CInt等VBScript内建函数此处仍可以使用。

    按F5,由于整个代码块只有一个子过程,该唯一子过程会立即执行。如果关闭了VBA集成开发环境,则可以在Excel菜单中执行“运行宏”来执行这段代码。

    最后,由于Excel的安全策略,含有代码的文件需要保存为.xlsm格式。

    3.3 获得帮助

    学习Excel VBA较为正规的图书是 John Green的 Excel 2007 VBA Programmer's Reference,中文版由Excel Home翻译为《Excel 2007 VBA参考大全》。这本书应至少阅读完前7章。阅读完前4章即可以尝试解决工作中遇到的问题了。

    MSDN的Object model reference (Excel 2013 developer reference) 相当于一本“词典”,经常翻阅非常有好处。

    4 写在最后

    经常使用Excel的人士普遍对Excel公式掌握的出神入化,但Excel VBA却遵循着不一样的思维方式——它更接近于Excel软件自身的运行规律,而不是数据层面的特点。

    VBScript和Excel VBA的系统性非常强,一本系统性强、例子丰富的书籍必不可少,MSDN乃居家必备
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Office Master ( 蜀ICP备16003423号 )

    GMT+8, 2019-10-19 02:41 , Processed in 0.245331 second(s), 23 queries .

    Office Master

    快速回复 返回顶部 返回列表