Excel VBA 学习总结 纵论核心对象

  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("A1")=1  
Range(
"MyCell").Value = 1 '使用了单元格的名称
Range("A1:B10").Value = 1
Range(
"A1, A3, A5"= "XYZ"
Range(
"A1""B10"= 1
strValue = [A1:B1]
Range(Cells(0,0),Cells(5,5)).Clear
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

存在即合理,常用、重要都是相对的,不要小瞧任何对象和成员。

原文地址:https://www.cnblogs.com/dxy1982/p/2159236.html