ExcelVBA 编程02第二章 VBA 第一步.docx
- 文档编号:5911837
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:43
- 大小:331.40KB
ExcelVBA 编程02第二章 VBA 第一步.docx
《ExcelVBA 编程02第二章 VBA 第一步.docx》由会员分享,可在线阅读,更多相关《ExcelVBA 编程02第二章 VBA 第一步.docx(43页珍藏版)》请在冰豆网上搜索。
ExcelVBA编程02第二章VBA第一步
第二章VBA第一步
语言学习是一个长期的活动,在此过程中,你会经历不同的阶段,由生疏到熟悉。
学习VBA编程也是一样的,没有捷径。
要想精通VBA,你必须从一个初级阶段起步(第二至四章)。
只有当你对VBA后面的一些基本的东西有了很好的理解之后,才能提高到中级阶段(第五至七章)和高级阶段(第八至十七章)。
但是,重要的事情先来。
在你能够用VBA自由自在地控制Excel之前,你需要获得一些你的术语和语法。
在VB里,如何表达这些?
“在工作簿里添加一个新工作表”,“删除单元格A5的内容”,“将单元格A1的公式复制到单元格B1”?
你也许知道这些单个的词语,然而,你怎么知道如何将它们正确地组合在一起,Excel才能执行这些任务?
你将在本章中学习VBA的术语和规则。
了解指令,模块和过程
在第一章,你学习到了Excel宏录制器创建的一系列指令是和你实际进行的操作完全等同的。
这些指令自动地放在工作簿里一个叫做“模块”的表里。
Excel将模块储存在模块文件夹里,这个文件夹在当前工作簿,新工作簿或者个人宏工作簿里面。
你必须激活VB编辑器窗口,并且双击工程浏览器里的模块文件夹才能查看到这些模块。
当模块表在代码窗口里打开了后,你才能最后分析你的过程代码。
所有录制的指令都包括在“过程”里面。
过程里面的每一行都是一个“指令”。
指令的类型有很多中,例如,关键词,运算符,或者其它过程的调用。
“关键词”代表VB中的一个特殊的意义。
在第一章中,你学习了最常见的VBA关键词——Sub和EndSub,它们表示一个过程的开始和结束。
关键词默认地显示为蓝色。
你不要将这些术语做其它的目的,因为关键词已经被VB保护了。
除了关键词,VB指令里还可以有运算符。
运算符有四种类型:
算术运算,字符串连接,逻辑运算和比较运算。
“运算符”允许你将某些值结合起来。
例如,减号运算符(/)可以用来计算总数的百分比。
本书中,你有很多机会看到如何在VBA过程中使用运算符。
VB指令的另外一种类型是过程调用。
过程调用让你快速地跳到其它过程并且执行其它指令。
是不是很难想象?
让我们看一下你在第一章中录制的宏WhatsInACell。
假设你也需要包含同一模块中宏FormulasOnOff中的一些语句。
怎么做呢?
你可以复制需要的代码行,再粘贴过去。
然而,有一种更简单快速的方法。
你可以调用这个过程,而不需要在两个过程中复制。
例如,你想VB在遇到指令MsgBox"所有操作都已完成"之前执行宏FormulasOnOff里面的指令,只要添加下面一句代码就行:
FormulasOnOff
当VB到达这一行,它就会立即跳到FormulasOnOff过程并且执行它的代码。
之后,它会回到宏WhatsInACell去执行剩下的代码,遇到关键词EndSub时则停止。
在你尝试这个例子之前,你必须学会如何给VBA过程和模块命名,已经如何调用不同工程里的过程。
VBA工程命名
工程是一套Excel对象,模块,窗体和引用。
除了VBAProject这个位于工程浏览器中工作簿名称之前默认名称,每个工程需要一个独特的名称。
我们来给VBAProject(Chap01.xls)和VBAProject(Personal.xls)命名:
1.启动Excel,打开Chap01.xls,这里储存了宏WhatsInACell代码。
你录制了宏FormulasOnOff的个人宏工作簿会自动开启
2.切换到VB编辑器窗口
3.选择VBAProject(Chap01.xls)
4.双击属性窗口里的名称属性,这个操作选中了默认的工程名称VBAProject
5.输入“FirstSteps”作为该VBA工程的名称,回车。
注意,工程浏览器现在显示的是名称是FirstSteps(Chap01.xls)
6.在工程浏览窗口选择VBAProject(Personal.xls)
7.双击属性里的名称属性
8.输入“Personal”作为它的名称,回车
技巧2-1避免名称冲突
为了避免VBA工程之间的命名冲突,请给你的工程独特的名称。
你可以使用下述方法之一来更改工程名称:
▪在工程浏览器窗口,选择工程名称,双击属性窗口里的名称属性,再输入新的名称
▪在工程浏览器窗口,在工程名称上单击右键,并且选择“工程名称属性”。
出现如图2-1显示的工程属性对话框,在工程名称文本框里面输入新的名称
图2-1工程属性窗口可以用来更改当前被选中的工程名称和描述
模块重命名
当你录制宏或者创建新的过程时,VB会创建一个模块文件夹来储存你的VBA代码。
第一个文件夹叫“模块1”,第二个叫“模块2”,等等。
你打开一个新的工作簿并且创建VBA工程时,新VBA工程里的模块文件夹又会命名为“模块1”,“模块2”,等等。
模块拥有相同的名称不但对你,而且对VB造成很大混淆,因为,它要在一个打开许多工程的环境中执行你的宏或工程。
为了避免模块混淆,给FirstSteps(Chap01.xls)工程和Personal(Personal.xls)工程里的“模块1”重新命名:
1.在工程浏览器窗口,选择FirstSteps(Chap01.xls)工程,并且选择“模块1”
2.双击属性窗口里的名称属性,这个动作选中了模块的默认名称“模块1”
3.输入“WorksheetFormatting”作为模块1的名称,并且回车。
注意,工程浏览器窗口现在显示的模块名称是“WorksheetFormatting”
4.在工程浏览器窗口选择Personal(Personal.xls)
5.双击属性窗口里的名称属性
6.输入“Switches”作为模块1的名称,回车
图2-2工程浏览器窗口显示通过属性窗口给工程和模块设置的独特名称
从其它工程调用过程
你只要明确过程名称,就可以调用这个在同一个工程里任何模块里的过程。
假设过程FormulasOnOff和宏WhatsInACell在同一个工程里的不同模块(或者同一个模块),在WhatsInACell宏里面调用过程FormulasOnOff,你所要做的所有工作只是明确过程名称,示例如下:
SubWhatsInACell()
<这里是你录制的指令>
FormulasOnOff
EndSub
然而,如果两个或者两个以上的模块含有这个相同的过程名称,你除了要明确过程名称外,还必须包括模块名称。
假设工程FirstSteps(Chap01.xls)有三个模块。
模块FormulaFormatting包含宏WhatsInACell,但是,模块Switches和模块Formulas都含有一个叫FormulasOnOff的宏。
如何在WhatsInACell调用FormulasOnOff(模块Switches里面的)?
请看下面例子:
SubWhatsInACell()
<这里是你录制的指令>
Switches.FormulasOnOff
EndSub
要调用其它工程里的过程,你必须建立对该工程的引用。
你可以在“引用”对话框进行这些操作。
因为FormulasOnOff在Personal(Personal.xls)工程里,在你能够从WhatsInACell调用它之前,你需要添加对“Personal”的引用。
下面是几种建立引用的方法:
1.在工程浏览器窗口,点击FirstSteps(Chap01.xls)
2.选择“工具”-“引用”
3.在引用对话框,选中“Personal”旁边的勾选框(参见图2-3),然后点击确定(译者:
在截图前,我并没有保存Personal,所以在附图里没有Personal一行,如果你依照书中一步一步走下来,应该没有问题)
图2-3引用对话框列出了所有这个工程可以引用的工程。
如果你想要执行其它工程里的过程,你就必须建立对这个工程的引用
既然对“Personal”工程的引用已经建立了,我们就来从WhatsInACell里调用FormulasOnOff吧。
1.在工程浏览器窗口,选择FirstSteps(Chap01.xls)并且定位到含有WhatsInACell的模块
2.在MsgBox"所有操作都已完成"之前增加一空白行,并且输入代码:
FormulasOnOff
3.返回到Excel界面,确保当前工作表是这个例子数据(参见第一章的图1-1)
4.使用任何你在第一章里学到的方法来运行宏WhatsInACell
如果你给两个不同工程里的不同过程以相同的名称,那么你必须明确工程名称才能调用它。
我们假设FirstSteps(Chap01.xls)工程和Personal(Personal.xls)工程里都有叫FormulasOnOff的宏,要调用Personal(Personal.xls)工程里的FormulasOnOff(记住,你已经必须先建立对Personal的引用),必须包括工程名称:
SubWhatsInACell()
<这里是你录制的指令>
Personal.Switches.FormulasOnOff
EndSub
技巧2-2VB如何定位被调用的过程
当你调用一个过程,VB先在主调方(WhatsInACell)的同一个模块里查找。
如果没有找到被调过程(FormulasOnOff),VB就会在同一个工程的其它模块里查找。
如果还是找不到,VB则会检查对其它工程的引用。
技巧2-3工程名称不在引用对话框
如果你想要调用一个当前关闭的工程里的过程,当你打开引用对话框试图建立引用时,这个过程名称不在清单中。
点击“浏览”,并且打开被调用过程所在的文件夹。
添加引用的对话框默认地列出数据库文件(*.olb,.tlb,.dll)。
从文件类型的下拉清单中选择Excel文件(*.xls,*.xla),选择并打开含有你要调用过程的文件。
这个工程的名称将会加在引用对话框的最后一行。
了解对象,属性和方法
使用VBA,你可以创建工程控制Excel的许多东西,你同样也可以控制很多其它的应用程序。
VB的伟大来自于它的控制和管理各种各样的对象的能力。
但是,“对象”是什么呢?
“对象”是你通过VBA控制的东西。
工作簿,工作表,工作表里的单元格区域,图表或者工具条,这些只是一些用Excel时想要控制的东西的举例。
这些东西就是对象。
Excel含有超出一百种你可以通过不同方式操作的对象。
所有的VB对象都被分层规类。
一些对象本身又可能含有其它的对象,例如,Excel时一个应用对象,这个应用对象包含其它对象,例如工作簿或者命令条。
工作簿对象可能包含其它对象,如工作表或者图表。
你将在本章种学习如何控制以下Excel对象:
区域,窗口,工作表,工作簿和应用。
我将“区域”列在了第一位置,有一个非常重要的原因,如果你不知道如何操作单元格区域的话,你基本上不能用电子表格来做什么。
某些对象看上去相似。
如果你打开一个新工作簿,检查它的工作表,你不会发现什么不同。
一组相似的对象被称为“集合”。
例如,工作表的集合包含所有具体工作簿中的工作表;命令条的集合包含所有的工具条和菜单。
集合同样是对象。
Excel中使用得最频繁的集合是表(Sheets)集合,它代表所有的工作表和图表,还有工作簿集合,工作表集合以及窗口集合。
当你使用集合时,相同的动作可以在这个集合中所有的对象上执行。
每一种对象都有一些特征供你描述。
在VB里,这些对象的特征被称为“属性”。
例如,工作簿对象有名称属性;区域对象有列,字体,公式,名称,行,样式和值等属性。
这些对象属性是可以设置的。
你通过设置对象的属性控制对象的外观和位置。
对象属性一次只能设置为一个特定的值。
例如,当前工作簿不可能同时有两个不同的名称。
VB中最难理解的部分是有些属性同时又可以是对象。
想想区域(Range)对象,你可以通过设置字体颜色来改变选定单元格的外观。
但是,字体(Font)可以有不同的名称(TimesNewRoman,Arial,…),不同的字号(10,12,14,…)和不同的样式(粗体,斜体,下划线,…)。
这些是字体的属性。
如果字体有属性,那么字体也是对象。
属性真是了不起,让你改变对象的外观,但是,如何控制这些操作呢?
你在使Excel为你执行任务之前,你需要知道另外一个术语。
对象有方法。
每一种你想要对象做的操作都被称为“方法”。
最重要的VB方法是Add方法。
你可以使用这个方法添加一个新工作簿或者工作表。
对象可以使用不同的方法。
例如,区域(Range)对象有专门的方法让你清除单元格内容(ClearContents方法),清除格式(ClearFormats方法)以及同时清除内容和格式(Clear方法)。
还有让你选择,复制或移动对象的方法。
方法有可选择的参数确定方法执行的具体方式。
例如,工作簿(Workbook)对象有一个叫关闭(Close)的方法。
你可以使用它关闭任何打开了的工作簿。
如果工作簿有改动,Excel会弹出一个信息,问你是否要保存变化。
你可以使用关闭方法和设定它的保存变化(SaveChanges)参数为假(False)来关闭这个工作簿并且不管它的任何变化。
正如例子:
Workbooks("Chap01.XLS").CloseSaveChanges:
=False
学习对象,属性和方法
当你学习新的事物时,理论会给你必须的背景,但是,你如何真正知道那是什么呢?
大多数人习惯形象思维,为了使Excel对象易于理解,VB在线帮助提供了一个对象模型,请看接下来的附图。
注意,Application对象位于树型图的最上端,它实际上代表Excel本身。
其它对象在较低的层次。
假设你想要控制Range对象,在你能够控制任何Excel对象之前,你必须对它创建引用。
为了获得下图中的Range对象,只要遵照下面几行代码。
每次看到树型图中的线指向不同的层时,你只要巧妙地将线换成一个逗点运算符(停顿,英文状态下的句号)。
这样,最终你会以下面的方式到达Range对象:
Application.Workbook.Worksheet.Range
你可以使用Excel对象树型图来寻找到其它对象的路径,例如窗口(Window),批注(Comment),自动筛选(AutoFilter)或者绘图区(ChartArea)。
分析对象模型是一个学习Excel对象的非常好的方法。
你花在这里的时间,以后你开始编写VBA过程的时候,会给你加倍的回报。
通常,你需要明确你引用的对象的名称。
现在,我们来点更具体的。
假设你要清除单元格A4里的内容。
手动做这个时,只要选择单元格A4然后按下键盘上的Delete键就可以了。
用VB做同样的操作,你首先需要知道如何使Excel选中了正确的单元格。
单元格A4和其它的工作表单元格一样,是Range对象。
VB没有Delete方法来清除单元格内容,取而代之的是ClearContents方法,例如:
Range("A4").ClearContents
注意在对象名称和方法之间的逗点运算符。
这个指令去除单元格A4里的内容。
然而,如何使Excel清除工作簿Chap02.xls第一个工作表里单元格A4的内容呢?
我们仍然假设打开了好几个工作簿。
图2-4Excel对象树型图(第一页)(译者:
原书图2-5(工作簿对象树型图)已包含在内,故在此略过)
如果你不希望最后在错误的工作簿或工作表里删除了A4里的内容,那么你必须写下详细的指令,这样VB就知道在哪里找这个单元格:
Application.Workbooks("Chap02.xls").Worksheets("Sheet1").Range("A4").ClearContents
上面的指令应该写成一行,并且应该从右到左阅读:
清除单元格A4里的内容,这个单元格在一个叫“Sheet1”的工作表里,而这个工作表又在一个叫“Chap02.xls”的工作簿里面,工作簿“Chap02.xls”又应该是Excel应用程序的一部分。
注意,集合名称的后面带有一个字母“s”:
Workbooks和Worksheets。
所有引用的工作簿,工作表或单元格名称都必须用引号(译者:
英文状态的引号)包括起来。
如何找到Excel对象树型图?
选择Excel界面上的“帮助”-“Excel帮助”-“编程信息”-“微软ExcelVB参考”-“Excel对象模型”。
(译者:
2002版有全局的对象模型,2003版好像没有这个。
)
除了Excel对象,你还可以使用Office,Forms和DAO,ADO对象模型。
属于这些数据库(library)中的对象都可以用在Excel中,也可以用在Office家族中的其它应用软件中。
在十五章,你可以看到使用DAO和ADO对象,从Excel进入Access数据库的例子。
图2-6Excel对象(Worksheet)
技巧2-4VBA和Excel的早期版本
Excel在线帮助列出了Excel对象模型从早期版本以来的变化。
许多对象,属性和方法都已经被更新的,改进的特色所代替了。
为了提供兼容性,被取代的对象已经被隐藏起来了(译者:
它们仍然是可用的)。
打开VB编辑器窗口上的在线帮助,隐藏的对象同样可以在对象浏览器里找到。
如果你在对象浏览器窗口上单击右键,你可以选择显示隐藏成员的选项。
你将在以后的章节中学习如何使用对象浏览器。
句法和文法
既然现在你已经知道了VBA的一些基本组成要素(对象,属性和方法),是时间开始使用它们了。
但是,你怎么将对象,属性和方法连接成正确的语言结构呢?
每种语言都有语法规则,人们必须遵循语法以确保他们被理解了。
无论你说的是英语,西班牙语,法语还是其它语言,你在读,写的时候都必须遵从一定的规则。
在编程中,我们使用“句法”(syntax)这个术语来更确切地明确它的语言规则。
你可以在在线帮助或者在对象浏览器窗口查找每个对象,属性或方法的句法。
下面列出一些你必须的VB常用规则:
⏹规则1:
引用对象的属性
如果这个属性没有自变量,使用下面的句法:
Object.Property
对象是一个占位符,是你放置你想要进入的实际对象名称的地方。
属性同样也是一个占位符,你可以在这里放置该对象的特点。
例如:
指向工作表中单元格A4中输入的值,见下述指令:
Range("A4").Value
注意对象名称和属性之间的句号。
当你需要进入一个存在于多个其它对象里的对象的属性时,你必须按顺序地写上所有对象的名称,并且用句号运算符分开。
例如:
ActiveSheet.Shapes
(2).Line.Weight
这个例子指向当前工作表里图形(Shapes)集合里的第二个对象里的直线(Line)对象的粗细(Weight)属性。
有些属性要求一个或多个自变量。
例如,使用偏移(Offset)属性,你可以选择一个和当前单元格相对位置的单元格。
Offset属性需要两个自变量,第一个自变量为行号(rowOffset)第二个是列号(columnOffset)。
对象属性自变量
ActiveCell.Offset(3,2)
在上面的例子中,假设当前单元格是A1,Offset(3,2)将会指向往下3行和往右两列的单元格,也就是单元格C4。
因为,在括号内的自变量总是很难理解,通常操作是将它们的名称也列上,见下例:
ActiveCell.Offset(rowOffset:
=3,columnOffset:
=2)
注意,自变量名称后面总是跟着一个冒号和一个等于号(:
=)。
如果你使用带名称的自变量,你可以任意顺序地列出它们,上面的指令也可以写成这样:
ActiveCell.Offset(columnOffset:
=2,rowOffset:
=3)
改后的指令没有改变意思,你仍然指向单元格C4。
然而,如果你改变ActiveCell.Offset(3,2)中自变量的次序,结果你会指向D3,而不是C4。
⏹规则2:
改变对象的属性
Object.Property=Value
Value是一个新的你要赋给该对象属性的值。
这个值可以是:
✧一个数字
Range("A4").Value=25
上面的指令在当前工作表的单元格A4里输入数字25
✧在引号里的文本
ActiveCell.Font.Name="TimesNewRoman"
上面的指令将当前单元格字体改为TimesNewRoman
✧逻辑值(True或False)
ActiveCell.Font.Bold=True
上面的指令设置当前单元格的字体为粗体。
⏹规则3:
返回对象属性的当前值
Variable=Object.Property
Variable(变量)是VB将要储存属性设置的地方的名称,你将在第三章里学习关于变量的知识。
变量对象属性
CellValue=Range(“A4”).Value
上面的指令将当前A4单元格里的值保存到变量CellValue。
⏹规则4:
指向对象的方法
如果该方法没有自变量,那么句法应该是:
Object.Method
对象是一个占位符,是你放置你想要进入的实际对象名称的地方。
方法同样也是一个占位符,你可以在这里放置要对该对象的进行的操作的名称。
例如,可以使用下述指令来清除单元格A4的格式(译者:
应该是内容):
对象方法
Range("A4").ClearContents
如果该方法可以使用自变量来限制,那么句法为:
Object.Method(argument1,argument2,…argumentN)
例如,使用GoTo方法,你可以快速地选择工作表里的任何区域。
GoTo方法的句法为:
Object.GoTo(Reference,Scroll)‘对象.GoTo(参照,窗口滚动)
Reference自变量是目标单元格或者区域,Scroll自变量可以设定为真(True)让Excel窗口滚动到该目标地址出现在窗口的左上角;或者设定为假(False),窗口不滚动(译者:
系统默认为False)。
例如,下面的VBA语句选择工作表Sheet1里的单元格P100,并且窗口滚动:
Application.GoTo_
Reference:
=Worksheets("Sheet1").Range("P100"),_
Scroll:
=True
上面的指令没有固定在一行,使用了一条特殊的线(下划线)将它分为几段。
下面的部分将讲述这个。
打断很长的VBA语句
尽管一行VBA代码最多可以包含1024个字母,但是,为了使你个过程容易阅读,最好将长的语句打断为两行甚至多行。
VB使用一个专门的连续线(下划线)置于一行代码的末尾,表明下一行是这行的连续。
例如:
Selection.PasteSpecial_
Paste:
=xlValues,_
Operation:
=xlMultiply,_
SkipBlanks:
=False,_
Transpose:
=False
这个连续符是下划线,你必须在下划线之后带一个空格。
你可以在下述几种情况中使用连续符:
⏹运算符之前或者之后。
例如:
&,+,Like,NOT,AND
⏹逗号之前或者之后
⏹冒号和等号(:
=)之前或者之后
⏹等号之前或者之后
你不可以在冒号和等于号之间使用连续符,例如,下面的代码VB是不认的:
Selection.PasteSpecialPaste:
_
=xlValues,Operation:
_
=xlMultiply,SkipBlanks:
_
=False,Transpose:
_
=FalseSelection.PasteSpecialPaste:
_
=xlValues,Operation:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Excel VBA 编程02第二章 第一步 编程 02 第二