1、学习微软 Excel 2002 VBA 编程 橄榄树整理第 二 章 VBA 第 一 步作者:Julitta Korol 翻译:Tiger Chen Nov 28 2004语言学习是一个长期的活动,在此过程中,你会经历不同的阶段,由生疏到熟悉。学习VBA编程也是一样的,没有捷径。要想精通VBA,你必须从一个初级阶段起步(第二至四章)。只有当你对VBA 后面的一些基本的东西有了很好的理解之后,才能提高到中级阶段(第五至七章)和高级阶段(第八至十七章)。但是,重要的事情先来。在你能够用VBA自由自在地控制Excel之前,你需要获得一些你的术语和语法。在VB里,如何表达这些?“在工作簿里添加一个新工作
2、表”,“删除单元格A5的内容”,“将单元格A1 的公式复制到单元格B1”?你也许知道这些单个的词语,然而,你怎么知道如何将它们正确地组合在一起,Excel才能执行这些任务?你将在本章中学习VBA的术语和规则。1了 解 指 令 , 模 块 和 过 程 2010-7-24在第一章,你学习到了Excel宏录制器创建的一系列指令是和你实际进行的操作完全等同的。这些指令自动地放在工作簿里一个叫做“模块”的表里。Excel将模块储存在模块文件夹里,这个文件夹在当前工作簿,新工作簿或者个人宏工作簿里面。你必须激活VB编辑器窗口,并且双击工程浏览器里的模块文件夹才能查看到这些模块。当模块表在代码窗口里打开了后
3、,你才能最后分析你的过程代码。所有录制的指令都包括在“过程”里面。过程里面的每一行都是一个“指令”。指令的类型有很多中,例如,关键词,运算符,或者其它过程的调用。“关键词”代表VB中的一个特殊的意义。在第一章中,你学习了最常见的VBA 关键词 Sub 和End Sub,它们表示一个过程的开始和结束。关键词默认地显示为蓝色。你不要将这些术语做其它的目的,因为关键词已经被VB保护了。除了关键词,VB 指令里还可以有运算符。运算符有四种类型:算术运算,字符串连接,逻辑运算和比较运算。“运算符”允许你将某些值结合起来。例如,减号运算符(/)可以用来计算总数的百分比。本书中,你有很多机会看到如何在VBA
4、过程中使用运算符。学习微软 Excel 2002 VBA 编程 橄榄树整理VB指令的另外一种类型是过程调用。过程调用让你快速地跳到其它过程并且执行其它指令。是不是很难想象?让我们看一下你在第一章中录制的宏WhatsInACell。 假设你也需要包含同一模块中宏FormulasOnOff中的一些语句。怎么做呢?你可以复制需要的代码行,再粘贴过去。然而,有一种更简单快速的方法。你可以调用这个过程,而不需要在两个过程中复制。例如,你想VB在遇到指令MsgBox “所有操作都已完成 “之前执行宏FormulasOnOff里面的指令,只要添加下面一句代码就行:FormulasOnOff当VB到达这一行,
5、它就会立即跳到FormulasOnOff过程并且执行它的代码。之后,它会回到宏WhatsInACell去执行剩下的代码,遇到关键词 End Sub时则停止。在你尝试这个例子之前,你必须学会如何给VBA过程和模块命名,已经如何调用不同工程里的过程。2 VBA工 程 命 名工程是一套Excel对象,模块,窗体和引用。除了VBAProject这个位于工程浏览器中工作簿名称之前默认名称,每个工程需要一个独特的名称。我们来给VBAProject (Chap01.xls) 和 VBAProject (Personal.xls)命名:1. 启动Excel,打开Chap01.xls,这里储存了宏WhatsIn
6、ACell代码。你录制了宏FormulasOnOff的个人宏工作簿会自动开启2. 切换到VB 编辑器窗口3. 选择VBAProject (Chap01.xls)4. 双击属性窗口里的名称属性,这个操作选中了默认的工程名称VBAProject5. 输入“FirstSteps”作为该VBA工程的名称,回车。注意,工程浏览器现在显示的是名称是FirstSteps (Chap01.xls)6. 在工程浏览窗口选择VBAProject (Personal.xls)7. 双击属性里的名称属性学习微软 Excel 2002 VBA 编程 橄榄树整理8. 输入“Personal”作为它的名称,回车技巧2 1
7、避免名称冲突为了避免VBA工程之间的命名冲突,请给你的工程独特的名称。你可以使用下述方法之一来更改工程名称: 在工程浏览器窗口,选择工程名称,双击属性窗口里的名称属性,再输入新的名称 在工程浏览器窗口,在工程名称上单击右键,并且选择“工程名称属性”。出现如图21 显示的工程属性对话框,在工程名称文本框里面输入新的名称图21 工程属性窗口可以用来更改当前被选中的工程名称和描述3模 块 重 命 名当你录制宏或者创建新的过程时,VB会创建一个模块文件夹来储存你的 VBA 代码。 第一个文件夹叫 “模块1”,第二个叫“模块2”,等等。你打开一个新的工作簿并且创建VBA 工程时,新VBA工程里的模块文件
8、夹又会命名为“模块1”,“模块2”,等等。模块拥有相同的名称不但对你,而且对VB造成很大混淆,因为,它要在一个打开许多工程的环境中执行你的宏或工程。学习微软 Excel 2002 VBA 编程 橄榄树整理为了避免模块混淆,给FirstSteps (Chap01.xls) 工程和 Personal (Personal.xls) 工程里的“模块 1”重新命名:1. 在工程浏览器窗口,选择FirstSteps (Chap01.xls)工程,并且选择“模块1”2. 双击属性窗口里的名称属性,这个动作选中了模块的默认名称“模块1”3. 输入“WorksheetFormatting”作为模块1 的名称,并
9、且回车。注意,工程浏览器窗口现在显示的模块名称是“WorksheetFormatting”4. 在工程浏览器窗口选择Personal (Personal.xls)5. 双击属性窗口里的名称属性6. 输入“Switches”作为模块1的名称,回车图22 工程浏览器窗口显示通过属性窗口给工程和模块设置的独特名称4从 其 它 工 程 调 用 过 程学习微软 Excel 2002 VBA 编程 橄榄树整理你只要明确过程名称,就可以调用这个在同一个工程里任何模块里的过程。假设过程FormulasOnOff和宏WhatsInACell在同一个工程里的不同模块(或者同一个模块),在WhatsInACell
10、宏里面调用过程FormulasOnOff,你所要做的所有工作只是明确过程名称,示例如下:Sub WhatsInACell() FormulasOnOff End Sub 然而,如果两个或者两个以上的模块含有这个相同的过程名称,你除了要明确过程名称外,还必须包括模块名称。假设工程FirstSteps (Chap01.xls)有三个模块。模块FormulaFormatting包含宏WhatsInACell,但是,模块Switches和模块Formulas都含有一个叫FormulasOnOff的宏。如何在WhatsInACell调用FormulasOnOff(模块Switches里面的)?请看下面例
11、子:Sub WhatsInACell() Switches.FormulasOnOff End Sub 要调用其它工程里的过程,你必须建立对该工程的引用。你可以在“引用”对话框进行这些操作。因为FormulasOnOff在Personal (Personal.xls)工程里,在你能够从WhatsInACell调用它之前,你需要添加对“Personal”的引用。下面是几种建立引用的方法:1. 在工程浏览器窗口,点击FirstSteps (Chap01.xls)2. 选择“工具”“引用”3. 在引用对话框,选中“Personal”旁边的勾选框(参见图2 3),然后点击确定(译者:在截图前,我并没有
12、保存Personal,所以在附图里没有Personal一行,如果你依照书中一步一步走下来,应该没有问题)学习微软 Excel 2002 VBA 编程 橄榄树整理图23 引用对话框列出了所有这个工程可以引用的工程。如果你想要执行其它工程里的过程,你就必须建立对这个工程的引用既然对“Personal”工程的引用已经建立了,我们就来从WhatsInACell里调用FormulasOnOff吧。1. 在工程浏览器窗口,选择FirstSteps (Chap01.xls)并且定位到含有WhatsInACell的模块2. 在MsgBox “所有操作都已完成 “之前增加一空白行,并且输入代码:Formulas
13、OnOff3. 返回到Excel界面,确保当前工作表是这个例子数据(参见第一章的图11 )4. 使用任何你在第一章里学到的方法来运行宏WhatsInACell如果你给两个不同工程里的不同过程以相同的名称,那么你必须明确工程名称才能调用它。我们假设FirstSteps (Chap01.xls)工程和Personal (Personal.xls) 工程里都有叫FormulasOnOff的宏,要调用Personal (Personal.xls)工程里的FormulasOnOff(记住,你已经必须先建立对Personal 的引用),必须包括工程名称:Sub WhatsInACell ( ) 学习微软
14、Excel 2002 VBA 编程 橄榄树整理Personal.Switches.FormulasOnOff End Sub 技巧2 2 VB如何定位被调用的过程当你调用一个过程,VB 先在主调方( WhatsInACell)的同一个模块里查找。如果没有找到被调过程(FormulasOnOff),VB就会在同一个工程的其它模块里查找。如果还是找不到,VB 则会检查对其它工程的引用。技巧2 3 工程名称不在引用对话框如果你想要调用一个当前关闭的工程里的过程,当你打开引用对话框试图建立引用时,这个过程名称不在清单中。点击“浏览”,并且打开被调用过程所在的文件夹。添加引用的对话框默认地列出数据库文件
15、(*.olb, .tlb, .dll)。从文件类型的下拉清单中选择Excel文件(*.xls, *.xla),选择并打开含有你要调用过程的文件。这个工程的名称将会加在引用对话框的最后一行。5了 解 对 象 , 属 性 和 方 法使用VBA ,你可以创建工程控制Excel的许多东西,你同样也可以控制很多其它的应用程序。VB 的伟大来自于它的控制和管理各种各样的对象的能力。但是,“对象”是什么呢?“对象”是你通过VBA控制的东西。工作簿,工作表,工作表里的单元格区域,图表或者工具条,这些只是一些用Excel时想要控制的东西的举例。这些东西就是对象。Excel含有超出一百种你可以通过不同方式操作的对
16、象。所有的VB对象都被分层规类。一些对象本身又可能含有其它的对象,例如,Excel时一个应用对象,这个应用对象包含其它对象,例如工作簿或者命令条。工作簿对象可能包含其它对象,如工作表或者图表。你将在本章种学习如何控制以下Excel对象:区域,窗口,工作表,工作簿和应用。我将“区域”列在了第一位置,有一个非常重要的原因,如果你不知道如何操作单元格区域的话,你基本上不能用电子表格来做什么。学习微软 Excel 2002 VBA 编程 橄榄树整理某些对象看上去相似。如果你打开一个新工作簿,检查它的工作表,你不会发现什么不同。一组相似的对象被称为“集合”。例如,工作表的集合包含所有具体工作簿中的工作表
17、;命令条的集合包含所有的工具条和菜单。集合同样是对象。Excel中使用得最频繁的集合是表(Sheets)集合,它代表所有的工作表和图表,还有工作簿集合,工作表集合以及窗口集合。当你使用集合时,相同的动作可以在这个集合中所有的对象上执行。每一种对象都有一些特征供你描述。在VB里,这些对象的特征被称为 “属性”。例如,工作簿对象有名称属性;区域对象有列,字体,公式,名称,行,样式和值等属性。这些对象属性是可以设置的。你通过设置对象的属性控制对象的外观和位置。对象属性一次只能设置为一个特定的值。例如,当前工作簿不可能同时有两个不同的名称。VB 中最难理解的部分是有些属性同时又可以是对象。想想区域(R
18、ange)对象,你可以通过设置字体颜色来改变选定单元格的外观。但是,字体(Font)可以有不同的名称(Times New Roman, Arial, ),不同的字号( 10,12,14 , )和不同的样式(粗体,斜体,下划线, )。这些是字体的属性。如果字体有属性,那么字体也是对象。属性真是了不起,让你改变对象的外观,但是,如何控制这些操作呢?你在使Excel为你执行任务之前,你需要知道另外一个术语。对象有方法。每一种你想要对象做的操作都被称为“方法”。最重要的VB方法是Add方法。你可以使用这个方法添加一个新工作簿或者工作表。对象可以使用不同的方法。例如,区域(Range)对象有专门的方法让
19、你清除单元格内容(ClearContents 方法), 清除格式(ClearFormats方法)以及同时清除内容和格式(Clear方法)。还有让你选择,复制或移动对象的方法。方法有可选择的参数确定方法执行的具体方式。例如,工作簿(Workbook)对象有一个叫关闭(Close )的方法。你可以使用它关闭任何打开了的工作簿。如果工作簿有改动,Excel会弹出一个信息,问你是否要保存变化。你可以使用关闭方法和设定它的保存变化(SaveChanges )参数为假(False)来关闭这个工作簿并且不管它的任何变化。正如例子:Workbooks(“Chap01.XLS“).Close SaveChang
20、es:=False6学 习 对 象 , 属 性 和 方 法学习微软 Excel 2002 VBA 编程 橄榄树整理当你学习新的事物时,理论会给你必须的背景,但是,你如何真正知道那是什么呢?大多数人习惯形象思维,为了使Excel对象易于理解,VB 在线帮助提供了一个对象模型,请看接下来的附图。注意,Application 对象位于树型图的最上端,它实际上代表Excel本身。其它对象在较低的层次。假设你想要控制Range对象,在你能够控制任何 Excel对象之前,你必须对它创建引用。为了获得下图中的Range对象,只要遵照下面几行代码。每次看到树型图中的线指向不同的层时,你只要巧妙地将线换成一个逗
21、点运算符(停顿,英文状态下的句号)。这样,最终你会以下面的方式到达Range对象:Application.Workbook.Worksheet.Range你可以使用Excel对象树型图来寻找到其它对象的路径,例如窗口(Window),批注(Comment ),自动筛选(AutoFilter )或者绘图区(ChartArea)。分析对象模型是一个学习Excel对象的非常好的方法。你花在这里的时间,以后你开始编写VBA过程的时候,会给你加倍的回报。通常,你需要明确你引用的对象的名称。现在,我们来点更具体的。假设你要清除单元格A4里的内容。手动做这个时,只要选择单元格A4 然后按下键盘上的Delet
22、e 键就可以了。用 VB做同样的操作,你首先需要知道如何使Excel选中了正确的单元格。单元格A4和其它的工作表单元格一样,是Range 对象。VB没有Delete 方法来清除单元格内容,取而代之的是ClearContents方法,例如:Range(“A4“).ClearContents注意在对象名称和方法之间的逗点运算符。这个指令去除单元格A4里的内容。然而,如何使Excel清除工作簿Chap02.xls第一个工作表里单元格A4的内容呢?我们仍然假设打开了好几个工作簿。学习微软 Excel 2002 VBA 编程 橄榄树整理图24 Excel对象树型图(第一页)(译者:原书图2 5(工作簿对
23、象树型图)已包含在内,故在此略过)如果你不希望最后在错误的工作簿或工作表里删除了A4里的内容,那么你必须写下详细的指令,这样VB就知道在哪里找这个单元格:Application.Workbooks(“Chap02.xls“).Worksheets(“Sheet1“) .Range(“A4“).ClearContents上面的指令应该写成一行,并且应该从右到左阅读:清除单元格A4里的内容,这个单元格在一个叫“Sheet1”的工作表里,而这个工作表又在一个叫“Chap02.xls”的工作簿里面,工作簿“Chap02.xls”又学习微软 Excel 2002 VBA 编程 橄榄树整理应该是Excel
24、应用程序的一部分。注意,集合名称的后面带有一个字母“s”:Workbooks和Worksheets。所有引用的工作簿,工作表或单元格名称都必须用引号(译者:英文状态的引号)包括起来。如何找到Excel对象树型图?选择Excel 界面上的“帮助” “Excel帮助”“编程信息”“微软Excel VB参考”“Excel对象模型”。(译者:2002 版有全局的对象模型,2003版好像没有这个。)除了Excel 对象,你还可以使用Office ,Forms 和DAO,ADO 对象模型。属于这些数据库(library)中的对象都可以用在Excel中,也可以用在Office 家族中的其它应用软件中。在十五
25、章,你可以看到使用DAO 和ADO对象,从Excel进入Access数据库的例子。学习微软 Excel 2002 VBA 编程 橄榄树整理图26 Excel对象(Worksheet) 技巧2 4 VBA 和 Excel 的早期版本Excel在线帮助列出了Excel对象模型从早期版本以来的变化。许多对象,属性和方法都已经被更新的,改进的特色所代替了。为了提供兼容性,被取代的对象已经被隐藏起来了(译者:它们仍然是可用的)。打开VB编辑器窗口上的在线帮助,隐藏的对象同样可以在对象浏览器里找到。如果你在对象浏览器窗口上单击右键,你可以选择显示隐藏成员的选项。你将在以后的章节中学习如何使用对象浏览器。学
26、习微软 Excel 2002 VBA 编程 橄榄树整理7句 法 和 文 法既然现在你已经知道了VBA的一些基本组成要素(对象,属性和方法),是时间开始使用它们了。但是,你怎么将对象,属性和方法连接成正确的语言结构呢?每种语言都有语法规则,人们必须遵循语法以确保他们被理解了。无论你说的是英语,西班牙语,法语还是其它语言,你在读,写的时候都必须遵从一定的规则。在编程中,我们使用“句法”(syntax)这个术语来更确切地明确它的语言规则。你可以在在线帮助或者在对象浏览器窗口查找每个对象,属性或方法的句法。下面列出一些你必须的VB常用规则: 规则1:引用对象的属性如果这个属性没有自变量,使用下面的句法
27、:Object.Property对象是一个占位符,是你放置你想要进入的实际对象名称的地方。属性同样也是一个占位符,你可以在这里放置该对象的特点。例如:指向工作表中单元格A4中输入的值,见下述指令:Range(“A4“).Value注意对象名称和属性之间的句号。当你需要进入一个存在于多个其它对象里的对象的属性时,你必须按顺序地写上所有对象的名称,并且用 句号运算符分开。例如:ActiveSheet.Shapes(2).Line.Weight这个例子指向当前工作表里图形(Shapes)集合里的第二个对象里的直线(Line)对象的粗细(Weight)属性。有些属性要求一个或多个自变量。例如,使用偏移
28、(Offset)属性,你可以选择一个和当前单元格相对位置的单元格。Offset属性需要两个自变量,第一个自变量为行号(rowOffset )第二个是列号(columnOffset)。对象 属性 自变量ActiveCell.Offset(3, 2)学习微软 Excel 2002 VBA 编程 橄榄树整理在上面的例子中,假设当前单元格是A1,Offset(3, 2)将会指向往下3 行和往右两列的单元格,也就是单元格C4。因为,在括号内的自变量总是很难理解,通常操作是将它们的名称也列上,见下例:ActiveCell.Offset(rowOffset:=3, columnOffset:=2)注意,自变
29、量名称后面总是跟着一个冒号和一个等于号(:=)。如果你使用带名称的自变量,你可以任意顺序地列出它们,上面的指令也可以写成这样:ActiveCell.Offset(columnOffset:=2, rowOffset:=3)改后的指令没有改变意思,你仍然指向单元格C4。然而,如果你改变ActiveCell.Offset(3, 2)中自变量的次序,结果你会指向D3,而不是 C4。 规则2:改变对象的属性Object.Property = ValueValue是一个新的你要赋给该对象属性的值。这个值可以是: 一个数字Range(“A4“).Value = 25上面的指令在当前工作表的单元格A4里输入
30、数字25 在引号里的文本ActiveCell.Font.Name = “Times New Roman“上面的指令将当前单元格字体改为Times New Roman 逻辑值(True或False)ActiveCell.Font.Bold = True上面的指令设置当前单元格的字体为粗体。学习微软 Excel 2002 VBA 编程 橄榄树整理 规则3:返回对象属性的当前值Variable = Object.PropertyVariable(变量)是VB 将要储存属性设置的地方的名称,你将在第三章里学习关于变量的知识。变量 对象 属性CellValue = Range(“A4”).Value上面
31、的指令将当前A4 单元格里的值保存到变量 CellValue。 规则4:指向对象的方法如果该方法没有自变量,那么句法应该是:Object.Method对象是一个占位符,是你放置你想要进入的实际对象名称的地方。方法同样也是一个占位符,你可以在这里放置要对该对象的进行的操作的名称。例如,可以使用下述指令来清除单元格A4的格式(译者:应该是内容):对象 方法Range(“A4“).ClearContents如果该方法可以使用自变量来限制,那么句法为:Object.Method (argument1, argument2, argumentN)例如,使用GoTo 方法,你可以快速地选择工作表里的任何区
32、域。GoTo方法的句法为:Object.GoTo(Reference, Scroll) 对象.GoTo(参照, 窗口滚动)Reference自变量是目标单元格或者区域, Scroll自变量可以设定为真(True)让Excel窗口滚动到该目标地址出现在窗口的左上角;或者设定为假(False),窗口不滚动(译者:系统默认为False)。例如,下面的VBA语句选择工作表Sheet1里的单元格P100,并且窗口滚动:Application.GoTo _ 学习微软 Excel 2002 VBA 编程 橄榄树整理Reference:=Worksheets(“Sheet1“).Range(“P100“),
33、_ Scroll:=True上面的指令没有固定在一行,使用了一条特殊的线(下划线)将它分为几段。下面的部分将讲述这个。8打 断 很 长 的 VBA语 句尽管一行VBA代码最多可以包含1024个字母,但是,为了使你个过程容易阅读,最好将长的语句打断为两行甚至多行。VB 使用一个专门的连续线(下划线)置于一行代码的末尾,表明下一行是这行的连续。例如:Selection.PasteSpecial _ Paste:=xlValues, _ Operation:=xlMultiply, _ SkipBlanks: =False, _ Transpose:=False这个连续符是下划线,你必须在下划线之后
34、带一个空格。你可以在下述几种情况中使用连续符: 运算符之前或者之后。例如:&,+ ,Like,NOT,AND 逗号之前或者之后 冒号和等号(:=)之前或者之后 等号之前或者之后你不可以在冒号和等于号之间使用连续符,例如,下面的代码VB是不认的:Selection.PasteSpecial Paste: _ =xlValues, Operation: _ 学习微软 Excel 2002 VBA 编程 橄榄树整理=xlMultiply, SkipBlanks: _ =False, Transpose: _ =False Selection.PasteSpecial Paste: _ =xlValu
35、es, Operation: _ =xlMultiply, SkipBlanks: _ =False, Transpose: _ =False同样,在引号之内的文本之间加连续符也是不对的,例如,下面的下划线的使用是无效的:MsgBox “To continue the long instruction, use the _ line continuation character.“上面的指令应该打断为如下代码:MsgBox “To continue the long instruction, use the “ & _ “line continuation character.“9了 解 VB
36、A错 误在编写或编辑VBA过程之中,无论你多名小心,出错的可能性还是很打的。例如,你可以错误拼写一语句,放错了一个逗号或引号,或者忘记了一个句号或右括号。这些类型的错误称为句法错误。幸运的是,VB比较容易帮助你发现这种类型的错误。为了让VB在你输入一行代码后,自动帮你检测语法的正确性,你需要在VB窗口的“工具 ”“选项 ”里,确保勾选了“编辑器 ”页上的“自动语法检测”。学习微软 Excel 2002 VBA 编程 橄榄树整理图27 选项对话框的编辑器上的“自动语法检测”帮你检查VBA 过程里的打字错误当VB发现语法错误时,弹出一个错误信息框,并且将有误的代码行颜色变为红色(参见图2 8)或者
37、其它在选项对话框“编辑器格式”页设定的颜色。如果错误信息框上的解释不够清楚,你总是可以点击“帮助”按钮寻求更多的帮助。再如果VB在线帮助无法给你提供正确的方向,那么返回你的程序,仔细检查有误的那行代码是否漏掉了字母,引号,句号,冒号,等于号,左括号和右括号等。图28 这个错误由于漏掉了常数xlCellType 前面的括号而产生学习微软 Excel 2002 VBA 编程 橄榄树整理图29 当VB试图在工作表或单元格区域里选择一个并不存在的单元格时,就会产生一个运行时间错误查找语法错误可能是烦人的并且费时的事情。有些语法错误只有在过程运行的时候才能被发现。在试图运行你的过程的时候,VB 可能找到
38、那种因为使用了无效的自变量,或者是漏掉了那些需要成对使用的指令如If语句和循环结构,而造成的错误。技巧2 5:程序调试你很可能不只一次听过“计算机程序里充满了错误”。在编程里,错误就被称为“bug”(错误,漏洞),而“调试”(debug)则是给你的程序除错的过程。调试的第一步就是改正所有的语法错误。VB 提供了无数种工具,你可以使用它们来追踪和消除错误。在本章中,你将知道如何使用VB助手帮助你在编写程序时出现尽可能少的错误;在第十三章中,你将学习如何使用专门的调试工具来捕获你VBA程序里的错误。除了语法错误外,还有其它两种错误:运行时间和逻辑。运行时间错误发生在过程运行的时候。图29显示了一种
39、典型的运行时间错误。运行时间错误经常发生在那些程序员在编写代码的时候没有想到的情况。例如,当程序试图访问一个用户电脑上并不存在的驱动器或者文件,或者没有首先检查是否用户插入软盘并关闭软驱口而试图复制一个文件到软盘,这时就会发生运行时间错误。学习微软 Excel 2002 VBA 编程 橄榄树整理第三种错误逻辑错误,通常不会发出明确的错误信息。过程可能没有语法错误,甚至运行无误,然而,得到的却是错误的结果。逻辑错误通常非常难以查找,并且它藏得很隐秘,间歇发生,你不能指望花几个小时,甚至几天,就能找到错误源。10查 找 帮 助当你使用宏录制器时,你所有的操作都被翻译成VBA指令,并且放置在一个模块
40、里。你在研究这些录制的过程时,不要忘记帮助随时可用。你会发现有些代码的意思可能会非常易懂,然而,有效却不怎么明白。这时候,你就需要寻求帮助了。当你独自工作时,只要轻轻一点或者轻轻一按就可以请教你的VBA老师了。使用VB在线帮助比使用词典或参考手册要快捷和容易得多。如果你讨厌一页一页地在词典里找你需要的术语,你将惊讶于你如何快地从VB代码窗口找到需要的帮助页面。让我们来检查你如何通过内置的VBA老师的帮助,将WhatsInACell 过程里的第一句变成你自己的VBA词汇:Selection.SpecialCells(xlCellTypeConstants, 2).Select上面的指令可以打断为
41、三部分,哪些部分?Selection是对象还是属性?SpecialCells是什么?Select 是什么?要回答这些问题,请依照下面的操作:1. 激活你要分析的过程的代码窗口2. 点击你不懂的词语3. 按下F1学习微软 Excel 2002 VBA 编程 橄榄树整理图210 VBA的对象,属性和方法在在线帮助里解释得很详细帮助就会显示相应的页面。如果你的光标放在词语“Selection”中间,你就会知道Selection 可以是一个应用程序的属性,也可以是一个窗口对象。如果你的光标在下一个不明白的术语(SpecialCells)并且按上面的步骤再做一遍后,你将看到SpecialCells帮助屏
42、幕(参见图210)。注意,每个帮助主题包含许多信息。被查找的指令类型显示在帮助窗口的上面;指令的类型允许词语分类。例如,SpecialCells是方法,可以使用这个方法的对象名称列在“应用于”下面(译者:点击“应用于”,出现对象名称列表)。指令名称下面的“参阅”和“示例”让你快速地跳到其它应用或意义相似的指令,以及查看使用这个指令的例子。指令的意义显示在“参阅”和“示例”标题的下面。接下来则是语法和需要的自变量和其它参数。“说明”部分给出一些推荐使用该指令的情形。你可以很容易地将示例中的代码复制到你的过程中去:选中你要复制的代码行,按下Ctrl+C,或者单击右键,选择快捷菜单上的“复制”,然后
43、切换到VB代码窗口,点击你需要粘贴代码的地方,再按下 Ctrl+V或者选择“编辑”“粘贴”。11语 法 和 编 程 快 捷 助 手学习微软 Excel 2002 VBA 编程 橄榄树整理VB编辑器窗口上的 “编辑 ”工具条上有很多按钮,帮助你快速容易地输入正确格式的 VBA指令。如果 “编辑”工具条目前在VB 编辑器窗口上不可连接,那么你可以选择“视图”“工具条”图211 编辑工具条上的按钮使得编写程序和设置指令格式变得很容易 在VB中编写过程需要你使用成百上千的内置指令和函数。因为大多数人们无法学习所有VBA里可用指令的语法,IntelliSense提供了你所需求的语法和编程帮助。当你在代码
44、窗口编程时,经常会有专门的窗口弹出来,引导你完成正确的VBA代码。12属 性 /方 法 列 表每个对象都会有许多属性和方法。当你输入一个对象名称和一个句号以分开这个对象名称和它的属性或方法时,弹出一个列表菜单。这个菜单列出了在这个句号之前的对象的所有可用的属性和方法(参见图212 )。如何打开这个自动工具?选择“工具”“选项”,单击选项对话框上的“编辑器”页,确保勾选上“自动列出成员”。学习微软 Excel 2002 VBA 编程 橄榄树整理图212 在输入VBA指令时,VB 会建议可以用于该对象的属性和方法如何从弹出菜单(图212 )上选择项目?试图输入你需要的属性或方法名称的前几个字母,当
45、Excel突出显示了正确的项目名称,则回车,插入该项目到你的代码中去,并且开始新的一行;或者,你需要在同一行继续写代码,那么就按Tab键代替回车。你也可以双击该项目来插入到代码中去。只要按Esc键就可以关闭这个弹出菜单,而不插入任何项目。当你按Esc键取消了弹出菜单后, VB将不会对同样的对象显示该菜单。你可以通过以下方法来再次显示属性/方法弹出菜单: 按Ctrl+J 使用“backspace”(后退)键删除句号,然后重新输入句号 在代码窗口上单击右键(该对象,句号后),并且在快捷菜单上选择“属性/方法列表” 选择“编辑”“属性/方法列表” 点击“编辑器”工具条上的“属性/方法列表”按钮13常
46、 数 列 表本章的前面,你学习了给属性赋值,需要使用下面规则:Object.Property = Value学习微软 Excel 2002 VBA 编程 橄榄树整理如果选项对话框(编辑器页)已经勾选了“自动列出成员”,Excel就会在等号前的属性弹出一个菜单,列出该对属性有效的常数。常数是表明确切的描述或者结果的值。Excel和Office里面的其它应用软件都有很多预先定义的内置常数。你将在第三章中学习常数,常数类型和使用。假设你需要你的程序打开Excel工作表上的分页预览。“编辑”(译者:视图)菜单上有两个选择:普通视图和分页预览。普通视图是绝大多数Excel任务的默认视图模式;分页预览则是
47、编辑视图,显示工作表中有内容的区域。这两种选项都有相应的内置常数来表示。Excel常数起名总是以“xl”开头。你一旦在代码窗口里输入指令:ActiveWindow.View =就会弹出一个菜单,列出这个属性的有效常数名称。使用在上节中“属性/方法列表”弹出菜单同样的技术,也可以处理“常数列表”弹出菜单。按下Ctrl+Shift+J或者点击“编辑器”工具条上的“常数列表 ”按钮,可以激活常数列表菜单。图213 常数列表弹出菜单显示了对敲入的属性有效的常数清单14参 数 信 息如果你有过使用Excel函数的经历,你就会知道许多函数需要一个或者多个自变量(或者参数)。如果VB函数要求自变量,你可以在
48、输入左括号后在光标下面看到一个提示框,显示必要的或可选的自变量的名称(参见图2 14)。参数信息帮你很容易地给VBA 函数设置参数。另外,它提醒你其它两件对函数运行正确至关重要的事情:自变量的顺序和自变量要求的数据类型。你将在下一章里学习数据类型。在代码窗口里面输入下述代码,看看参数信息是如何工作的:ActiveWorkbook.SaveAs(学习微软 Excel 2002 VBA 编程 橄榄树整理图214 A tip window displays a list of arguments utilized by a VBA function or instruction.你一旦输入了开始的括号,光标的下面就会出现一个提示框,当前的自变量会显示为粗体;当你输入完第一个自变量并且输入了逗号,VB会将下一个自变量为粗体。