戎人是什么民族:【VBA教材】16.单元格的表示法(一)

来源:百度文库 编辑:偶看新闻 时间:2024/05/03 06:15:58
大部分对象都有多种表示方法,其中最复杂的,应用最广的自然是单元格对象。
单元格的引用方式有多种,主要包括Range("a1")方式、cells(1,1)方式和[a1]方式、合集、偏移量、已用区域、当前区域、Resize End等等方式
本课时开始,利用多个课时对单元格的表示法进行讲解。
本课时讲述Range("a1")方式引用单元格。
Range可以将文本型的单元格地址转化为单元格对象引用,类似于工作表函数“INDIRECT”。它可以引用单元格、区域、整行、整列及整个工作表。
16.1 引用单元格
Range引用单元格对象的方式为:单元格的列标加行号做为参数,且左右加入引号。例如:
Range ("A1")——表示A1单元格
Range ("C25")——表示C25单元格
Range ("Z65536")——表示Z65536单元格,
Range ("A1")本身是代表一个单元格对象,但在“MsgBox Range("A1")”语句中则可以获取单元格的值。事实上“MsgBox Range("A1")”是“MsgBox Range("A1").value”的简写。
每个对象都有很多属性,同时也都有一个默认属性,而单元格的默认属性是“Value”,所以如果不明确指出属性时,那么一定是调用它的Value属性值。
Range参数中的引号必须是半角状态下输入,否则必将产生编译错误。另一个需要重点是VBARange("A1")方式引用对象时是不区分相对引用和绝对引用的,不管使用Range("A1")Range("$A1")Range("A$1")还是Range("$A$1")都引用同一单元格,而且在循环中也不产生任何影响。所以为了简化,通常只用Range("A1")这种形式来引用单元格。
16.2 引用区域
Range引用区域时是利用区域左上角单元格地址加冒号再加右下角单元格地址为其参数。不过参数也可以写成右下单元格地址加冒号再加左上角单元格地址,VBA会自动将其转换成左上角单元格地址加冒号再加右下角单元格地址的形式。
例如以下两种方式引用区域都可以得到相同结果:
MsgBox Range("A2:D1").Address
MsgBox Range("D1:A2").Address
以下是一些合法的区域引用:
Range ("A1:V10")——代表从A1V10的矩形区域,包括220个单元格
Range("F2:F10000")——代表从F2F10000的矩形区域,包括9999个单元格
Range("D2:Z10000")——代表从D2Z10000的矩形区域,包括229977个单元格
区域的默认属性也是Value,但是区域的Value是一个数组,包括多个对象,VBA中无法直接将其显示在屏幕上。如果利用Msgbox来显示这个属性值将得到一个运行时错误,例如图16.1


16.4 引用区域默认属性时产生运行时错误
正确的方式是逐个引用区域中单个值。通过索引号做参数来实现。例如:
Range("D2:Z10")(1)——代表D2:Z10区域中第一个单元格的Value,即D2
Range("D2:Z10")(3)——代表D2:Z10区域中第三个单元格的Value,即F2
Range("D2:Z10")(24)——代表D2:Z10区域中第24个单元格的Value,即D3
也就是说,索引号代表区域中从左到右、从上到下的序号,它是区域左上角单元格的参照进行相对引用。
如果索引号为小数时,VBA会自动对其进行四舍五入。如:
MsgBox Range("D3:E7")(1.5).Address——结果为“$E$3”,参数1.5当做2处理
MsgBox Range("D3:E7")(4.4).Address——结果为“$E$4”,参数4.4当做4处理
事实上,索引号可以使用两个参数,第一参数表示行的索引,第二参数表示列的索引。那么参数“(4,5)”就可以引用区域中第4行第五列的单元格,它以区域左上角单元格为参照,而非工作表中A1单元格为参照。
例如以下的引用:
MsgBox Range("D3:F7")(1, 3).Address——结果为“$F$3”,表示D3:F7区域第一行第三列
MsgBox Range("D3:F7")(4, 2).Address——结果为“$E$6”,表示D3:F7区域第四行第二列
MsgBox Range("D3:F7")(9, 4).Address——结果为“$G$11”,即D3向下偏移九个单位,再向右偏移四个单位。虽然其行数与行数都已超过区有区域的大小,仍然可以正确的引用单元格
ET中区域的参数不可以使用0和负数,仅仅Excel中支持这种写法。
Range的参数也支持表达式,即字符或者数值运算结果。例如:
Range("F" & 3 + 2)——表示引用F5单元格
Range("F" & Range("D5").Value)
Range("D" & WorksheetFunction.Min([a:a]) & ":G5")
还可以使用变量做为参数,这在循环语句中极为有用。例如:
Range("D" & i)——表示列标为D,行号为变量i的值的单元格引用。
16.3 引用多区域
如果在参数是使用多个区域的地址,且用半角逗号分隔,那么Range也可以引用多个区域。
例如以下引用方式:
Range("D3,F7")——表示D3F7两个区域,包括了2个单元格
Range("D3:F4,G10")——表示D3:F4G10两个区域,包括7个单元格
Range("A1,B3:F4,Z1:Z2")——表示A1B3:F4Z1:Z2三个区域,包括13个单元格
此方式引用单元格有一个限制:参数的长度不能超过256个字符,否则将会产生运行时错误。
16.4 引用整行、整列
利用“行号:行号”做为参数时可产生对整行的引用,同理利用“列标:列标”做为参数时可产生对整列的引用,如果两个行号或者列标不一致时,可以引用多行或者多列。
以下是一些合法的引用:
Range("2:2")——表示引用第二行
Range("2:10")——表示引用第二到十行
Range("D:d")——表示引用第D列,列标不区分大小写
Range("D:Z")——表示引用从D列开始到Z列结束的区域
Range("D:A")——表示引用A列到D列,顺序不一致时,VBA会自动转换成升序格式
参数中的冒号可以用半角也可以用全角,VBA会将其全角冒号转成半角冒号。但是引用却只能使用半角,否则将产生编译错误。
整行、整行引用对象除了Range法外,还可以用RowsColumns来完成。其中ROWS引用行,以阿拉伯数字做为参数;Columns引用列,即可用阿拉伯数字做参数,也可用列标做参数。
Rows(2)——表示引用第二行
Rows("2")——同样表示引用第二行
Rows("2:2")——仍然表示引用第二行
Rows("2:4")——表示引用第二到四行
Columns(2)——表示引用第二列,相当于Range("B:B")
Columns("B")——同样表示引用第二列
Columns("B:B")——仍然表示引用第二列
Columns("B:D")——表示引用BD
如果不带参数,那Rows代表整个工作表所有行,包括16777216个单元格。而Columns代表整个工作表所有列,仍然包括16777216个单元格。
16.5 Range嵌套使用
除以上的四种方法外,Range还支持利用单元格做为参数,其具体语法为:
Range(Cell1, Cell2)
其中Cell1Cell2是必选参数。Cells1用于指定目标区域的左上角单元格,Cell2用于指定目标区域右下角单元格。如果使用一个或者三个单元格将产生编译错误。
例如以下引用方式全是合法的区域引用:
Range(Range("A1"), Range("D2"))——表示引用A1:D2区域,包含8个单元格
Range(Range("A4"), Range("A100"))——表示引用A1:A100区域,包含97个单元格
当然也有一些特殊的应用,当参数并非单个单元格,而是区域时,取两个区域所跨越的最大范围。例如:
Range(Range("A1:A3"), Range("D2"))——表示引用A1:D3区域,而非A1:D2VBA会从两个区域中最左上角的单元格做为新的区域的参照起点,再取两个区域所跨越的最大行做为新的区域的行数,取两个区域跨越的最大列做为新区域的列数。
Range(Range("B2:A3"), Range("A3:D10")——表示引用A2:D10区域。
要理解这个算法,可以分别将B2:A3A3:D10两段字符配对,然后从前两个字符中最最小值,再从后两对字符中取最大值,再加上冒号组合成一个新的区域地址。例如“B2:A3”和“A3:D10”,第一对字符BA中取出最小值A,然后第二对字符23中取出最小值2,,再从第三对字符AD中取出最大值D,最后从310中取最大值10,将这四个字符与冒号串连起来即为“A2:D10”。