VBA角度来看Excel工作表,一个单元格区域可以是一个单独的单元格、一个行、一个列或者一系列单元格及其行、列。在使用VBA程序代码引用单元格区域时,Range对象可能是最常用的对象。这里就将向用户全面介绍如何利用Range对象来对目标单元格区域进行引用并进行简单的操作。

一、目标单元格区域的数据读写

在使用VBA程序代码对目标单元格区域进行数据读写之前,用户需要首先获得对该单元格区域引用。在Excel VBA对象层次结构中,顶层的对象是Application,它代表当前正在运行的Excel应用程序实例,接下来是工作簿、工作表,然后才是单元格区域,即Range对象所要引用的内容。

1.引用单个单元格

例如,要在当前工作表中引用“A1”单元格,可以使用如下VBA代码:

Range(“A1”)

该句代码只是获取对“A1”单元格的访问途经,就像是用户拿到了电视机的遥控器一样。接下来,将该代码改为:

Range(“A1”).Value = 100

当运行该代码时,就会将“A1”单元格输入数值“100”,如下图所示。

如果要将“A1”单元格中的数据读取出来并显示在一个对话框中,可以采用如下两种编码方式之一:

Dim nVal As Integer

nVal = Range("A1").Value

MsgBox "A1单元格的当前值为:" & nVal

或者

MsgBox "A1单元格的当前值为:" & Range("A1").Value

当执行该代码之后,就可以实现提取“A1”单元格中的值并将其显示在对话框中的目的,如下图所示。


2.引用单元格区域

例如,要在当前工作表中引用“A1:E5”单元格区域,可以使用如下VBA代码:

Range(“A1:E5”)

或者

Range(“A1”, “E5”)

前者直接用“A1:E5”来界定出一个单元格区域,而后者用该单元格区域的左上角单元格“A1”和右下角单元格“E5”来圈定一个单元格区域。如果要使用Value成员来为该单元格区域写入数据,那么,该区域中的所有单元格都将被写入相同的值,如下图所示。

二、选择目标单元格区域

在上一小节中,用户在使用VBA代码对工作表的单元格进行读写数据时,光标始终停留在“A1”单元格中,用户都知道,光标的位置代表当前的选择,使用Range对象也可以控制当前的选择,例如要选择“A1:E5”单元格区域,可以使用如下代码:

Range("A1:E5").Select

当执行该代码时,“A1:E5”单元格区域就会被选中,如下图所示。

如果以“A1”单元格为起始的连续单元格区域会随着数据的不断增多不断扩展所占据的行数和列数,使用如下代码就可以准确地选择以“A1”单元格为起始点的连续数据区域:

Range(“A1”).CurrentRegion.Select

当执行该代码时,无论数据扩展到多大的单元格区域,都可以一次性被选中,如下图所示。

三、获取当前已被选择的单元格区域

在使用VBA处理工作表数据时,经常需要用户先选择要处理的数据单元格区域,然后,VBA代码才可以根据用户的选择来进行数据处理操作。那么,如何知道用户已经选择哪个数据区域呢?

方法非常简单,只需使用Selection对象即可,该对象代表了用户在当前工作表中的当前选定单元格区域。例如,用户要获取当前选择当元格区域的引用地址,可以使用如下代码:

MsgBox "当前选择的单元格区域为:" & Selection.Address

其中Selection.Address语句用于返回当前选择单元格区域的引用地址字符串,该代码的执行结果,如下图所示。


就算用户在工作表中配合【Ctrl】键选择了多个非连续的单元格区域,该行代码也完全能够应付,如下图所示。


提示:用户也可以使用VBA代码来同时选择多个非连续的单元格区域,例如要同时选择“B2:D7”和“F10:H17”单元格区域,可以编写如下代码来实现:

Range(“B2:D7, F10:H17”).Select

四、选择与激活单元格的区别

VBA中,选择一个单元格与激活一个单元格是两个不同的概念,选择是指用鼠标指针单击目标单元格或选择目标单元格区域;而激活是指在当前已选择的单元格区域中哪个单元格是当前可编辑的单元格。例如,用户选择了“B2:E4”单元格区域,那么,默认情况下,当前选择的单元格区域为“B2:E4”,而当前激活的单元格为“B2”,如下图所示。


如果现在用户输入数据,该数据就会被写入当前的激活单元格“B2”中,按【Enter】键,选择的单元格区不便,而激活的单元格顺延地变为“B3”,如下图所示。



如果用户当前只选择了一个单元格,那么,该单元格既是选择的也是激活的。当然,这种区别在使用VBA代码引用单元格时也会有所区别。

要引用当前激活的(或者叫活动的)单元格,可以使用如下代码:

ActiveCell.Value          '引用当前激活单元格的值

ActiveCell.Address        '获取当前激活单元格的地址

虽然在表面上看来选择与激活的用途没什么不同,但利用好这种区别还是非常有用的。例如,用户要对一个选定的单元格区域“A1:A4”中的数据进行朗读,并在朗读到每个单元格时都要突出显示该单元格。此时,激活单元格操作就非常具有使用价值,代码如下:

Range("A1:A4").Select

Range("A1").Activate

Range("A1").Speak

Range("A2").Activate

Range("A2").Speak

Range("A3").Activate

Range("A3").Speak

Range("A4").Activate

Range("A4").Speak

该段代码首先选择“A1:A4”单元格区域,接下来,激活“A1”单元格并朗读其中数据,激活“A2”单元格并朗读其中数据,以此类推。这样,用户就可以在倾听朗读数据的同时找到对应的单元格,如下图所示。