使用VBA在Excel环境中开发应用程序实际上是访问和协调Excel中各个对象的过程。
Excel提供了对象浏览器(视图→对象浏览器)(F2):
目录
1 VBA对象
2 VBA对象的事件
3 对象的选择和引用
4 Range对象和Worksheet对象的Select(选定)和Activate(激活)方法的区别
5 单元格区域的端点选择
6 已选取单元格区域范围和大小
7 选取全部单元格
8 选择特定单元格
9 按偏移量重置区域引用
10 模拟Ctrl+方向键产生的单元格
11 引用当前对象
12 其它引用方式
13 工作表操作
14 工作簿操作
15 Application对象
1 VBA对象
在Excel中,对象是指一组属性及这组属性上的专用操作的封装体。属性可以是一些数据,也可以是另一个对象。
如何用代码表示对象?VBA用名词来表示对象,用动词来表示对象的方法;
当对象是一个容器时,它会包含若干子对象,使用序号参数引用集合中的子对象;VBA的对象具有层次性,如:
A("module").Worksheets("model").range("A1")
每个对象模型都包含两种对象模型:集合对象与个体对象,如Workbooks、workbook;
常用对象的写法
应用程序对象:Application;
工作簿对象:Workbook;
工作表对象:Worksheet;
单元格对象:Range;
图形对象:Shape;
图表对象:Chart;
名称对象:Name;
容器对象:Windows;
以上对象部分支持复数形式(集合),如WorkSheets。集合对象通常有Count、Add等方法;可以使用循环遍历集合中的对象。
如何自动调用属性和方法?名称后加一个小圆点,如:
Ac("A1").Activate
Ac
1.1 设置对象属性
1.1.1 设置属性值
对象名.属性名 = 属性值表达式
S("A1").value = "test"
1.1.2 读取属性值
变量名 = 对象名.属性名
dim r
r = S("A1").value
1.2 调用对象方法
对象名.方法名称
S("A1").clear
1.3 对象变量和数组
变量和数组除了直接存储值,还可以引用对象。将对象分配给变量的优点如下:
变量名通常要比访问对象本身所需的方法和属性的完整路径短而且容易记忆;
与通过所需的方法或属性来重复访问对象本身相比,使用引用对象的变量更有效;
在代码运行期间,可以更改变量以引用其他对象;
2 VBA对象的事件
VBA对象除了属性和方法以外,还有事件。
事件的价值在于让代码按预定的条件自动执行;事件所关连的过程将在事件发生时自动执行,所以事件也称为自动化过程,它不需要人工调用,而且事件发生时,代码也随之执行,可见对象的事件赋予了对象更灵活的特征。
可以想像一下事件对于编程的重要性,以住需要单击菜单,键入快捷键来执行过程,而配合事件时可自动化执行,只要满足条件即可执行相应的代码;
事件的本质是对象在某些内部操作时允许开发者执行自定义操作;
Excel事件包括:
应用程序事件;
工作簿事件;
工作表事件;
窗体事件;
窗体中的控件事件;
每个事件都依附在事件的全体对象之上;
事件过程的名称包含有两项内容:对象和动作;在代码窗口的上方有两个下拉列表,以下两项组合成事件的名称:
“通用”:对象窗口;
“声明”:过程窗口:事件的动作;
多数事件过程都有参数,这些参数通常与触发事件的条件相关;
事件过程的参数是不能修改的,事件过程的名称则允许修改;
设置事件是否自动执行:A
按时执行代码:A;
A(EarliestTime,Procedure,LatestTime
3 对象的选择和引用
3.1 对象的层次与引用方式
对象的逐层引用;
使用对象名称引用对象:Workbooks("财务表.xls");
使用复数形式表示对象集合;
引用子对象:Workbooks("生产表.xls").Worksheets("1月");
使用序号参数引用集合中的子对象:Worksheets(1);
引用父对象:Range("a1").Parent.Name(用于获取工作表的名称);
引用活动对象:Ac("总表");VBA专门给活动对象赋予了一个特别的称谓,通常使用“Active”表示活动对象;ActiveWindow,ActiveWorkbook,ActiveSheet,ActiveCell,ActiveChart,当调用活动对象的子对象时,可以忽略活动对象名称,直接引用其子对象;
利用with语句引用重复出现的对象;
3.2 Range对象
Range("A1")引用方式
引用单元格:Range("a1");Range("B"&i+5);
引用行与列:Range("B:B");Range("B:Z");Range("2:2");Range("2:5");Columns(1);Rows(2);
引用区域:Range("a1:c5");
引用多区域:Range("C4:C11,E4:E11);
Cells(1,1)引用方式
[a1]引用方式;
活动单元格:ActiveCell
下一个单元格:Next
屏幕坐标下的单元格:Window.RangeFromPoint
选区:A、Window.RangeSelection
当前区域:Range().CurrentRegion是指以包含当前单元格且以空行与空列的组合为边界的区域;
按宽度与高度重置区域:Range.Resize;Range("B2").Resize(2,3)
引用多区域的合集:Union(Range("A1:B10"), Range("c1:c10"));
引用多区域的交集:Intersect(Range("A1:B10"), Range("c1:c10"));
利用名称引用区域:Ac "成绩", "=$A$2:$A$10";
3.3 图形对象Shapes、DrawingObjects
3.4 表对象Sheets
xlChart
xlDialogSheet
xlWorksheet
3.5 Selection对象
表示对选择区域的操作,可以用With语句,如:
With Selec
.Size=22
.ColorIndex = 6
End With
4 Range对象和Worksheet对象的Select(选定)和Activate(激活)方法的区别
Range对象和Worksheet对象都有Select(选定)和Activate(激活)方法,其区别和联系如下:
4.1 从功能上来说,Select代表选定对象,Activate代表激活对象。
4.2 从数量上来说,Select可以选定多个对象,Activate只能激活一个对象。
4.3 对于单个对象,Select和Activate是一样的。
4.4 Activate的对象必定在Select对象之中。当选定了多个对象时,其中某个对象必定是激活的对象。在已经Select的对象中,可以任意指定Activate的对象。如果Activate了当前Select对象之外的对象,则相当于重新执行了一次Select并激活。
4.5 在每次重新Select之后,则系统会自动Activate其中的某个对象。
4.6 一般的写法:
select,selection
Activate,activecell
ac
5 单元格区域的端点选择(B5:G17)
5.1 选取B列第一个非空单元格
If Range("B1") = "" Then
Range("B1").End(xlDown).Selcet
Else
Range("B1").Selcet
End if
5.2 选取B列最后一个非空单元格
Range("B65536".End(xlUp).Select
5.3 选取11列最左边非空单元格
If Range("A11") = "" Then
Range("A11").End(xlToRight).Selcet
Else
Range("A11").Selcet
End if
5.4 选取第17行最右边非空单元格
Range("IV17").End(xlToLeft).Select
(end()方法单元格的选取,从空到非空,从非空到空;)
6 已选取单元格区域范围和大小(B5:D14)
6.1 返回选取区域的总行数和总列数
Selec
Selec
6.2 返回选取区域的第一行的行号
Selec
6.3 返回选取区域左上角的单元格
Selec("A1").Address
6.4 返回选取区域右上角的单元格
Cells(Selec,Selection.Column+Selection.Columns.Count-1).Address
6.5 返回选取区域左下角的单元格
Cells(Selec+Selec.Count-1,Selection.Column).Address
6.6 返回选取区域右下角的单元格
Selec(Selec.count).Address
7 选取全部单元格的方法
7.1 Cells.select
7.2 Rows.select
7.3 Columns.select
8 选择特定单元格
8.1 选取当前已使用的单元格:Ac
8.2 选取的指定单元格相邻的区域:Range("address").Curren
8.3 按条件引用区域(选取特定内容单元格):Range("address").SpecialCells(单元格类型变量)
如:选择某一列的全部空行:Columns(1).specialCells(xlCellTypeBlanks).EntireRow
Range.SpecialCells(Type,Value)是指定位条件符合的单元格;如:
Ac(xlCellTypeConstants,7).Select
Range对象的SpecialCells方法可以返回一代表与指定类型和值匹配的区域。它的具体参数为:
表达式.SpecialCells(Type,Value)其中“表达式”表示单元格对象,“Type”参数表未单元格类型,“Value”参数是可选参数,只在“Type”参数为xlCellTypeConstants或xlCellTypeFormulas时用,用于确定结果中应包含哪几类单元格。
9 按偏移量重置区域引用
Range对象的Offset属性可以返回一个Range对象,代表位于指定单元格区域的一定的偏移量位置上的区域。其具体语法如下:
Range.Offset(RowOffset,ColumnOffset)
Resize用于调整指定区域的大小,返回代表调整后的区域。它有具体语法为:Range.Resize(RowSize,ColumnSize)
其中参RowSize代表重置后的行数,ColumnSize代表重置后的列数,两个参数皆为可选参数。
Range.Offset(RowOffset,ColumnOffset)
Offset(A1,2,1,6,3),表示,以A1为参照点,偏移(2,1),选取6行3列;
Range("A1").Offset(2,1).Resize(6,3).Select
Offset参数更多的是使用变量;常配合End属性使用,如合并工作簿或工作表时,将所有工作表的数据复制到汇总表中,要求按先后顺序排列,不能覆盖上一次合并的内容,此时需要定位非空行的下一行,然后再粘贴数据,而此需求需要将End配合Offset使用。
Worksheets("二月").u Worksheets("总表").Cell).End(xlUp).Offset(1,0)
10 模拟Ctrl+方向键产生的单元格
Range对象的End属性正好对应于以上四个快捷键,可以实现最上端、最下端、最左端和最右端的切换。它的具体语法为:
Range.End(Direction)
End表示引用源区域的区域尾端的单元格
如果活动单元格在一个较大的数据区域中间,按下快捷键【Ctrl+上箭头】、【Ctrl+下箭头】、【Ctrl+左箭头】、【Ctrl+右箭头】可以迅速将当前单元格移至已用区域的边缘;如果整个工作表均为空白则可以在最小行、最小列或者最大行、最大列之间切换;如果在空白区向数区域使用同方向的快捷键,则可以定位于该行(列)的第一个或者最后一个非空单元格。
参数 | 常量 | 说明 |
xlToLeft | 1 | 向左 |
xlToRight | 2 | 向右 |
xlUp | 3 | 向上 |
xlDown | 4 | 向下 |
11 引用当前对象
前面的对象引用方式可以确保总能正确的引用对象,然而却是牺牲效率来实现的。当所引用的对象是当前活动对象时VBA提供了简化的引用方式。
在引用活动对象时是不需要罗列其上层对象的,而是直接使用“ActiveCell”或者“ActiveWorkbook”等等。
在写法上较后者更简洁,而且在执行效率上也有大大的优势。
如果在工作表事件中使用Me,则它代表当前工作表;如果在工作簿事件中使用Me,则它代表工作簿;如果在窗体中使用Me,则它代表窗体对象。
12 其它引用方式
利用定义名称获取对象:Sheets(1).Shapes("按钮 2").Width = Sheets(1).Shapes("按钮 1").Width * 2
利用集合中的索引号来调用对象:Sheets(1).Shapes(i).Width = 100
13 工作表操作
13.1 隐藏和显示工作表
隐藏工作表:Work;(可用右键)
深度隐藏工作表:Work;(需要用VBA代码才可以显示)
显示所有隐藏的工作表:Work;
添加工作表:Work(Before,After,Count,Type)
14 工作簿操作
Workbooks.Open Filename:="", Password:=""
判断一个工作簿是否打开
For x = 1 To Workbooks.Count
If Workbooks(x).Name = "" Then
etc
End If
Next x
判断一个工作簿的存在
For x = 1 To
If Workbooks(x).Name = "" Then
etc
End If
Next x
15 Application对象
15.1 用Caption属性设置主窗口标题栏;
15.2 用StatusBar属性控制状态栏;
15.3 用ScreenUpdating属性控制屏幕更新;
15.4 用DisplayAlerts属性控制警报信息;
15.5 用SendKeys方法模拟键盘输入;
15.6 用OnTime方法定时执行过程;
15.7 用OnKey方法自定义功能键;
15.8 用WorksheetFunction属性调用内置函数
15.9 用Union方法合并单元格;
-End-