1、从零开始,步入 Word 宏编程的世界(第一讲)工作中,经常看到许多朋友在使用 Office 时已经非常地熟练,但仍不敢去接触 Office 的 VBA 编程;在网上 Office 的 VBA 编程论坛中,同样看到有朋友在其中流连了相当长的时间,但仍然不得其门而入。问一下这两类朋友,前者觉得编程是一件很“高深”的事,自己恐怕学不会;后者为了提高自己的工作效率,虽然很想学,但自己一点编程的基础也没有,照着网上高手们的帖子做,反而越学越糊涂。当我问第二类朋友为什么不多看看 VBA 的帮助文件时, “看不大懂,就像有语言障碍一样。 ”他这样回答我。对于第一类朋友,我想说,不要被自己想象出来的“困难”
2、吓倒,如果您没有亲自尝试过,怎么知道编程会很“高深”,又怎么知道自己学不会?而第二类朋友如果能静下心来把基础知识补一补,相信您的问题也会迎刃而解。那么,就让我们从最基础的知识开始,步入 Office 宏编程的世界吧。文前的几点说明:1、虽说本文用到的程序在 office2007 与 office2010 中同样可以正常运行,但考虑到目前单位办公用机的实际情况,本文所有的实例主要还是面向 Office2003 的用户;2、为了便于各位读者理清思路,避免文章涉及面太广,本文主要以 office2003 中最常用的 Word 为主进行讲述,有与其它 Office 套件相关联的地方,将单独说明;3、为
3、避免学习过程中的枯燥乏味,本文没有像传统编程教材那样以理论知识为线索展开,而是将不同的知识点放到了几个不同的实例之中进行讲述。所以,把每个实例“做”一遍,细心体会每个实例的知识点,将有助于您快速掌握 VBA 的编程技术;单纯地“ 看”,则无助于您的学习。本文的宗旨是完全面向初学者!或许您还能以此为契机叩开奔向 VB60 或 VB.NET 的大门,说不定您还能编出一、两个病毒玩玩儿(当然仅限于玩玩儿,千万别做出什么傻事来!)!好了,下面就开始我们 Word 的 VBA 编程之旅吧,愿您旅途愉快!实例一:“你好,世界!”知识点: 1、熟悉 VBE 的编程界面;2、什么是 VB、VBE、VBA;3、
4、什么是过程、工程。不要以为这些知识点有多难,让我们一步一步地来。启动 Word,指向工具宏VB 编辑器,打开 VB 编辑器的界面,如图 1-1。“VB 编辑器”就是 VBE,VBE 是 Visual Basic Editing 的缩写。我们在 VBE 编程环境中所使用的编程语言就是“VBA” ,即 Visual Basic for Applications 的缩写,VBA 语言是我们所熟知的 VB 编程语言的一个子集。VBE 编辑器界面的菜单栏与工具栏就不必说了。界面左面中间部份是“工程资源管理器”所在的“工程资源管理区”,每一篇 Word 文档中所编写的程序,Word 都把它看成为一个“工程
5、”, “工程资源管理器”就是对这些工程进行管理的地方;界面左下方是“对像属性设置区”,我们可以对自己要用到的对像的属性进行设置,第四个实例中,我们将对“属性设置”进行详细解说,现在大家不必管它;界面右面大面积空白的区域是“代码编辑区”,我们编写的所有代码都放在这儿。如果看不到这个空白区域,则打开“插入”菜单,插入一个“模块”就行了。如果“工程资源管理器”已有“ 模块”,则双击模块名,就能打开“ 代码编辑区”。好,现在我们就在这个 VBE 环境下,利用 VBA 语言,来编写我们的第一个工程(即程序) 。请在“代码编辑区” 中输入如下的代码:sub A ()msgbox(“你好,世界!”)end
6、sub注意,代码“msgbox(“你好,世界! “)”一句中的引号与括号为英文标点。点击工具栏上的黑色三角形的“ 播放键”,或按下 F5 键运行这个程序,您将看到一个弹出的消息框。如图 1-2。代码解说:sub 是 VB 编程中申明一个过程的语句,sub A ( )申明了一个名叫 A 的过程,A 后面跟了一个括号,它的作用现在大家暂时不用管它。整段程序结尾的 end sub 语句,表示过程“A”在此结束。每一个程序都必需有开始与结束的标志,所以,从 Sub A ( )到 End sub 就构成了一个完整的“过程”。Msgbox 是一个函数,它的作用是弹出一个消息框来,它后面括号中的内容就是要在
7、弹出的消息框中显示的内容。该函数在我们的第二个实例中,将做详细讲解。本实例的知识扩展:1、打开 Word,指向工具宏,再点击“宏”按钮,打开“宏名”对话框。这时,我们就可以看到刚才我们编写的名叫“A”的宏。选中 “A”,点击“运行”按钮,就能运行该宏。2、同上操作顺序,打开“宏名”对话框,在“ 宏名”中新输入一个名字“B” (注意没有引号) ,再点击“创建”按钮,这时就会打开 VBE 编辑器,并已为我们生成了一个名为“B”的空过程。该过程中的绿色文字,就是这个宏的注释。 (如果我们要对自己所编写的代码进行注释,可在注释语句的前面加上一个英文状态下的撇号,该注释的语言是不会被程序运行的。 )用这
8、个方法创建过程,可以避免手工输入时疏忽掉程序结尾的 End sub。好了,实例一到此结束,回顾一下课前的知识点,都掌握了吗?如果觉得没有问题了,就准备进入我们的第二个实例吧。从零开始,步入 Word 宏编程的世界(第二讲)实例二:基本的对话框函数知识点: 1、认识消息框函数 MxgBox 与输入框函数 InputBox;2、什么是常量、什么是变量、申明变量的方法是什么;3、用“&”符号连接字符串。想想我们平时与他人谈话时的形式你提问,他回答;或是他提问,你回答。我们所编写的程序,在与计算机进行交互的过程中,其形式也是这样的一问一答。所以,几乎所有的编程语言都提供有直接与计算机进行对话的函数,在
9、 VBA 中,这样的最基本的函数是消息函数“MsgBox”与输入框函数“InputBox”。请输入以下代码并运行:=还有待完善的程序一=sub B()Dim XX = inputbox(“您的姓名是:“)。Msgbox( “ 欢迎您“ & X & “朋友!“)End Sub注意:、在输入“Msgbox( “ 欢迎您“ & X & “朋友!“)”这行代码时,括号内几个字符串之间有空格,没有输入空格的话会出错,出错时,代码将以红色显示。、本程序运行时如果点“取消”按钮,其实会出现问题,关于对这个问题的解决方法,将在后面讨论。所以,我们先称本程序为“还有待完善的程序”。(朋友们可以先试一下,看看会出
10、现什么问题?)。运行效果如图 2-1 与图 2-2。看到了吗?这就是最简单的与计算机进行对话的效果。代码解说:从 Sub B()到 End sub 就是一个完整的过程“B”。“InputBox(“您的姓名是:“)”这句代码是显示一个“输入框”,请您输入自己的姓名。这句代码事实上就是一个计算机提问,人回答的“对话”过程。其中,“InputBox”函数的作用就是弹出一个输入框,等待我们回答计算机的提问。当然,我们在回答计算机时,可能填的是“老王”也可能填的是“老李”,这个答案本身是不固定的,所以,我们将这个答案的值赋予“变量”“X”。这下,大家可能就知道“变量”的含意了吧?在程序运行中,我们经常会
11、遇到值不能确定,或者是可能会发生改变的某个数据,在这个时候,我们就用一个“符号”来“代替”这个可能会变化的值,这个用来代替不能确定的值的“符号”,就是“变量”。现在,我们删去本程序中的“Dim X”这句后,再运行一下试试效果。怎么样,是不是感觉不到区别?(如果程序报错说“没有申明变量”的话,没有关系,请接着看下面的内容。)在 VBA 语言中允许我们不申明变量就直接运用它,所以程序仍然能够正常运行。“Dim X”这句代码中的“Dim”就是申明变量的函数,“Dim X”就是申明了一个名叫“X”的变量。在“X=inputbox(“您的姓名是:“)”这句代码中,我们利用等号,将输入框中取得的值赋予给了
12、变量“X”。虽说我们不申明变量就可以使用它,但这绝对不是个好的习惯。首先,在一些代码较长的程序中,您能保证那些名字较长的变量在后面用到时,您不会输错吗?其次,自己不申明变量,时间久了,那些较长的程序可能会连您自己也看不懂;另外,程序在访问申明过的变量时,速度会比访问没有申明过的变量要快一些。为了避免我们使用变量时出错,我们可以在 VBE 编辑器菜单的工具选项编辑器选项卡上,选中“要求申明变量”(见下面图 23、24),这样 VBE 会自动在我们每一个工程的前面加上一句“Option Explicit”,这句代码将检查我们所要使用的变量是否申明,没有申明的话就会中止程序的运行。做了上述的操作后,
13、我们再运行去掉“Dim X”语句的过程,程序就会报“没有申明变量”的错误。关于变量,还有一些其它的知识,我们将在实例三中进行更深一步的学习,现在就到这吧。“Msgbox( “ 欢迎您“ & X & “朋友!“)”这句中的“msgBox”函数,大家已不陌生,它的作用就是弹出一个消息框来(在本程序中,这个消息框就是计算机对我们输入姓名后的回答。)。在这个消息框所显示的文字中包含了三个部分。字符串“欢迎您” 、字符串“朋友!”和变量“X”所可能对应的字符串“老王、老李”等。在 VBA 语言中,我们使用“&”符号来连接字符串,所以我们在程序运行最后,看到的是一个像图 2-2 那样完整的欢迎语句。VBA
14、 语言中,在使用“&”连接符号时,请一定注意字符串与字符串之间有一个空格,否则程序一定会出错。由于 MsgBox 函数与 InputBox 函数是两个非常常用的对话函数,所以,我们再对它进行更深一步的学习。使用 MsgBox 函数时的标准格式:变量=MsgBox(”要显示在这儿的语句”,按钮的参数,”消息框的题目”)例子:Y= MsgBox(”欢迎您” & X &”朋友!”,0,”这里是欢迎对话框”)请注意格式中英文状态下的引号、逗号与空格的使用。使用 InputBox 函数时的标准格式:变量=InputBox(“要显示的提示文本”,” 输入框的题目”,”输入框中默认显示的语句”)例子:X=
15、InputBox(“请输入您的姓名”,”这里是输入对话框”,”您的姓名请输入到这儿。”)。根据上面的格式,请修改本实例的程序代码为:=还有待完善的程序二=Sub B()Dim XDim YX = inputbox(“您的姓名是:“,” 姓名输入框”,” 您的姓名请输入到这儿。”)Y = Msgbox( “ 欢迎您“ & X & “朋友!“,0,” 这里是欢迎对话框.”)End Sub本段程序应该很容易读懂吧?运行一下,看看与前面程序的区别在什么地方?再分别把 MsgBox 函数的参数 0 替换为 0、1、2、3、4、5 这几个参数并运行,看看又有什么不同?怎么样,对话框中给出的提示是不是更丰富
16、?下面的图 2-5 与图 2-6 是 MsgBox 函数的参数为“5”时的运行效果。(请与前面的图 2-1 与图2-2 对比一下,看看到底哪些地方有了变化?)。程序写到这么详细,您是否已经觉得它已经很完善了呢?那么,在当程序要求您输入您的姓名时,如果您选择了“取消”,会有什么现象呢?对,“取消”按钮同样会向程序返回一个值。为了使用函数时更灵活一些,VBA 将这些返回的值“固定”为以下的数值,这些在程序中被固定的值,就是“常数”。MsgBox 函数的常数如下:“确定”按钮被单击时,返回“1”;“取消”按钮被单击时,返回“2”;“终止”按钮被单击时,返回“3”;“重试”按钮被单击时,返回“4”;“
17、忽略”按钮被单击时,返回“5”;“是”按钮被单击时,返回“6”;“否”按钮被单击时,返回“7”。InputBox 函数在使用过程中,当人们输入了值的时候,选择“确定”或按下回车键,则返回输入框中的内容,输入框中的内容显示不是“固定”的,也就是说它不是常数;但是,如果人们在要求输入之时选择的是“取消”按钮,则会返回一个值,这个值是“空值”,注意“空值”并不是“零”。所以,InputBox函数只有一个常数“空”。下面,我们用:如果(If)、那么(Then)、否则(else)、结束(end if)判断语句来完善我们今天的实例。关于“If”判断语句,不是本实例的学习重点,下节课我们将会详细介绍它。代码
18、中必要的地方已添加了注释(还记得为代码添加注释的方法吗?)。=完善后的 B 程序=Sub B()Dim XDim YX = InputBox(“您的姓名是:“, “ 姓名输入框“, “ 您的姓名请输入到这儿。“)If X “ Then”中的“d),还是猜小了(b程序中数字的比较,是利用 If 语句来实现的。在实例二中,我们已接触过 If 语句,If 语句的基本格式是:If(条件)Then(结果)End If(结束 If 判断语句)在 If 语句判断的过程当中,还可以有子判断语句:Elseif then 。对于一个具有多重判断的语句,我们大致可以这样理解:如果(If),那么(Then),否则(E
19、lseif),那么(Then),再否则(Elseif),那么(Then)(ElseIf 根据情况可以套嵌很多层)最终(Else),结束判断(End If)。本实例的知识扩展:1、试一试自己在程序结尾处再添几句,判断所猜的次数:如果小于六次,给出一个评价“优”;等于六次,给出一个评价“良”;大于六次,给出一个评价“您还需努力!”。2、试一试给程序补充部分内容,其功能为:在猜完一次后,询问游戏人“您还愿意再玩一次吗?”,并根据游戏者的响应,再次运行程序或退出程序。3、如果在刚开始游戏让我们输入数字时,我们选择了“取消”就会出错,您现在能利用自己已有的知识来解决这个问题吗?好了,到这里,我们再回过头
20、来看一看这个程序,理解起来还有困难吗?本实例可能比前两个实例稍难一点。如果您能顺利完成知识扩展中的问题题,那么祝贺您,您已过了入门的第一个小难关,可以进入下一步的实例四了,如果您还存在疑问,则再请多动手把前三个实例练一练!附:完善的猜数游戏Sub 您猜()Dim a, b, c, d, e, fe=6该数字用于计算所猜次数是否为优、良等Doa = 0Randomizeb = Int(100 * Rnd)Doa = a + 1c = InputBox(“请输入您所猜的数“)d = CInt(c)If b d ThenMsgBox (“您猜的数小了“)Else: b = dMsgBox (“哈哈,
21、您猜对了!“)Exit DoEnd IfLoopMsgBox (“您猜了“ & a & “次!“)If aeMsgBox (“您还需努力!“)Elseif aMsgBox (“您的猜数能力:优!“)Else a=eMsgBox (“您的猜数能力:良!“)End iff=MsgBox (“您还愿意继续玩吗?“,4,”继续游戏”)注意此处常数的使用if f=7 then注意此处消息框返回值的使用exit doelseend ifloopEnd Sub从零开始,步入 Word 宏编程的世界(第四讲)实例四:窗体与基本的控件知识点:1、窗体与控件的使用;2、什么是“设计时”、什么是“运行时”;3、了解
22、什么是对像、属性、方法和事件。扎实的基础知识是我们顺利掌握 VBA 编程语言的先决条件。说到基础知识,我想告诉朋友们 我们必须建立起“面向对像”的编程思想。“面向对像”进行编程的思想实在是太重要了!我们所接触的所有事物都是对像,都有属性,也都有属性值。如果您不相信?那么请看您怎样来描述自己家里的电视机呢?它的身高?体重?住址?年龄?颜色?频道个数?声道个数?音量大小?屏幕大小?分辨率?刷新率?对,这些都是电视机的“属性”,在这里,“电视机”就是一个“对像”。以下,假设我们生活在“VBA 编程语言”当中,生活中的事物就是 VBA 的对像那么,我们怎样来找出一个“对像”的属性,或是怎能样来对“对像
23、”的属性进行赋值呢?看下面的程序:=程序名“您想看几频道”=Sub 您想看几频道 ()Dim XX = InputBox(“请输入您想看的频道的值:”)电视机 频道 = XEnd Sub运行这代码,输入您想看的频道的值,比如“10”或是“36”,那么,您就会看到 10 频道或是 36 频道的节目。这里,“电视机”是对像,“频道”是它的属性,“10 或 36”是它的属性值。在“对像”引用自己的某个“属性”时,我们在它们之间用一个小圆点(英文的句号)来表示,具体的格式如代码“电视机频道 = X”中所示;设置值的时候,用等号来赋予它。说到赋值,您是不是想执行“电视机屏幕尺寸 = 100 吋”命令呢?
24、呵呵,有些事物的属性值是“只读”的,不能修改,比如电视机的重量等。现在,我正在看一个节目,但我不知道这个节目所在的是几频道,怎么办呢?请看程序=程序名“当前频道是多少”=Sub 频道是多少()Dim 频道的值频道的值 = 电视机 当前频道MsgBox ( “频道的值” )End Sub程序不难懂吧?前一个程序“您想看几频道”中,我们是将“值”赋予对像的属性,后一个“频道是多少”程序中,我们是取得对像属性的“值”。这两种类型的程序在使用时刚好相反,但,它们在 VBA 编程语言中的运用几乎可以说是无处不在!请一定要认真体会这两个程序中关于“对像”、“属性”与“值”之间的关系!那么,什么又是事件和方法呢?对于电视机来说,当它的电源接通时就发生了“电源接通事件”,反之,它的电源断掉时就发生了“电源断掉事件”。方法,则是指人对电视机进行的操作,比如,现在显示的是10 频道,我在电视机的频道调节按钮上,向前按了 5 次,则进入了 15 频道。电视机支持使用“频道按钮”