Speed First'S VBA教程 原版载于http:/speedfirst.mysmth.net peedfirst speedfirst@sina.com 2008-12-4
序言 speedfirst speedfirst@sina.com 2008-12-4 原版载于 http://speedfirst.mysmth.net
目录 0.序言 1.基本编程元素 6 2.对象… 开始编写完整的程序 4.操作文件 5.事件 6.用户窗体… 38 7.根据VBA制作展示PPT… 8.提取Word中未样式化的标题 51 9.操作数据库 10.操作 Windows ap
目录 目录 0. 序言................................................................................................................................... 1 1. 基本编程元素................................................................................................................... 6 2. 对象................................................................................................................................. 12 3. 开始编写完整的程序..................................................................................................... 19 4. 操作文件......................................................................................................................... 24 5. 事件................................................................................................................................. 34 6. 用户窗体......................................................................................................................... 38 7. 根据 VBA 制作展示 PPT ................................................................................................. 42 8. 提取 Word 中未样式化的标题...................................................................................... 51 9. 操作数据库..................................................................................................................... 55 10. 操作 Windows API ....................................................................................................... 61
0序言 某圣贤说过,人和动物的最大之不同在于人知道怎么利用工具。VBA就是一种工 具,一种可以创造工具的工具。VBA提供了给你充分的自由,做几乎任何其他编 程语言或者环境能做的事情,避免重复的手动劳动。当然,有太多人对编程充满 了敬畏,认为编程是类似周小川做金融决策,或者爱因斯坦在思考问题那样很玄 幻、难以理解的事情,更不用说运用了。但其实,这更多的是误解(我觉得这些 误解源自于国内的编程教科书上那些髙深莫测的概念和诘屈聱牙的讲解)。事实 上,20多年来编程正朝着越来越人性化,越来越容易学的方向发展。VBA,确切 的说是VB(我在下面会解释这个微妙的差别)是众多语言中最容易学的,正如 其名字一样,又” Visua1”,又” Basic”。所以大可不必担心诸如“我没有编 程基础”之类的心理障碍 VBA的全称是 Visual Basic for Applications的简称。其意思是开发环境被整 合到了某个应用程序的 Visual basic语言。在本教程中特指整合在 MS Office 中的VBA。(其余的还有比如 VBA for Autocad, VBa for Coreldraw)我简单的 将一门编程语言分为两个大的部分,第一部分是其语法。语法规定了编程指令执 行的顺序和内存的使用方式。尽管如此,语法本身不能解决任何实际的问题,这 就好比你知道了英语语法,但是不懂单词和短语,就不能正确沟通一样;另一个 部分我称之为“库”,就是其他人写好了的,可以完成一定功能的东西。你可以 调用库的某一个部分来完成自己想做的事情。语法和库在一起合作,最终可以完 成复杂的任务。对于BA来讲,使用的是ⅦB的语法(确切的说是VB6的语法, 与目前的B.Net完全不同,如果你不知道我在说什么,那么就忽略这句话好了), 采用的是COM组件这种库,库的功能是让你能操作 Office的各种功能(VB也包 含一个基本的库,以完成一些常见的操作,比如访问文件,字符串操作,数学运 算等。这个库的形式是Func和Sub,而不是COM)。比如代码 For i= 1 To 100 ActiveWindow. Captain =i Next 完成的工作是让当前 Office组件的窗口标题在一瞬间从1变成2,3,…,100 F0R…NXT是B规定的语法,用于循环。这些词语被称为“关键字”,你不能 将关键字用于其他用途。而 ActiveWindow是指当前活动的 Windows窗口, Captain 指窗口标题,这些就是提供0 Efice功能的COM组件。关于COM组件到底是怎么 工作的我会在第1章进行更详细的介绍。你可以类似的写出如下的代码: sum =0 Fori=1 To 100 sum sum + l Next
序言 1 0. 序言 某圣贤说过,人和动物的最大之不同在于人知道怎么利用工具。VBA 就是一种工 具,一种可以创造工具的工具。VBA 提供了给你充分的自由,做几乎任何其他编 程语言或者环境能做的事情,避免重复的手动劳动。当然,有太多人对编程充满 了敬畏,认为编程是类似周小川做金融决策,或者爱因斯坦在思考问题那样很玄 幻、难以理解的事情,更不用说运用了。但其实,这更多的是误解(我觉得这些 误解源自于国内的编程教科书上那些高深莫测的概念和诘屈聱牙的讲解)。事实 上,20 多年来编程正朝着越来越人性化,越来越容易学的方向发展。VBA,确切 的说是 VB(我在下面会解释这个微妙的差别)是众多语言中最容易学的,正如 其名字一样,又”Visual”,又”Basic”。所以大可不必担心诸如“我没有编 程基础”之类的心理障碍。 VBA 的全称是 Visual Basic for Applications 的简称。其意思是开发环境被整 合到了某个应用程序的 Visual Basic 语言。在本教程中特指整合在 MS Office 中的 VBA。(其余的还有比如 VBA for AutoCAD, VBA for CorelDraw)我简单的 将一门编程语言分为两个大的部分,第一部分是其语法。语法规定了编程指令执 行的顺序和内存的使用方式。尽管如此,语法本身不能解决任何实际的问题,这 就好比你知道了英语语法,但是不懂单词和短语,就不能正确沟通一样;另一个 部分我称之为“库”,就是其他人写好了的,可以完成一定功能的东西。你可以 调用库的某一个部分来完成自己想做的事情。语法和库在一起合作,最终可以完 成复杂的任务。对于 VBA 来讲,使用的是 VB 的语法(确切的说是 VB6 的语法, 与目前的 VB.Net 完全不同,如果你不知道我在说什么,那么就忽略这句话好了), 采用的是 COM 组件这种库,库的功能是让你能操作 Office 的各种功能(VB 也包 含一个基本的库,以完成一些常见的操作,比如访问文件,字符串操作,数学运 算等。这个库的形式是 Func 和 Sub,而不是 COM)。比如代码: For i = 1 To 100 ActiveWindow.Captain = i Next 完成的工作是让当前 Office 组件的窗口标题在一瞬间从 1 变成 2,3,…,100。 FOR…NEXT 是 VB 规定的语法,用于循环。这些词语被称为“关键字”,你不能 将关键字用于其他用途。而ActiveWindow是指当前活动的Windows窗口,Captain 指窗口标题,这些就是提供 Office 功能的 COM 组件。关于 COM 组件到底是怎么 工作的我会在第 1 章进行更详细的介绍。你可以类似的写出如下的代码: sum = 0 For i = 1 To 100 sum = sum + i Next
就变成了求1+2+3+…+100的和。而: For i= 1 To 100 MsgBox Next 可以显示100次对话框,依次显示1,2,…,100。可见语法并不关心你到底用了 哪些库在做什么,而仅仅是完成其任务而已(在这里是循环)。在今后的教程中, 我会将重点放在介绍 Office库提供的各种功能上,而不会花很多时间介绍语法。 仅仅是在第一次用某种语法举例子时,我会说明一下。很快你就会发现这是很简 单的一件事情。 在正式介绍编程之间,我简单说一下VBA的开发环境,也就是你写代码的地方 如果你用的是 Office2003,在“工具”菜单找“宏”,在其子菜单中找” Visual Basic”,就可以打开一个新的窗口。如果是在 Office2007中,若你没看到“开 发工具”选项卡的话,先到选项中打开它。 第用 更改Exce中最常用的选项 公式 校对 使用 Excel时釆用的首选顶 保存 回选择时显示浮动工具栏M 回定用实时预览()① 是义 在功能区显示开发工具”选项卡 回总是使用 clearType 信任中心 些色方案Q 色 然后在“开发工具”选项卡的“代码”区域里按” Visual basic”按键,就可以 打开同样的界面。(我用Exce1举例)
序言 2 就变成了求 1+2+3+…+100 的和。而: For i = 1 To 100 MsgBox i Next 可以显示 100 次对话框,依次显示 1,2,…,100。可见语法并不关心你到底用了 哪些库在做什么,而仅仅是完成其任务而已(在这里是循环)。在今后的教程中, 我会将重点放在介绍 Office 库提供的各种功能上,而不会花很多时间介绍语法。 仅仅是在第一次用某种语法举例子时,我会说明一下。很快你就会发现这是很简 单的一件事情。 在正式介绍编程之间,我简单说一下 VBA 的开发环境,也就是你写代码的地方。 如果你用的是 Office 2003,在“工具”菜单找“宏”,在其子菜单中找”Visual Basic”,就可以打开一个新的窗口。如果是在 Office 2007 中,若你没看到“开 发工具”选项卡的话,先到选项中打开它。 然后在“开发工具”选项卡的“代码”区域里按”Visual Basic”按键,就可以 打开同样的界面。(我用 Excel 举例)
icrosoft Visual basic-Book1[模块1(代码) 旧区 件(编(视图(插入①格式(Q)调试()运行)工具①外接程序(A)口M帮助山H 国回·当边遇cP目a题图c 工- PrOiect Sub test o ox Hello. VBA VBAProjeet BookI A ③ Wi crosoft Exe1 山。h 表达式类型上下文 andardhi dth 8.38 visible -1-x1Sheetv 2003和2007的界面完全一样。因为 Office2007添加了若干新的功能,所以只 有库比起2003来多了些东西,表面上看不出来。在“工程”视图中,右键单 击” This Workbook”,然后在菜单中选“插入”-〉“模块”,就会在主界面出现 片空白。键入我在图中写的代码 Sub testo MsgBox "Hello, VBA End Sub 然后点击上面的绿色箭头,就可以运行它了。看看出了什么?:)这就是你的第 个VBA程序了。记住这个写代码的过程,以后我们会反复用到它。并且我不会 再重复。如果你有兴趣,在桌面上新建一个文本文件,将 MsgBox" Hello,VBA 这句放到里面(不要第一句和第三句),然后保存为test.vbs。(注意不是 test.vbs.txt,一定要把默认的扩展名去掉)然后双击这个文件,你又看到了什 么?(如果有杀毒软件或者防火墙问你是否执行脚本,请确认允许。这段代码不 会带来任何伤害)。 以下是对一些常见问题的回答 1.宏和VBA是什么关系?广义上来讲,宏就是VBA。我说“一段宏代码”和 段VBA代码”是等价的。 Office的自动录制功能可以帮你录制一个 宏,实际上就是把你的动作用ⅤBA代码的形式记录下来。狭义上,宏是指 个无参数的非 Private的Sub(我会在后边解释什么是Sub),如果手 写代码的话,只有这种Sub才会出现在“宏”那个对话框的列表里
序言 3 2003 和 2007 的界面完全一样。因为 Office2007 添加了若干新的功能,所以只 有库比起 2003 来多了些东西,表面上看不出来。 在“工程”视图中,右键单 击”ThisWorkbook”,然后 在菜单中选“插入”->“模块”,就会在主界面出现 一片空白。键入我在图中写的代码: Sub test() MsgBox "Hello, VBA" End Sub 然后点击上面的绿色箭头,就可以运行它了。看看出了什么?:)这就是你的第 一个 VBA 程序了。记住这个写代码的过程,以后我们会反复用到它。并且我不会 再重复。如果你有兴趣,在桌面上新建一个文本文件,将 MsgBox "Hello, VBA" 这句放到里面(不要第一句和第三句),然后保存为 test.vbs。(注意不是 test.vbs.txt,一定要把默认的扩展名去掉)然后双击这个文件,你又看到了什 么?(如果有杀毒软件或者防火墙问你是否执行脚本,请确认允许。这段代码不 会带来任何伤害)。 以下是对一些常见问题的回答: 1. 宏和 VBA 是什么关系?广义上来讲,宏就是 VBA。我说“一段宏代码”和 “一段 VBA 代码”是等价的。Office 的自动录制功能可以帮你录制一个 宏,实际上就是把你的动作用 VBA 代码的形式记录下来。狭义上,宏是指 一个无参数的非 Private 的 Sub(我会在后边解释什么是 Sub),如果手 写代码的话,只有这种 Sub 才会出现在“宏”那个对话框的列表里
序言 2.既然可以录制宏,为何还要手写代码?首先,宏录制的局限性很大,很多 动作(比如鼠标行为)是录不下来的。另外宏只能录制顺序的多个指令 如上面的比较复杂一点的循环就不可能录制。而且宏录制不能覆盖ⅤBA 的强大功能。例如ⅦBA可以直接读写文件系统中的任何文件。这些动作是 录不下来的。最后,录制宏得到的代码非常死板,不灵活,而且很冗余, 如果你知道了怎么写,就会立刻抛掉这个宏录制功能。事实上 Powerpoint2007已经取消了宏录制。 3.VBA能干什么?如果你想避免重复劳动,或者需要多个文档协作,VBA是 最好的选择。虽然默认下,VBA只可以操作VB自带的库和 Office的库, 但可以通过添加引用的方式来为其扩充功能。理论上VBA可以操作任何 WindOws api(代表你的 Windows能做的任意事情),和任意用COM封装 的组件。比如像 Acrobat, EndNote等都是这么做的。它们可以使自身的 功能和办公紧密结合。如果你高兴,大可以写一个Word用的聊天插件 4.VBA不能干什么?什么时候不适合使用VBA?VBA的功能取决于其库。如 果没有库提供一个功能(比如让 Excel一个单元格显示一副图片),那么 VBA也不能帮你。此外,你还可以用VBA编写插件来完成普通 Office不 能完成的功能。此外,如果你开发的项目过于庞大,则应该换一门更专业 的编程平台(比如.Net),以便更好的组织代码和査错。VBA比较适合短 小的,与工作任务很直接的问题。 5.VBA能访问某个文本文件么?当然可以。VBA直接提供OPEN关键字来访问 文件。 VBA能模拟键盘输入么?当然可以。VBA直接提供 SendKeys函数来做到这 7.VBA会被保存在哪里?VBA是保存在 Office文档中的,具体可以是某一个 文档,或者某一个文档的模板中。具体的位置需要在工程视图中选择(如 上图)。如果你希望一批文档都能用到同一个功能,最好先写个模板,然 后将ⅦBA写到模板里。然后利用此模板来生成多个文档。当然,VBA代码 也可以单独导出保存。在工程视图中右键单击某一个模块然后点“导出文 件”即可。 8.不同 Office组件可以互操作么?当然可以。VBA的功能是由COM库来添 加的。默认情况下某一个 Office组件只引用了当前这个组件的库。但是 你也可以手动添加其他库的引用。在VBA开发环境的“工具”菜单里点击 “引用”,就可以添加 Windows上安装的任意COM组件。这样,不光不同 Office组件可以互操作,你可以操作比如 Media Player,IE等程序。 9.VBA可以写图形界面么?当然可以。不然就说不上” Visua1”了。WB一向 支持一种被称为 UserFor皿的模块。你可以在上面添加各种控件。 10.VBA还提供哪些其他的功能?VBA可以捕捉 Office的事件,于是可以编写 如“当打开一个文档,要做某事”;“当 Excel计算发生了错误,则做某 事”这样的程序。VBA还有定时器,让你可以做周期性的工作。 1.除了VBA,还有哪些开发平台可以操作0 ffice?实际上,任何可以使用 COM组件的语言都可以访问 Office的功能。在微软平台上的各种语言基 本上都满足这个条件。不过有几个平台是专门针对0 ffice的。如.Net上 的WST0( Visual studio Tools for Office Developers)。这是一个利 用 Visual studio进行 Office开发的集合环境,适合大型项目。不过为
序言 4 2. 既然可以录制宏,为何还要手写代码?首先,宏录制的局限性很大,很多 动作(比如鼠标行为)是录不下来的。另外宏只能录制顺序的多个指令, 如上面的比较复杂一点的循环就不可能录制。而且宏录制不能覆盖 VBA 的强大功能。例如 VBA 可以直接读写文件系统中的任何文件。这些动作是 录不下来的。最后,录制宏得到的代码非常死板,不灵活,而且很冗余。 如果你知道了怎么写,就会立刻抛掉这个宏录制功能。事实上 PowerPoint2007 已经取消了宏录制。 3. VBA 能干什么?如果你想避免重复劳动,或者需要多个文档协作,VBA 是 最好的选择。虽然默认下,VBA 只可以操作 VB 自带的库和 Office 的库, 但可以通过添加引用的方式来为其扩充功能。理论上 VBA 可以操作任何 Windows API(代表你的 Windows 能做的任意事情),和任意用 COM 封装 的组件。比如像 Acrobat,EndNote 等都是这么做的。它们可以使自身的 功能和办公紧密结合。如果你高兴,大可以写一个 Word 用的聊天插件:) 4. VBA 不能干什么?什么时候不适合使用 VBA?VBA 的功能取决于其库。如 果没有库提供一个功能(比如让 Excel 一个单元格显示一副图片),那么 VBA 也不能帮你。此外,你还可以用 VBA 编写插件来完成普通 Office 不 能完成的功能。此外,如果你开发的项目过于庞大,则应该换一门更专业 的编程平台(比如.Net),以便更好的组织代码和查错。VBA 比较适合短 小的,与工作任务很直接的问题。 5. VBA 能访问某个文本文件么?当然可以。VBA 直接提供 OPEN 关键字来访问 文件。 6. VBA 能模拟键盘输入么?当然可以。VBA 直接提供 SendKeys 函数来做到这 一点。 7. VBA 会被保存在哪里?VBA 是保存在 Office 文档中的,具体可以是某一个 文档,或者某一个文档的模板中。具体的位置需要在工程视图中选择(如 上图)。如果你希望一批文档都能用到同一个功能,最好先写个模板,然 后将 VBA 写到模板里。然后利用此模板来生成多个文档。当然,VBA 代码 也可以单独导出保存。在工程视图中右键单击某一个模块然后点“导出文 件”即可。 8. 不同 Office 组件可以互操作么?当然可以。VBA 的功能是由 COM 库来添 加的。默认情况下某一个 Office 组件只引用了当前这个组件的库。但是 你也可以手动添加其他库的引用。在 VBA 开发环境的“工具”菜单里点击 “引用”,就可以添加 Windows 上安装的任意 COM 组件。这样,不光不同 Office 组件可以互操作,你可以操作比如 Media Player,IE 等程序。 9. VBA 可以写图形界面么?当然可以。不然就说不上”Visual”了。VB 一向 支持一种被称为 UserForm 的模块。你可以在上面添加各种控件。 10.VBA 还提供哪些其他的功能?VBA 可以捕捉 Office 的事件,于是可以编写 如“当打开一个文档,要做某事”;“当 Excel 计算发生了错误,则做某 事”这样的程序。VBA 还有定时器,让你可以做周期性的工作。 11.除了 VBA,还有哪些开发平台可以操作 Office?实际上,任何可以使用 COM 组件的语言都可以访问 Office 的功能。在微软平台上的各种语言基 本上都满足这个条件。不过有几个平台是专门针对 Office 的。如.Net 上 的 VSTO(Visual Studio Tools for Office Developers)。这是一个利 用 Visual Studio 进行 Office 开发的集合环境,适合大型项目。不过为
了使用它,你必须得安装 Visual studio2005或者2008。这对于办公族 来说负担过重了。只有开发复杂的插件,或者开发企业办公管理系统的人 才应该使用它。此外 Apache基金会有一个POI项目,可以让Java程序访 问 Office文档。这样用Java开发,同时又想自动生成 Office文档的人 比如用Java写实验,但想用 Excel文档统计实验结果)可以利用POI 来达到他们的目标。不过POI目前不支持 Office2007的文件格式
序言 5 了使用它,你必须得安装 Visual Studio 2005 或者 2008。这对于办公族 来说负担过重了。只有开发复杂的插件,或者开发企业办公管理系统的人 才应该使用它。此外 Apache 基金会有一个 POI 项目,可以让 Java 程序访 问 Office 文档。这样用 Java 开发,同时又想自动生成 Office 文档的人 (比如用 Java 写实验,但想用 Excel 文档统计实验结果)可以利用 POI 来达到他们的目标。不过 POI 目前不支持 Office 2007 的文件格式
基本编程元素 1.基本编程元素 这一期就是要介绍在ⅦBA环境下你能使用什么东西。一般来讲,新手往往对到底 写什么会引起什么结果感到比较混乱。比如写 MsgBox可以出现对话框,但写 MessageBox为什么就不可以。在VBA中,直接写代码,而不是在Sub里写就会 报错?为何是Sub,而不是Suc,不是Sud?等等。我会将最常见的做概要性的 讲解。但是我不会深入去介绍每个细节的语法。精简够用就好。如果有必要,你 可以查任何的关于VB的参考手册。 Sub与 Function 最基本的问题是:如果你写了很多模块,每个模块有很多代码,那么你的程序代 码是从哪一句开始执行?答案是,VB将代码组成一段一段的,每段从头到尾执 行(当然,这是粗略的说,因为代码还可能有跳转和循环)。每一段叫做一个 Sub或着一个 Function。Sub是子过程“ Subroutine”的简称。比如像如下的代 码就定义了一个Sub Sub Testo MsgBox Hello"Show Hello with a messagebox End Sub 其中”Sub”这个关键字标志着Sub的开始, End Sub则表示其结束。其中的Sub 和 End Sub是关键字。所谓关键字就是VB定义好的,有特殊意义的词汇。在写 代码时不可以写错一个字母,否则就不被程序解释器接受(但是你可以不区分大 小写,VBA开发环境会自动帮你调整)。如果你在开发环境中写了这段代码就会 发现关键字都被表为蓝色。其他的,如For,Next,If,Then, While等都是关 键字。以上代码中的Test是一个名称,即这个Sub的名称。你可以随意定义这 个名称,只要其不包含一些特别的符号,并且不和关键字重名(注意:绝对不能 包含空白字符,如空格或制表符)。写完这段代码后,在 Office的“宏”对话 框列表里就能看到一项“Test”了。代码中的括号是用于定义参数的。如果想在 Sub/ Function上加输入参数,都是在括号中写一个列表,即 参数名1As类型1,参数名2As类型2,… 参数和类型在下面的“变量与类型”一节更详细的介绍。即使没有参数也要写个 空括号来占位置。这是VB的要求。之后,当你将键盘光标放在这个Sub里,并 点击上面的绿色箭头;或者到“宏”对话框执行Test,这个Sub就被执行了。 另外值得注意的是单引号后边的文字,称为注释。VB中所有写在单引号后边的 文字都会被解释器忽略掉,它们仅仅是给人看的。所以你可以在写代码时加上注 释,方便其他人看懂你的程序
基本编程元素 6 1. 基本编程元素 这一期就是要介绍在 VBA 环境下你能使用什么东西。一般来讲,新手往往对到底 写什么会引起什么结果感到比较混乱。比如写 MsgBox 可以出现对话框,但写 MessageBox 为什么就不可以。在 VBA 中,直接写代码,而不是在 Sub 里写就会 报错?为何是 Sub,而不是 Suc,不是 Sud?等等。我会将最常见的做概要性的 讲解。但是我不会深入去介绍每个细节的语法。精简够用就好。如果有必要,你 可以查任何的关于 VB 的参考手册。 Sub 与 Function 最基本的问题是:如果你写了很多模块,每个模块有很多代码,那么你的程序代 码是从哪一句开始执行?答案是,VB 将代码组成一段一段的,每段从头到尾执 行(当然,这是粗略的说,因为代码还可能有跳转和循环)。每一段叫做一个 Sub 或着一个 Function。Sub 是子过程“Subroutine”的简称。比如像如下的代 码就定义了一个 Sub。 Sub Test() MsgBox "Hello" 'Show Hello with a messagebox End Sub 其中”Sub”这个关键字标志着 Sub 的开始,End Sub 则表示其结束。其中的 Sub 和 End Sub 是关键字。所谓关键字就是 VB 定义好的,有特殊意义的词汇。在写 代码时不可以写错一个字母,否则就不被程序解释器接受(但是你可以不区分大 小写,VBA 开发环境会自动帮你调整)。如果你在开发环境中写了这段代码就会 发现关键字都被表为蓝色。其他的,如 For,Next,If,Then,While 等都是关 键字。以上代码中的 Test 是一个名称,即这个 Sub 的名称。你可以随意定义这 个名称,只要其不包含一些特别的符号,并且不和关键字重名(注意:绝对不能 包含空白字符,如空格或制表符)。写完这段代码后,在 Office 的“宏”对话 框列表里就能看到一项“Test”了。代码中的括号是用于定义参数的。如果想在 Sub/Function 上加输入参数,都是在括号中写一个列表,即 参数名 1 As 类型 1,参数名 2 As 类型 2,... 参数和类型在下面的“变量与类型”一节更详细的介绍。即使没有参数也要写个 空括号来占位置。这是 VB 的要求。之后,当你将键盘光标放在这个 Sub 里,并 点击上面的绿色箭头;或者到“宏”对话框执行 Test,这个 Sub 就被执行了。 另外值得注意的是单引号后边的文字,称为注释。VB 中所有写在单引号后边的 文字都会被解释器忽略掉,它们仅仅是给人看的。所以你可以在写代码时加上注 释,方便其他人看懂你的程序
基本编程元素 Function和Sub是很类似的东西。比如: Function Add(al As Integer, a2 As Integer) As Integer sum= a1+a2 Add sum End Function 这个例子实现了一个 Function,含义是将两个整数加起来。这次我添加了两个 参数a1和a2用于输入,其类型均为 Integer。参数的语法Sub和 Function是 样的。形式上, Function和Sub仅仅有关键字的差别。 Function与Sub最大 的不同就在于 Function需要返回一个值,而Sub不需要。第一行最后那个“As Integer”是指返回值的类型。返回的语法是: Function名称=想要返回的值 那么什么叫“返回”呢?这是因为程序段之间是可以互相调用的。Sub和 Function可以调用其他的Sub和 Function。整个程序的执行顺序大致如下图所 程序开始 程序结束 图中的矩形相当于一个Sub或者 Function,箭头代表程序的执行顺序(注意矩 形的长短不代表代码的长短,而仅仅是排版需要;并且调用层数不一定是3层 每个Sub/ Function都可以调用其他的Sub/ Function,这种形式造成了一种层数 无限定的树状结构。在调用时,上层可以以参数的形式给予下层输入,而下层将 控制权返回给上层的时候,也可以给上层一个返回值(只有 Function可以)
基本编程元素 7 Function 和 Sub 是很类似的东西。比如: Function Add(a1 As Integer, a2 As Integer) As Integer sum = a1 + a2 Add = sum End Function 这个例子实现了一个 Function,含义是将两个整数加起来。这次我添加了两个 参数 a1 和 a2 用于输入,其类型均为 Integer。参数的语法 Sub 和 Function 是 一样的。形式上,Function 和 Sub 仅仅有关键字的差别。Function 与 Sub 最大 的不同就在于 Function 需要返回一个值,而 Sub 不需要。第一行最后那个“As Integer”是指返回值的类型。返回的语法是: Function 名称=想要返回的值 那么什么叫“返回”呢?这是因为程序段之间是可以互相调用的。Sub 和 Function 可以调用其他的 Sub 和 Function。整个程序的执行顺序大致如下图所 示: 图中的矩形相当于一个 Sub 或者 Function,箭头代表程序的执行顺序(注意矩 形的长短不代表代码的长短,而仅仅是排版需要;并且调用层数不一定是 3 层)。 每个 Sub/Function 都可以调用其他的 Sub/Function,这种形式造成了一种层数 无限定的树状结构。在调用时,上层可以以参数的形式给予下层输入,而下层将 控制权返回给上层的时候,也可以给上层一个返回值(只有 Function 可以)
基本编程元素 比如上面的Sub“Test”调用了VB已经定义好的 MsgBox这个 Function来完 成工作(是不是觉得 MsgBox应该是一个Sub?实际上 MsgBox会返回一个整数值 表示用户是按哪个键关闭对话框的,比如“确定”,“取消”,“重试”等。只 不过在最简单的情况下我们不关心这个返回值罢了)。另外,我们也可以写一个 程序让Test调用Add Sub Testo sum Add(3, 4) MsgBox sum End Sub 这样就能用对话框显示3与4的和了。在实践当中,Sub一般用于执行某个动作; 而 Function则在 Excel自定义函数中特别有用。VB为开发者提供了一个很大的 库,即你可以直接使用许许多多的Sub和 Function来完成常见的任务(这和 Office库无关),比如字符串操作的 Substr,Trim,Len:;文件操作的Dir, Write; 数学运算的Log,Sqr等。完整的清单可以在任何一本VB的参考手册上找到。 ●变量与类型 我们在算数的时候需要草稿纸,将计算的中间结果记录下来。计算机算数也不例 外,也得需要在内存中开辟一些空间来记录这些内容。定义一块空间的方法的代 码是 Dim var 或者 Dim var As Type 或者就像上文Test中的sⅧ那样不经定义直接使用。其中Dim和As是关键字, 而var就是变量名。你可以随意定义变量名称,只要其不包含一些特别的符号, 并且不和关键字重名。既然是分配一块内存空间,那么分配空间有多大呢,又是 怎么使用的呢?这就由类型来定义了。一个类型规定了要分配的空间的大小和内 部结构,比如 Integer整数就分配2个Byte(所以其范围是-3276832767) 而Long长整型数分配4Byte; Double双精浮点数(小数)就分配8个Byte; String 字符串的长度就是其存储字符串长度+一块用于存放字符串的长度的额外空间。 以上这些类型由VB定义,被称为基本类型(还有其它几个基本类型可以使用) VB会尽可能在你混用这些基本类型时进行自动转换。比如: Dim str As String Dim n As Integer str= 12 now str is 12 n=34now n is 34 n= 23. 45 ' now n is 23
基本编程元素 8 比如上面的 Sub “Test” 调用了 VB 已经定义好的 MsgBox 这个 Function 来完 成工作(是不是觉得 MsgBox 应该是一个 Sub?实际上 MsgBox 会返回一个整数值 表示用户是按哪个键关闭对话框的,比如“确定”,“取消”,“重试”等。只 不过在最简单的情况下我们不关心这个返回值罢了)。另外,我们也可以写一个 程序让 Test 调用 Add。 Sub Test() sum = Add(3,4) MsgBox sum End Sub 这样就能用对话框显示 3 与 4 的和了。在实践当中,Sub 一般用于执行某个动作; 而 Function 则在 Excel 自定义函数中特别有用。VB 为开发者提供了一个很大的 库,即你可以直接使用许许多多的 Sub 和 Function 来完成常见的任务(这和 Office 库无关),比如字符串操作的 Substr,Trim,Len;文件操作的 Dir,Write; 数学运算的 Log,Sqr 等。完整的清单可以在任何一本 VB 的参考手册上找到。 变量与类型 我们在算数的时候需要草稿纸,将计算的中间结果记录下来。计算机算数也不例 外,也得需要在内存中开辟一些空间来记录这些内容。定义一块空间的方法的代 码是: Dim var 或者 Dim var As Type 或者就像上文 Test 中的 sum 那样不经定义直接使用。其中 Dim 和 As 是关键字, 而 var 就是变量名。你可以随意定义变量名称,只要其不包含一些特别的符号, 并且不和关键字重名。既然是分配一块内存空间,那么分配空间有多大呢,又是 怎么使用的呢?这就由类型来定义了。一个类型规定了要分配的空间的大小和内 部结构,比如 Integer 整数就分配 2 个 Byte(所以其范围是-32768 ~ 32767); 而 Long 长整型数分配 4Byte;Double 双精浮点数(小数)就分配 8 个 Byte;String 字符串的长度就是其存储字符串长度+一块用于存放字符串的长度的额外空间。 以上这些类型由 VB 定义,被称为基本类型(还有其它几个基本类型可以使用)。 VB 会尽可能在你混用这些基本类型时进行自动转换。比如: Dim str As String Dim n As Integer str = 12 'now str is "12" n = "34" 'now n is 34 n = 23.45 'now n is 23