Excel的操作基本都是围绕工作簿、表单、单元格展开的,这些就是Excel操作的核心对象,所以VBA操作的核心对象也是它们。了解了这些核心的对象与它们支持的功能,我们就可以很方便的开发各种应用。
了解了这一点,我们先来分析一下Excel核心对象与我们看到的Excel文件的对应关系:
- 对于Excel来说,最外层的对象就是Application,它代表整个Excel应用;
- 而每个Excel文件,都对应一个Workbook;
- 文件中的每个Sheet表单,都对应一个Worksheet;
- 表单中的单元格,对应的是Range对象(这个与直观想象可能不一样,实际上,并不存在Cell对象,表征单元格的对象是Range);
从这个描述中,我们可以很容易的看出每个对象的层级关系和包含关系:
- Application对象必然包含一个Workbooks集合,来表征Excel的每个文件;
- Workbook对象必然包括一个Worksheets集合,来表征它包含的所有表单;
- Worksheet对象又必然包含Range或者Cells对象,来标识它包含的单元格;
- 当然由于描述问题的形式不一样,Worksheet也自然会包含Rows和Columns集合来标识它包含的行和列。
这个纵向的关系就如下图所示:
静态的分析完这些以后,下面我们动态的分析一个常见的操作:打开一个Excel文件,Excel会自动做哪些事呢?当我们打开多个Excel文档后,这些对象有什么变化呢?
打开第一个Excel文档的时候,Excel会实例化一个Application对象代表Excel应用,然后实例化一个Workbook代表当前的工作簿,然后实例化相应的Worksheet和更底层的其他对象。当再次打开别的文档的时候,由于Application对象已经存在了,所以,只会实例化新的Workbook,Worksheet等对象,而不同的Workbook对象之间并不会互相干涉。当我们操作Excel中的各种对象的时候,基本都是选中并激活对象,然后通过鼠标或键盘完成各种功能。这个过程是简单的,但是很直观,很有用,其实自动化这些操作的过程,就是我们使用VBA脚本模拟这个过程的过程。
从上面的分析我们已经得到了核心对象的关系,在下面我总结了这些核心对象最常用的一些属性和方法。
1. Application
Application代表的是Excel应用程序,从核心的操作对象包含关系分析得到下列成员:
Workbooks - 类别:集合/属性,返回类型:Workbook集合,含义:当前打开的所有Excel文件的集合
Worksheets/Sheets - 类别:集合/属性,返回类型:Worksheet集合,含义:当前活动的Excel文件中Worksheet的集合
Rows - 类别:集合/属性,返回类型:Range,含义:当前活动Sheet的所有行
Columns - 类别:集合/属性,返回类型:Range,含义:当前活动Sheet的所有列
Cells - 类别:属性,返回类型:Range,含义:当前活动Sheet中所有的单元格
ThisWorkbook - 类别:属性,返回类型:Workbook, 含义:当前正在运行的Macro所在的Excel文件
ActiveWorkbook - 类别:属性,返回类型:Workbook,含义:当前活动的Excel文件
ActiveSheet - 类别:属性,返回类型:Worksheet,含义:当前活动的Sheet
ActiveCell - 类别:属性,返回类型:Range,含义:当前活动的单元格(不一定是一个,可能是一组)
Range - 类别:属性,返回类型:Range,含义:指定的一组单元格,需要提供参数
Selection - 类别:属性,返回类型:选中的对象类型(如Range,Chart等),含义:当前Macro执行的目标文件中选中的对象
WorksheetFunction - 类别:集合/属性,返回类型:WorksheetFunction对象,含义:返回所有Worksheet内置的函数
Windows - 类别:集合/属性,返回类型:Windows集合,含义:当前Excel所有文件中打开的窗口。
从Application代表着可视化元素分析得到下列成员:
Dialogs - 类别:集合/属性,返回类型:Dialogs集合,含义:Excel所有内置的对话框
CommandBars - 类别:集合/属性,返回类型:CommandBars集合,含义:Excel所有菜单和工具栏
StatusBar - 类别:属性,返回类型:String,含义:Excel状态栏上的文本
InputBox - 类别:方法,返回类型:Variant,含义:显示一个让用户输入的对话框,可以指定录入的数据类型并验证。如果点击取消,则返回False。
其余常用的方法成员:
Run:运行执行的宏或函数。
Quit:退出Excel。
SendKeys:模拟键盘操作(%代表Alt, ^代表Ctrl, +代表Shift,其余特殊键如Tab要加"{}",如"{Tab}", "{Enter}"等),这个函数一般用于当不能用Excel中的对象和函数解决相关问题的时候,可以模拟用户按键盘的方式完成默写功能。
OnTime:延时运行一个函数。
Evaluate:计算传入字符串参数代表的对象或值。
GoTo:选中指定条件的范围并激活。
ActivateMicrosoftApp:激活一个微软的程序,比如计算器(0),Word(1)等等。
GetOpenFileName:打开“打开文件”对话框,返回选中的文件的名字,但并不真打开。
GetSaveAsFileName:打开“另存为”对话框,返回用户选中或输入的名字,但并不真保存。
ActiveWindow:获得当前活动的窗口。
FindFile:显示“打开文件”对话框,并打开选中文件,打开成功则返回True,否则返回False。
Intersect:获得两个Range对象的重叠区域。
其它常用的属性成员:
ScreenUpdating:是否关闭屏幕刷新,一般一些操作的时候不想立即显示出来,就可以先关闭,做完操作以后开启。
DisplayStatusBar: 是否显示状态栏。
Version:当前Excel的版本号(12代表2007,14代表2010...),保存文档选择格式的时候可以使用这个信息。
DefaultFilePath:打开或保存文件时的默认路径。
CutCopyMode:推出剪切/复制模式的话,程序中选中目标的虚线框就不显示了,一般如果有剪切或复制操作后,都要把这个设为false。
DisplayAlerts:是否显示警告框。
FileDialog:获得“打开文件”对话框对象,可以用Show去显示,也可以设置这个对话框的一些属性。
2. Workbook
描述层级关系的几个成员:
Worksheets/Sheets - 类别:集合/属性,返回类型:Worksheets集合,含义:当前活动的Excel文件中Worksheet的集合。
Connections - 类别:集合/属性,返回类型:Connections集合,含义:当前数据源的数据连接。
ActiveSheet - 类别:属性,返回类型:Worksheet,含义:当前活动的Sheet。
其它常用的属性:
Name:指定Workbook对应的Excel文件的文件名。
FullName:指定Workbook对应的Excel文件的全路径。
Names:指定Workbook中所有命名的名字集合。
Path:指定Workbook对应的Excel文件的路径(不包含文件名)。
Password:打开Workbook需要的密码。
Saved:指示当前的Workbook是否已经保存了,是只读的。
其它常用的方法:
Activate:激活指定的Workbook。
Close:关闭Workbook对应的文件。
Save:保存Workbook对应的文件。
SaveAs:另存为新的文件,不会出现对话框。
RefreshAll:刷新Workbook中所有的外部数据资源与数据透视源。
3. Worksheet
常用的成员包括:
Name - 类别:属性,含义:获取或设置指定Worksheet的名字。在Excel中,手动操作是双击Sheet的名字位置,然后修改。
Copy - 类别:方法,含义:复制Sheet到新的位置,会生成新的Sheet。
Delete - 类别:方法,含义:删除Sheet。
Move - 类别:方法,含义:移动Sheet到新的位置。
Paste - 类别:方法,含义:粘贴Clipboard中的内容到Sheet中。
PivotTables - 类别:方法,含义:返回当前Sheet中的指定的数据透视表或者所有数据透视表。
Rows - 类别:集合/属性,含义:返回当前Sheet中的所有行
Columns - 类别:集合/属性,含义:返回当前Sheet中的所有列
Cells - 类别:集合/属性,含义:返回当前Sheet中的所有的单元格(用行和列的Index标识)
Range - 类别:集合/属性,含义:返回当前Sheet中的所有单元格(用行列的字符串标识)
UsedRange - 类别:集合/属性,含义:返回当前Sheet中的用户使用的范围,这个是相当有用,它的很多属性都是居家生活必备良品。
Shapes - 类别:集合/属性,含义:返回当前Sheet中所有的Shape对象,如自选图形,多边形,OLE对象,图片等。
4. Range 与 Cells
实际上,Excel的对象中并没有Cell对象,所有的Cell相关的区域全部用Range来标识。同时Cells是存在的,它代表当前Sheet中所有的单元格,它的类型是Range,它存在的价值在于:Range用字符串来标识单元格,但是有时候循环的时候,用行列的Index来标识单元格更方便操作,特别是当要处理当前Sheet中的所有单元格时,Cells就派上用场了。
Range对象是Excel操作最为核心的对象,几乎所有的操作最终都是反映到该对象上,所以熟悉这个对象的常用成员是非常重要的。要引用Range对象,可以直接使用单元格区域的名字,地址等字符串,设置起始结束单元格格式,除了这个,使用Offset,Resize方法,或者最简单的使用"[]"也可以引用相关Range对象。例如:
Range("MyCell").Value = 1 '使用了单元格的名称
Range("A1:B10").Value = 1
Range("A1, A3, A5") = "XYZ"
Range("A1", "B10") = 1
Range("A:A").EntireColumn.AutoFit '自动调整A列宽度
Range对象常用的成员如下所示:
Row, Column:返回Range对象中所有区域中第一块区域的第一行行号,第一列列号,返回类型为Long。
Rows, Columns:返回该Range对象包含的所有行,所有列,返回类型为Range。
CurrentRegion:返回四面被空行和空列包围的一个新的Range对象,这个新的Range对象包含当前Range对象(不管当前的Range是不是空行空列),这个属性在相当一部分操作中都是很重要的,特别是当目标Range的行列位置不确定时可以用这个属性返回目标区域。
Count:返回Range对象包含的单元格的数目,返回类型为Long。
Value:Value代表Range对象的值,类型为Variant,可读可写,写的时候会把Range中所有单元格都设为相同值。
Offset, Resize, End:这几个都与选择Range的范围有关,Offset强调返回Range对象指定偏移方向上的单元格,执行这个操作后返回的是偏移后的单元格;Resize强调扩充当前的Range对象;End返回包含该Range的指定方向上的最后一个单元格,常用于返回用户使用的最大的行与列。
Formula:返回或设置Range对象的公式,用于大范围填充或计算数据时很方便。
AutoFill:自动填充Range对象中的所有单元格,用于大范围填充数据时很方便。
SpecialCells:返回Range对象中满足一定条件的单元格,返回类型为Range,用于大范围填充数据的时候,配合使用可以有奇效。
Select, Clear, Copy, Cut, Paste, PasteSpecial, Delete:这一组为最基本的操作,不解释。
MergeCells:返回Range对象中是否包含合并的单元格,返回类型为Boolean。
Merge, UnMerge:合并,取消合并Range对象中的单元格。
Areas:Range对象可以是不连续的,每个不连续的区间就用Area标识。
Address:Range对象的地址,以行列形式返回字符串,这个有时候很方便。
VerticalAlignment, HorizentalAlignment:Range对象中单元格的对齐方式。
Worksheet:当前Range所在的Sheet,属于反向的引用,有时候能派上用场。
5. Selection
Selection代表了Sheet中选中的内容,如果选中的是单元格,那么它返回的就是Range对象,如果选中的是其他元素,则返回的就是其他对象。它是Application的一个相当重要的属性。一般来说,当Range对象执行Select方法后,Selection的表演就正式开始了。之所以单拿出这个属性来强调一下,是因为它的地位很重要,它代表了一种操作思想,虽然选中单元格再操作并不总是很好的手法(说来说去还是效率的问题,后面我会单独总结一下这个方面的做法),但是很多时候,这么做确实是很多人的首要选择,原因很简单,因为很自然,很直观,我们可以看着Excel一步一步完成我们想要的每个步骤。
在VB编辑器中,按快捷键Ctrl+J可以显示Intellisense列表。
对象有默认属性,使用对象时如果不指定属性,则使用默认属性。一般不建议使用,容易引入Bug。
到Range对象时,我已经不再区分属性和方法了,在VBA语法中这个实在没太大区别,使用的时候需要传参数就传即可。
注意对象的赋值用的是“Set...=...”语法。
在无二义性的前提下,VBA中支持省略父对象而直接使用属性,如直接使用Selection,代表使用的是Application.Selection。
最好的资料就是MSDN,这是Excel资料的链接:http://msdn.microsoft.com/en-us/library/bb149081(v=office.12).aspx
存在即合理,常用、重要都是相对的,不要小瞧任何对象和成员。