_s_VBA教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
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(我在下面会解释这个微妙的差别)是众多语言中最容易学的,正如其名字一样,又”Visual”,又”Basic”。
所以大可不必担心诸如“我没有编程基础”之类的心理障碍。
VBA的全称是Visual Basic for Applications的简称。
其意思是开发环境被整合到了某个应用程序的Visual Basic语言。
在本教程中特指整合在MS Office 中的VBA。
(其余的还有比如VBA for AutoCAD, VBA for CorelDraw)我简单的将一门编程语言分为两个大的部分,第一部分是其语法。
语法规定了编程指令执行的顺序和内存的使用方式。
尽管如此,语法本身不能解决任何实际的问题,这就好比你知道了英语语法,但是不懂单词和短语,就不能正确沟通一样;另一个部分我称之为“库”,就是其他人写好了的,可以完成一定功能的东西。
你可以调用库的某一个部分来完成自己想做的事情。
语法和库在一起合作,最终可以完成复杂的任务。
对于VBA来讲,使用的是VB的语法(确切的说是VB6的语法,与目前的完全不同,如果你不知道我在说什么,那么就忽略这句话好了),采用的是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 i
Next
可以显示100次对话框,依次显示1,2,…,100。
可见语法并不关心你到底用了哪些库在做什么,而仅仅是完成其任务而已(在这里是循环)。
在今后的教程中,我会将重点放在介绍Office库提供的各种功能上,而不会花很多时间介绍语法。
仅仅是在第一次用某种语法举例子时,我会说明一下。
很快你就会发现这是很简单的一件事情。
在正式介绍编程之间,我简单说一下VBA的开发环境,也就是你写代码的地方。
如果你用的是Office 2003,在“工具”菜单找“宏”,在其子菜单中找”Visual Basic”,就可以打开一个新的窗口。
如果是在Office 2007中,若你没看到“开发工具”选项卡的话,先到选项中打开它。
然后在“开发工具”选项卡的“代码”区域里按”Visual Basic”按键,就可以打开同样的界面。
(我用Excel举例)
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.既然可以录制宏,为何还要手写代码?首先,宏录制的局限性很大,很多
动作(比如鼠标行为)是录不下来的。
另外宏只能录制顺序的多个指令,如上面的比较复杂一点的循环就不可能录制。
而且宏录制不能覆盖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 Studio 2005或者2008。
这对于办公族来说负担过重了。
只有开发复杂的插件,或者开发企业办公管理系统的人才应该使用它。
此外Apache基金会有一个POI项目,可以让Java程序访问Office文档。
这样用Java开发,同时又想自动生成Office文档的人(比如用Java写实验,但想用Excel文档统计实验结果)可以利用POI 来达到他们的目标。
不过POI目前不支持Office 2007的文件格式。
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(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 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 is34
n = 23.45 'now n is23
可见,在类型转换中,可能会有数据损失。
此外对于对象类型(下文将介绍)来讲,将一个类型的值赋给另一个类型的变量是会报错的。
因此建议大家尽量减少混用的情况。
一种特别的类型是Variant。
这种变量可以放置任何类型的数据。
比如上文中的Dim var就等价于Dim var As Variant。
但是要注意的是Variant并不意味着变量内容的类型可以变化。
它仅仅是能放置任何类型的数据而已,同一时间只有一个”实际类型”。
为此,其内部必须维护当前到底是什么类型,还需要在被访问时进行内部的二次解释。
所以它消耗的空间更大,并且性能更差。
另外如果用Variant变量表示一个对象,在写变量名后输入一个点,就不会有自动提示出现。
因此,建议大家少用Variant类型。
最后说一下作用域的问题。
每一个变量都有一个作用域。
如果在一个
Sub/Function内定义变量,那么这个变量的作用域就仅仅限于这个
Sub/Function,称为局部变量。
也就是说,在其他Sub/Function中是访问不到这个变量的;或者说,如果在其他Sub/Function中定义了同名的变量,二者完全是两码事,互相不会有任何影响。
在Sub/Function中的参数也是一种局部变量,其定义的方式就是比常规方法省略了Dim。
其形式正如上文所写的那样。
当然,你也可以在参数列表里不写类型,这就意味着参数类型是Varaint。
同样的,Function第一行的最后的As Type
表明Function返回值的类型。
不写这个返回值就意味返回Variant类型。
如果将Dim语句写在任意Sub/Function之外,就定义了全局变量。
此时变量对于当前模块文件的所有Sub/Function都有效。
这时,不同的Sub/Function之间就能通过全局变量交流(尽管这不是个好习惯,因为这样就破坏了Sub/Function 的独立性,使得复用难以进行)。
当然,还有可以在不同模块之间都有效的变量的定义方法,即将全局变量定义中的“Dim”改为“Public”。
不过这种变量在小型程序中非常少见。
也许你会问,如果某个局部变量恰好和全局变量同名会怎么样?这时局部变量会“遮蔽”全局变量,使你只能访问到局部变量。
下面是一个例子,大家可以来复习一下本次的内容。
Sub ShowSum()
Range("A1").Value = CalSum(200)
End Sub
Function CalSum(n As Integer) As Integer
Dim sum As Integer
sum = 0
For i = 1 To n Step 1
If i Mod 7 = 0 Then
sum = sum + i
End If
Next
CalSum = sum
End Function
最近代码计算了1~200之间所有可以被7整除的数字之和,并在A1单元格内显示结果(所以,请在Excel的VBA环境里运行此段代码)。
里面展示了如何定义和使用Sub,Function以及如利用变量来存储数据。
当然,我也用了一些没有讲过的关键字,如For,If等。
但我觉得它们的意思都是非常容易懂的。
比如For i=1 To n Step 1就定义了一个循环,让i从1逐渐增长为n,每次步长是1。
所以i依次变为1,2,3,……,n。
当运行到Next那句时就会返回到For那一行,将i增量,重新执行循环体代码。
而If是判断语句,判断i与7取模是否是0(整除),Mod是关键字表示取模。
而Range(”A1″)则是Excel提供的一个对象,意为得到名称为A1的那个单元格区域。
之后的代码就是将其值设为想要的结果。
关于对象将是下次的主题。
最后值得注意的是那个n不要设的过大,否则很容易造成sum不足以存储过大的数据而越界(记得么,整数的最大值是32767)。
●总结
本期我们讲了最基本的VB构造元素。
讲解了Sub、Function、关键字、变量定义和类型等概念。
如果你能读到这里,想想看你还能记得它们是怎么回事不?当然关于这个主题,有很庞大的内容我没有讲。
但往往就是这20%的内容在100%代码里被用到,它们是最核心的内容。
对于一些高级话题,如果你有兴趣的话,可以看Programming Microsoft Visual Basic 6.0 by Francesco Balena (Microsoft Press)。
下一期讲带大家进入对象的世界:)
●问答
1.我是菜鸟,一般一个sub连dim都不用,想起什么变量就上去用了。
这是不是相当于dim as variant ?
比如
sub a()
aa=1
msgbox aa
end sub
真实感觉:速度上,损失似乎不大;内存,似乎一个sub一次执行之后,变量全清空了,内存里的aa也被释放了。
那么对于一般的小程序来说,是不是就无所谓了呢?
—————————————————
是的,小程序无所谓,方便就好。
但是如果程序稍微大了些,对象多了些,类型检查是一个很好的防止错误的功能。
那个时候,写的对比写的少更重要。
其实我觉得在目前的硬件平台上,性能可以不做最优先考虑。
反倒是编程的便利性(写正确的类型后VBA编辑器有自动提示),可读性和类型错误检测让我不喜欢用Variant。
2.能返回数值的function,以及带变量的sub。
感觉很好用,但是他们自己若返回数值就不能单独执行了 ?? 比较困扰—————————————————
是的,一般情况下,Function不能像Sub直接被绑定到某个快捷键,某个按钮那样执行。
必须被某个Sub或者Function调用才行。
但是有一种情况,就是Excel 的自定义函数,Function的地位无可替代。
写一个Function后,可以像Excel 自带函数那样直接在单元格里使用。
3.VBA的变量必须先声明再使用么?
—————————————————
当然不是,VBA允许你直接使用变量而不经任何声明。
但是这样做可能会引起难以调试的错误。
比如你在第一行直接使用了变量abc,结果到了后边由于笔误写成了acb。
这一定会出逻辑错误,但是解释器因为语法没问题而不会报错。
你自己也很难在密密麻麻的代码中将这个错误挑出来。
为了强迫变量必须先声明,再使用,在程序的第一行加上这句:
Option Explicit
这样,如果不经声明直接使用变量就会报语法错误。
这对于比较大的程序十分必要。
2.对象
当你叫一个人做什么事情的时候,一般来讲你会如何做呢?你会说,比如,“周正龙,拍老虎去”。
如果你想知道一个人的信息时,你大概会这么问,“姚明,你有多高”。
这是我们平时的直观的交流方式。
对象就提供了这样一种机制,使得我们的编程更加符合人的思维习惯。
这样,做基于对象的编程就很方便了。
比如你可以用程序指令写Application.Workbooks.Add的代码让Application这个对象新建一个Workbook。
对象在物理上是一段内存的区域,维护着一组数据,这些数据管理着实际的各种看得见,摸得着的实体。
比如应用程序Application是一个对象,窗口Window 是一个对象,单元格是一个对象,段落是一个对象……在Office中,几乎任何实体都可以找到对应的对象。
如果你希望操作某个实体,那么你就操作它的对象就好了。
这样,编程的任务被转变成了找到合适的对象,并让这个对象做一些事情,或者从对象上获得一些信息。
在Office中使用的对象模型是COM(不同于比如CORBA,Java或者.Net的对象)。
COM是Component Object Model的简称,是微软开发的组件(Component)标准。
如果你不理解什么是组件,可以把软件看作是一个机器,而组件就是机器的一个个零件。
组件之间相互协作,共同完成任务。
COM组件的好处是可以跨语言。
也就是说,你可以用不同的编程语言来开发组件,并用不同的编程语言来使用组件。
在Windows下,你可以用C++,Visual Basic,J++等语言开来发和使用组件。
当然,我们在这里并不关心一个COM组件是怎么开发的。
你仅仅要记住如果要使用一个COM组件的主要步骤是什么就可以。
首先要使用COM组件,就必须先注册它。
如果你足够细心就能留意到很多Windows程序在安装的时候都有一步叫做“注册组件”。
这就是为什么如果有的程序不安装就用不了的原因——它们的组件没安装,因此没法用,程序自然就运行不起来。
Office当然也不例外,它会注册几个组件,这些组件分别对应不同的Office程序,比如Word,Excel,PowerPoint,Outlook等。
“注册”的结果可以在你的注册表里找到。
打开HKEY_CLASSES_ROOT,就能看到一长串的注册的组件,如下图所示。
图中你能看到Excel的一些组件。
每个组件定义了若干“对象类型”。
回想上一期讲解的类型就能知道任何一个变量都有一个类型。
而对象也有类型。
每个类型可以生成不同的“对象实例”。
这就是说,如果有一个Excel.Application的对象类型,我可以生成很多个此类型的对象实例,即开启多个Excel(其实类似的,如果有Integer这个类型,就可以定义很多个不一样的Integer变量)。
在下文中我会简称“对象类型”为“类型”,而“对象实例”为“对象”。
为了在VBA中使用某个类型,需要添加对包含这个类型定义的组件的引用(有点拗口是吧,多念几遍)。
在VBA编辑器的工具->引用就能打开一个对话框来更改引用,如下图所示:
默认情况下,VBA已经为我们自动添加了一些必要组件的引用,所以大多是时候我们可以完全忽略以上的步骤,直接写代码。
但如果想用一些额外的组件,就需要手动添加了。
每个对象会有如下几种成员:
•方法:表示一种动作。
这和上次讲的一般的Sub是没什么区别的,只不过它代表针对当前对象的动作。
比如上面提到的Workbooks.Add中的
Workbooks是一个对象(更确切的说,是一个集合对象,下面再详述),而Add就是这个对象的方法,用于执行“新建一个Workbook”这个动作。
•函数:表示一种具有返回值的功能。
这和上次讲的一般的Function是没什么区别的,只不过它代表针对当前对象的功能。
•属性:表示对象所带有的某种信息。
比如Window对象具有Captain这样的属性,表示其标题栏的标题;Height和Width属性表示Window对象的宽和高等等。
通过改变这些值就可以改变对象所代表的实体,比如改变其外观。
每个属性即可能是一个对象,也可能是一个基本类型的变量。
每个属性都属于一个类型。
值得注意的是有两种特别的属性。
第一种是“只读”的属性。
就是说你不能改变它,而仅仅能读取它。
比如单元格的Text属性就是只读的。
Excel根据单元格的Value和应用于此单元格的Format来决定Text是什么。
所以如果非得要改的话,需要改Value或者Format。
另一种是所谓“集合”的属性。
表示当前对象包含一组子对象。
直观上,一个Application包含多个Workbook,一个Workbook 包含多个Worksheet,一个Worksheet包含若干的Range。
对象也正是这么嵌套的。
比如你想获得第一个Workbook的第一个Worksheet的A10单元格需要这么写:
Application.Workbooks(1).Worksheets(1).Range("A10")。