本课时讲述关于单元格的三方面知识:
* Selection与ActiveCell
* RangeSelection
* 利用名称引用单元格与区域
19.1 Selection与ActiveCell
在选择了单元格或者区域的情况下,Selection可以引用选择区域所有单元格,通常简称为选区。而ActiveCell则表示活动单元格。
选区可以是一个单元格,也可以包含多个单元格,甚至多个区域;活动单元格仅仅一个。,活动单元格一定包含于选区中。
如果选区仅仅一个单元格时,那么选区与活动单元格完全相同,它们代表相同的对象。
如果选区包括多个单元格时,那么活动单元格的确定方式为:最先选择的单元格为活动单元格。如果首选择A1,然后通过拖动继续选择A1:D3,那么第一个选择的单元格A1为活动单元格;如果选择D3,然后通过拖动鼠标继续选择A1:D3,此时选区与前者一致,但活动单元格却为D3。
在外观上,选区与活动单元格也有区别。选择呈灰色显示,而活动单元格则背景为白色。图19.1即为ET中的选区与活动单元格的区别,B2是ActiveCell,B2:D3是Selection。
图19.1 ET中Selection与ActiveCell的区别
如果需要选区不变的情况下改变活动单元格,那么可以用两种方法完成:
(1)单击法
按住l键后鼠标单击选中任何单元格,该单元格即可活动单元格。例如在图19.1的前提下,按住Ctrl键单击C2单元格,那么Selection不变,而ActiveCell将变成C2。
(2)VBA激活法
利用VBA可以改变当前活动单元格,方法是利用Activate语句。其语法如下:
Range.Activate
其中Range表示待激法的单元格,只能包含一个单元格,如超过一个则会产生运行时错误。
如果需要对选区中第四个单元格激活,那么使用以下语句:
Selection(4).Activate
如果需要对选择中第二列第三行单元格激活,则用以下语句:
Selection.Cells(3, 2).Activate
如果需将最后一个单元格激活则用以下语句:
Selection(Selection.Count).Activate
提示:Activecell和Selectiion只能用于当前工作表,如果加前置对象来指定其它工作表或者工作簿,将产生运行时错误。例如:
Sheets(2).Selection——不管当前表是否Sheets(2)都产生错误
Sheets(2).ActiveCell——不管当前表是否Sheets(2)都产生错误
19.2 RangeSelection
RangeSelection表示指定窗口中工作表上的最后一次选定的单元格。它不受当前选择对象限制。
例如选择单元格A1,然后一个图片或者图片,那么此时Selection代表图表或者图片,而RangeSelection则代表A1单元格。
测试RangeSelection与Selection的区别步骤如下:
(1)在工作表中插入一张图片;
(2)选择A10后再选择图片;
(3)进入VBE窗口中,插入一个模块,然后录入以下代码:
____________________________________________________________
Sub 区分()
MsgBox "Selection: " & TypeName(Selection) & Chr(10) _
& "RangeSelection: " & TypeName(ActiveWindow.RangeSelection)
End Sub
____________________________________________________________
(4)执行以上过程,结果如下:
图19.2 区分Selection与RangeSelection
从上图可以明显区分,Selection在此时代表图形对象,而RangeSelection则代表单元格对象,它是最后次选择的单元格或者区域。
19.3利用名称引用单元格或区域
单元格或者区域都可以手工定义为更有意义的名称,在代码中引用该名称比引用区域地址更具有可读性。
例如以两句代码:
[b9].FormulaArray = "=SUM(a1:a8*b1:b8)" '汇总A1:A8的数量与B列的单价之积
[b10].FormulaArray = "=SUM(数量*单价)" '汇总A1:A8的数量与B列的单价之积
A1:A8存放产品的数量,B1:B8存放产品的单价,那么VBA中使用“SUM(数量*单价)”显示比“SUM(a1:a8*b1:b8)”更利于阅读者理解。
1.将区域转换成名称
在使用名称前,需要将区域定义一个新名称。名称可以使用Applation对象的Names 属性。其具体语法
Names.Add(Name, RefersTo, Visible, MacroType, ShortcutKey, Category, Nameal, RefersToLocal, CategoryLocal, RefersToR1C1, RefersToR1C1Local)
Names.Add的参数较多,但其中最常用的第一、二个参数,其作参数通常忽略。
假如需要对图19.3中的各列数据进行命名,Name为各列的标题,RefersTo为标题以外的数据区域,那么根可以得到以下过程代码:
____________________________________________________________
Sub 添加名称()
Application.Names.Add [a1].Text, "=$A$2:$A$8"
Application.Names.Add [b1].Text, "=$B$2:$B$8"
Application.Names.Add [c1].Text, "=$C$2:$C$8"
End Sub
____________________________________________________________
定义名称后,可以进入名称对话框逐一查看每个名称及其引用地址。
图19.3 产品单价格
图19.4 定义名称对话框
VBA还提供了一种批量定义名称的方法:Range对象的CreateNames 方法,其具体语法如下:
表达式.CreateNames(Top, Left, Bottom, Right)
各参数的含义如下:
表19-1 CreateNames参数详解
名称 |
必选/可选 |
描述 |
Top |
可选 |
如果该值为 True,则使用顶部行中的标签创建名称。默认值为 False |
Left |
可选 |
如果该值为 True,则使用左侧列中的标签创建名称。默认值为 False |
Bottom |
可选 |
如果该值为 True,则使用底部行中的标签创建名称。默认值为 False |
Right |
可选 |
如果该值为 True,则使用右侧列中的标签创建名称。默认值为 False |
根据表7-3的参数解释,可以编写出以下过程代码来取代Names.Add方法。代码如下:____________________________________________________________
Sub 批量定义名称()
Range("A1:C8").CreateNames Top:=True, Left:=False
End Sub
____________________________________________________________
此方式定义名称的结果与前面的代码执行结果完全一致,而且更为高效。
本例案例文件参见附件“添加名称.et”
2.在过程中引用名称
引用区域名称的语法为:
Range ("Name")
即利用用户定义的名称做为Range的参数,且需要在名称外添加双引号。
针对前面建立的名称,如果需要计算第三个产品的价值,那么利用区域引用和使用名称引用将有以下两种引用方式,读者可以从中观察两种方法的差异。
____________________________________________________________
Sub 计算第三种产品价值()
MsgBox "产品:" & Range("A2:A7")(3) & "的价值为:" & Range("B2:B7")(3) * Range("C2:C7")(3)
End Sub
Sub 计算第三种产品价值2()
MsgBox "产品:" & Range("产品名称")(3) & "的价值为:" & Range("数量")(3) * Range("单价")(3)
End Sub
____________________________________________________________
注意:“Range("A2:A7")(3)”不能写作“[A2:A](3)”。
本过程将名称代入过程中取代单元格地址,结果完全相同,但对于阅读者来说,更直观、易懂。