ch1 VBA概述.docx
- 文档编号:20186475
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:39
- 大小:221.60KB
ch1 VBA概述.docx
《ch1 VBA概述.docx》由会员分享,可在线阅读,更多相关《ch1 VBA概述.docx(39页珍藏版)》请在冰豆网上搜索。
ch1VBA概述
第一章VBA概述
本章包括
Ø介绍VBA(这是一种内置在EXCEL中的编程语言)
Ø如何使用VBE(VisualBasic编辑器)
Ø如何在VBE的“代码”窗口中工作和定制VBE环境
Ø有关使用宏录制器的信息
Ø概述对象、集合、属性和方法
Ø使用Comment对象的示例
Ø使用Range对象的特殊信息和示例
Ø如何访问关于EXCEL对象、属性和方法的信息
本章介绍VBA(VisualBasicforApplication)的构成和EXCEL的对象。
基本上,EXCEL程序设计可以归纳为对对象的处理,通过采用EXCEL可以理解的一种语言即VBA编写指令来处理对象。
1.1VBA基础知识
在进行VBA的实质学习之前,建议对VBA有一个比较全面的了解。
下面总结了VBA的一些内容:
◆代码:
通过执行VBA代码在EXCEL中运行动作。
编写(或录制)VBA代码,这些代码存储在VBA模块中。
◆模块:
VBA模块存储在EXCEL工作薄中,可以通过VBE(VisualBasic编辑器)查看或者编辑模块。
VBA模块由一些过程组成。
◆过程:
一个过程就是执行某些动作的计算机代码单元。
过程分为Sub和Function两种。
⏹Sub:
Sub不返回值,下面是一个名为“Test”的过程,其作用就是一个简单的求和过程,并将结果用一个消息框显示出来。
SubTest(val1asInteger,val2asInteger)
DimsumasInteger
sum=val1+val2
MsgBox“Theansweris“&sum
EndSub
⏹Function:
Function过程返回一个值(也可能是一个数组),可以从另一个过程中调用Function过程,也可以在公式中使用Function过程。
下面举一个AddTwo过程的例子:
FunctionAddTwo(arg1asInteger,arg2asInteger)asInteger
AddTwo=arg1+arg2
EndFunction
◆对象:
VBS处理包含在它的主应用程序中的对象(在这种情况下,Excel是主应用程序)。
Excel包含了100类可处理的对象,对象的例子包含工作薄、工作表、工作表上的单元格区域、图表和画的矩形。
对象是根据分层结构排列的,对象可以是其它对象的容器。
例如,Excel是一个称为“Application”的对象,它包含了其它的对象,比如WorkBook对象和CommandBar对象。
一个WorkBook对象又可以包含其它一些对象,比如WorkSheet对象和Chart对象。
一个WorkSheet对象可以包含的对象比如Range对象,PivotTable对象等。
这些对象的排列称为对象的层次。
◆集合:
如同形成一个集合的对象。
例如,Worksheets集合由某个特殊的工作簿中的所有工作表组成。
CommandBars集合由所有的CommandBar对象组成。
集合就是指集合本身当中的对象。
◆对象层次结构:
当引用一个内含的或者成员对象的时候,通过在容器和成员之间使用句点作为分隔符来指定它在对象层次结构中的位置。
例如,可以引用名为“Book1.xls”的工作簿:
Application.Workboos(“Book1.xls”)
这样即引用位于Workbooks集合中的Book1.xls工作簿。
Workbooks集合包含在Excel的Application对象中,将其延伸到另一个层次,可以引用Book1工作簿中的Sheet1工作表:
Application.Workbooks(“Book1.xls”).Worksheets(“Sheet1”)
可以继续延伸到下一层,按照如下方式引用某个特定的单元格:
Application.Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”)
◆活动对象:
如果省略对某个对象的特殊引用,那么Excel将使用当前活动的对象。
如果Book1是活动工作簿,那么上述引用可以简化为:
Worksheets(“Sheet1”).Range(“A1”)
如果知道是活动工作表,那么甚至可以继续简化这个引用:
Range(“A1”)
◆VBA变量:
可以给VBA变量赋值。
可以把变量看作是用来存储某个特殊的值的名称。
使用下列语句将Sheet1工作表上的单元格A1中的值赋给变量Interest:
Interest=Worksheets(“Sheet1”).Range(“A1”).Value
◆对象方法:
对象都有方法。
一个方法就是指与对象一起执行的一个动作。
例如,Range对象的其中一个方法为ClearContents,该方法将清除单元格区域的内容。
指定方法时,将对象和方法组合在一起进行指定,用句点隔开。
例如,要清除活动工作表上的单元格A1中的内容,可以使用下列语句:
Range(“A1”).ClearContents
◆标准的程序设计构造:
VBA还包括现代编程语言的所有构造,其中包括数组、循环等。
1.2VisualBasic编辑器
所有关于VBA的工作都是在VisualBasic编辑器(VBE)中完成的。
VBE是一个分离出来的应用程序,它可以与Excel无缝地结合。
当需要VBE的时候,Excel掌控着打开VBE的细节信息,不能单独运行VBE,如果要运行VBE,就必须运行Excel。
1.2.1激活VBE
VBE是一个高度可定制的窗口,可以隐藏一些窗口、更改它的窗口大小、固定工个栏、重新设置窗口的位置等。
当正在使用Excel的时候,可以使用下列任何一种方法切换到VBE:
✧按Alt+F11快捷键。
✧选择“工具”→“宏”→“VisualBasic编辑器”命令。
✧单击“VosialBasic编辑器”按钮,它位于“VisualBasic”工具栏上。
此处,可以按照如下方式访问两个特殊的模块:
✧首先在一个工作表的标签上单击鼠标右键,然后选择“查看代码”命令访问活动工作表的代码模块。
✧在Excel图标上单击鼠标右键(该图标位于Excel菜单栏的左侧),然后选择“查看代码“命令访问活动工作簿的ThisWorkbook对象的代码模块。
1.2.2VBE窗口
VBE由很多部分组成,包括菜单栏、工具栏、工程资源浏览器窗口、代码窗口、立即窗口。
下面分别予以简要描述。
1.VBE菜单栏
当然,VBE菜单栏和以前用户遇到的其他Office组件中的每个菜单栏都一样。
VBE菜单栏包含使用VBE中各种组件的命令。
很多菜单命令都有相互关联的快捷键。
例如,“视图”→“立即窗口”命令的快捷键为Ctrl+G。
2.VBE工具栏
默认情况下,标准的工具栏直接位于菜单栏的下面,它是6个可用的VBE工具栏之一,也可以把菜单栏看成一个工具栏。
VBE的工具栏跟Excel中的那些工具栏一样,可以自定义工具栏、移动工具栏、显示其他的工具栏等。
选择“视图”→“工具栏”→“自定义”命令处理VBE工具栏。
3.VBE工程资源浏览窗口
“工程资源浏览器”窗口显示了一个树型图,其中包含当前在Excel中打开的每一个工作簿(包括加载宏和隐藏的工作簿)。
每个工作簿被认为是一个“工程”,在下一节中将详细讲述“工程资源浏览器”窗口。
如果看不到“工程资源浏览器”窗口,按Ctrl+R快捷键即可。
如果要隐藏“工程资源浏览器”窗口,就单击窗口标题栏中的“关闭”按钮。
4.代码窗口
“代码”窗口包含VBA代码。
工程中的每一项都有一个相关联的代码窗口。
如果要查看对象的代码窗口,在“工程资源浏览器”窗口中双击对象即可。
例如,如果要为Sheet1对象查看代码窗口,则在“工程资源浏览器”窗口中双击Sheet1对象。
除非已经添加了一些VBA代码,否则“代码”窗口将是空的。
为了查看对象的“代码”窗口,还有一种方法是先在“工程资源浏览器”窗口中选择对象,然后单击“工程资源浏览器”窗口顶部工具栏中的“查看代码”按钮。
5.立即窗口
“立即窗口”非常有用,在其中可以直接执行VBA语句、测试语句和调试代码。
该窗口可能可见,也可能不可见。
如果看不到“立即窗口”,就按Ctrl+G快捷键。
如果要关闭“立即窗口”,就单击其标题中的“关闭”按钮。
1.3使用“工程资源浏览器”窗口
当使用VBE的时候,认为当前打开的每个Excel工作簿和加载宏都一个“工程”,可以把工程当成按照缩略图形式排列对象的集合。
通过单击“工程资源浏览器”窗口中的工程名称左侧的加号(+)展开工程资源显示。
通过单击工程名称左侧的减号(-)折叠工程资源显示。
如果想要展开用密码保护的某个工程,就会提示输入密码。
“工程资源浏览器”窗口的顶部包含三个按钮,第三个按钮称为“切换文件夹”,该按钮控制着工程中对象的显示方式,是按照层次结构还是非层次结构的单列表显示。
如果加载了很多工作簿和加载宏,那么“工程资源浏览器”窗口可能会有点拥挤。
如果没有在使用某些工程,多半希望将工程的缩略图折叠起来。
遗憾的是,不能隐藏“工程资源浏览器”窗口中的工程。
每个工程展开后,至少显示一个节点“MicrosoftExcel对象”。
这个节点展开后,会在工作簿中的每个工作表和图表工作表显示一项(认为每个工作表都是一个对象),还会显示一个对象ThisWorkbook(它代表ActiveWorkbook对象)。
如果工程中包含任何VBA模块,那么工程列表还会显示出“模块”节点,并把各个模块列在该节点的下面。
工程还可能包含“窗体”节点,该节点包含“UserForm”对象(就是通常所说的自定义对话框“。
如果工程还有任何类模块,则显示另一个节点“类模块”。
图1.1工程资源浏览器
1.3.1添加新的VBA模块
为了向工程添加一个新的VBA模块,首先在“工程资源浏览器”窗口中选择工程的名称,然后选择“插入”→“模块”命令。
或者在工程名称上单击鼠标右键,然后从快捷菜单中选择“插入”→“模块”菜单命令。
当录制宏的时候,Excel自动插入一个VBA模块,进而可以容纳录制的代码。
1.3.2删除VBA模块
如果必须从工程中删除一个VBA模块或者类模块,首先在“工程资源浏览器”窗口中选择工程的名称,然后选择“文件”→“移除×××”(这里的×××指模块的名称)。
或者在模块名称上单击鼠标右键,然后从快捷菜单中选择“移除×××”命令,此时可能会询问在移除之前是否要导出模块。
不能移除与工作簿关联的代码模块(ThisWorkbook代码模块)或者与工作表关联的代码模块(例如Sheet1代码模块)。
1.3.3导出和导入对象
除了那些列在References节点下的对象,工程中的每个对象都可以保存到单独的文件中。
将单个对象保存到工程中称为“导出”。
显而易见,也可以将对象“导入”到工程中。
如果希望在另一工程中使用某个特殊的对象(比如说一个VBA模块或者用户窗体),那么导出和导入对象很有用。
为了导出对象,首先在“工程资源浏览器“窗口中选择它,然后选择“文件”→“导出文件”命令(或者按Ctrl+E快捷键),此时会出现询问文件名的对话框。
注意,对象仍然保存在工程中(只是导出了一个它的副本)。
如果导出一个UserForm对象,那么也会导出与这个用户窗体相关联的代码。
为了将文件导入到工程中,首先在“工程资源浏览器”窗口中选择工程的名称,然后选择“文件”→“导入文件”命令,此时会出现询问导入哪个文件的对话框。
可以导入一个已经导出的文件。
如果想把某个模块或者UserForm对象复制到另一个工程中,实际上没有必要先导出再导入这个对象。
确保两个工程都处于打开状态,然后只需要激活“工程资源浏览器”窗口,再将对象从一个工程拖放到另一个工程中即可。
1.4使用“代码”窗口
工程中的每个对象都有一个关联的代码窗口,这些对象可以是:
◆工作簿本身(“工程资源浏览器”窗口中的ThisWorkbook)
◆工作簿中的工作表或者图表工作表(“工程资源浏览器”窗口中的Sheet1或者Chart1)
◆VBA模块
◆一个类模块(这种特殊类型的模块允许创建新的对象类)
◆一个用户窗体
1.4.1存储VBA代码
一般而言,代码窗口可以容纳4种类型的代码:
◆Sub过程:
一个过程就是执行某项动作的一套指令。
◆Function过程:
一个函数就是返回一个值或者数组的一套指令(与工作表函数的概念类似,比如SUM工作表函数)。
◆属性过程:
这些是用在类模块中的特殊过程。
◆声明:
声明是提供给VBA的某个变量的信息。
例如,可以为计划要使用的变量声明数据类型。
一个VBA模块可以存储许多Sub过程、Function过程和声明,如何组织VBA模块完全取决于你。
有些人喜欢把他们为应用程序设计的所有代码放在一个VBA模块中,还有一些人则喜欢把代码分解到几个不同的模块中。
虽然存储VBA代码的地方有很大的灵活性,但是也存在一些限制。
事件处理程序必须位于对应事件对象的“代码”窗口中。
例如,如果编写在工作簿打开时要执行的过程,那么该过程必须位于ThisWorkbook对象的“代码”窗口,而且该过程必须有一个特殊的名称。
当以后讨论事件和用户窗体的时候,这个概念将变得更加清晰。
1.4.2输入VBA代码
在一个代码窗口中添加代码的方法有三种,从键盘输入、使用宏录制器、从其他的模块复制代码再粘贴到合适的地方。
不管使用哪种方法,推荐对代码采用易于阅读的编排模式,如下所示:
SubSayHello()
DimmsgAsString
DimansAsInteger
msg="Ifyournameis"&Application.UserName&"?
"
ans=MsgBox(msg,vbYesNo)
Ifans=vbNoThen
MsgBox("Oh,nevermind.")
Else
MsgBox("WelcometoVBAworld,"&Application.UserName&".")
EndIf
EndSub
如果一条语句有很长,考虑到可读性的缘故,可以将它分解为两行或者多行,方法是在代码行的末尾加上一个空格和一个下划线字符,然后按回车键并继续在下一行输入剩余的指令。
如:
MsgBox("WelcometoVBAworld,"_
&Application.UserName&".")
当然一个字符串(用""括起来的字符序列)是不能用上面的方法拆成几行的。
尝试往工程中插入一个VBA模块后,在模块中的“代码”窗口中输入以上代码,你可以采取下列办法执行这个SayHello过程(如果代码窗口中有多个过程,确保鼠标光标停在SayHello过程):
◆按F5键。
◆选择“运行”→“运行子过程/用户窗体”命令。
◆单击“标准”工具栏上的“运行子过程/用户窗体”按钮。
1.4.3使用宏录制器
1.新建一个Excel工作簿,命名为“宏测试.xls”。
打开录制宏对话框的操作有三种:
(1)从菜单启动,在菜单栏选择“工具”→“宏”→“录制新宏”。
(2)快捷键操作:
Alt+T(ool)→M(acro)→R(ecord)。
(3)从菜单栏选择“视图”→“工具栏”→“VisualBasic”,在出现的“VisualBasic”工具栏中点击按钮
,即可开始录制宏。
2.开始录制宏。
在出现的录制新宏对话框中,输入适当的宏名,本例中为“重命名工作表”;在保存在一栏中选择“个人宏工作簿”;快捷键一栏中输入Ctrl+g。
修改“sheet1”的名称为“新表1”,点击停止按钮,停止录制宏的操作。
提示:
如果选择保存位置为:
(1)“当前工作簿”,只有当该工作簿打开,录制的宏的才能使用;
(2)“新工作簿”,只能在新工作簿中使用;(3)“个人宏工作簿”,可以在多个工作簿中使用。
个人宏工作簿保存位置为:
MicrosoftOffice的安装目录+\OFFICE11\XLSTART。
注意:
快捷键的命名不要与Excel原有的快捷键重复,否则将覆盖原有的快捷键方式。
3.运行宏。
运行宏命令的方法有五种:
(1)通过快捷键的方法,Ctrl+g(刚才定义的);
(2)使用菜单。
从菜单栏选择“工具”→“宏”,打开宏对话框,选择宏名,单击执行按钮(快捷键Alt+F8);
(3)利用宏工具栏,点击宏工具栏中的按钮
即可打开宏对话框;
(4)使用窗体按钮运行宏。
具体操作:
从菜单栏选择“窗体”→“工具栏”→“窗体”,打开“窗体”工具栏。
在“窗体”工具栏选中“按钮”,做工作表的工作区中拖动,可以画出一个按钮,并且在松开左键后,即可出现“指定宏”的对话框。
当然这一操作也可以用快捷菜单实现,包括编辑按钮上的文字。
注意:
默认情况下,宏的安全性设为高,要设为中或低才能执行宏。
具体操作为:
选择菜单“工具”→“宏”→“安全性”,在安全性对话框中将级别设置为“中”。
(5)从菜单栏选择“工具”→“自定义”(Alt+T→C),打开“自定义”对话框,选择“命令”标签页,“类别”中选择“宏”,“命令”中选择“自定义按钮”,将自定义按钮拖曳到命令工具栏中停靠。
第一次单击
,即出现指定宏对话框。
在指定宏后,再次单击即可执行指定的宏。
以后我们还将接触到在右键菜单中添加快捷菜单并执行宏。
现在看看录制的宏代码。
使用快捷键(Alt+F11)打开VBE,展开VBAProjectPERSONAL.XLS节点下的“模块1”,或以看到如下代码:
Sub重命名工作表()
'
'重命名工作表Macro
'宏由hechengsheng录制,时间:
2010-3-3
'
'快捷键:
Ctrl+Shift+G
'
Sheets("Sheet1").Select
Sheets("Sheet1").Name="表1"
EndSub
其中,以单引号开始的代码行为注释。
这个宏中的有效代码仅有两行。
也许你会为宏录制器生成代码的效率叫好,其实不然。
下面我们再录制一个宏,执行的动作只是将当前的Excel的页面设置由“纵向”改为“横向”,打开VBE,你会看到如下的代码:
SubMacro2()
'
'Macro2Macro
'宏由hechengsheng录制,时间:
2010-3-3
'
'
WithActiveSheet.PageSetup
.PrintTitleRows=""
.PrintTitleColumns=""
EndWith
ActiveSheet.PageSetup.PrintArea=""
WithActiveSheet.PageSetup
.LeftHeader=""
.CenterHeader=""
.RightHeader=""
.LeftFooter=""
.CenterFooter=""
.RightFooter=""
.LeftMargin=Application.InchesToPoints(0.75)
.RightMargin=Application.InchesToPoints(0.75)
.TopMargin=Application.InchesToPoints
(1)
.BottomMargin=Application.InchesToPoints
(1)
.HeaderMargin=Application.InchesToPoints(0.5)
.FooterMargin=Application.InchesToPoints(0.5)
.PrintHeadings=False
.PrintGridlines=False
.PrintComments=xlPrintNoComments
.PrintQuality=300
.CenterHorizontally=False
.CenterVertically=False
.Orientation=xlLandscape
.Draft=False
.PaperSize=xlPaperA4
.FirstPageNumber=xlAutomatic
.Order=xlDownThenOver
.BlackAndWhite=False
.Zoom=100
.PrintErrors=xlPrintErrorsDisplayed
EndWith
EndSub
现在,你一定惊奇于一个命令竟然生成如此多的代码。
虽然只更改了“页面设置”对话框中的一个简单设置,但是宏录制器生成的代码却生成了该对话框中的所有设置。
这表明,宏录制器几乎总是会生成很多“多余”的代码。
实际上,这个宏可以简化为下列模样:
Submacro2()
WithActiveSheet.PageSetup
.Orientation=xlLandscape
EndWith
EndSub
除了设置Orientation属性的代码行,其余代码全部是多余的。
事实上,这个宏还可以进一步简化,因为在只更改一个属性的时候,With–EndWith结构不是必需的,如下所示:
Submacro2()
ActiveSheet.PageSetup.Orientation=xlLandscape
EndSub
在这个例子中,宏改变了活动工作表上的PageSetup对象的Orientation属性。
顺便提一下,xlLandscape是内置的常量,使用对象查看器可以查阅到常量xlLandscape的值为2,而xlPortrait的值为1。
下面的宏与上述的宏的功能一样。
Submacro2()
ActiveSheet.PageSetup.Orientation=2
EndSub
相对于数字“2”而言,xlLandsacpe当然是一个有意义的名称,这也是微软的程序人员定义这相常量的初衷。
所以,推荐在你的代码中使用这样的常量,而不是一个数字。
关于代码示例
浏览全书,有很多小的VBA代码片段用来阐述问题或者提供示例。
通常,这些代码可能只有一条语句,或者只是一个表达式(它本身并不是一条有效的指令)。
例如,下是一个表达式:
Range("A1").Value
如果要测试这个表达式的值,可以利用MsgBox函数,它是一种非常便利的工具:
MsgBox(Range("A1").Value)
当然,你必须将这句代码放到某个Sub过程中,或者在“立即窗口”(按Ctrl+G打开)中输入这句代码,然后按回车键来完成测试。
也可以在“立即窗口”中输入以下代码:
?
Range("A1").Value
这个表达式的结果将显示在“立即窗口”的下一行。
_______________________________________________________________________________
1.5关于对象和集合
当运用VBA解决问题的时候,必须理解对象和Excel的对象模型的概念,这有助于按照层次结构考虑对象。
这个模型的顶层是Application对象,在这里也就是Excel本身。
但是如果在MicrosoftWord中用VBA编程,那么Application对象就是Word。
1.5.1对
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ch1 VBA概述 VBA 概述