VBA 的设计,充满了诡异和混乱,这是设计缺陷,尤其是对有程序员身份背景的人来说,VBA 的设计简直是灾难,比如,最典型的是调用一个对象的属性需要传递参数,而调用函数或方法时却使用 shell 式语法,参数是否放在 () 内还会影响函数或方法的调用,如果参数放在了 () 内不处理函数或方法的返回值也会报错,将函数或方法的返回值传递给其他函数或方法时,还有可能导致解析错误,一个函数或方法有多个参数有默认值时还有可能出现不知道传递的参数值是传递给了哪一个参数,这些都是 VBA 的设计硬伤。
Range 是 Worksheet 对象的属性,它可以接受一个或者两个参数,这两个参数表示要选择的单元格或单元格区域的地址。
地址参数必须以字符串形式传递,可以是但不限于以下这些形式。
"A1" 单一单元格
"A1:C4" 单元格矩阵
"1:2" 整列单元格矩阵
"A:B" 整行单元格矩阵
"A1:C5,E3:F4" 非连续区域
"Sheet1!A1" 带工作表表名的单一单元格
"Sheet1!A1:C4" 带工作表表名的单元格矩阵
"Sheet1!1:2" 带工作表表名的整列单元格矩阵
"Sheet1!A:B" 带工作表表名的整行单元格矩阵
"'C:\[wuxiancheng.xlsx]Sheet1'!A1" 带文件名和工作表表名的单一单元格
"'C:\[wuxiancheng.xlsx]Sheet1'!A1:C4" 带文件名和工作表表名的单元格矩阵
"'C:\[wuxiancheng.xlsx]Sheet1'!1:2" 带文件名和工作表表名的整列单元格矩阵
"'C:\[wuxiancheng.xlsx]Sheet1'!A:B" 带文件名和工作表表名的整行单元格矩阵
如果地址带文件名,文件必须在打开状态,地址中的文件目录部分可以省略。
如果指定了两个地址参数,最终确定的地址范围是两个地址表示的两个矩形范围最左上方到最右下方之间的整个矩形范围区域。
以上代码选择的区域为 A1:E9 而不是 A1:C3 加 B2:E9,要想实现区域相加,可以使用 Application.Union 方法或使用一个参数表示的“非连续区域”。
Range.Item 可以使用两个参数调用,也可以使用一个参数调用,参数 2 可以是数字或字母。
只使用一个参数调用 Range.Item 时,参数只能是数字,而且可以是负数或 0,xRange 是一个 Range 对象,后同不注。
如果区域只有一个单元格 RxCy,index 是同列向下偏移的索引量 最终选中 Rx+index-1Cy 单元格,其中 x, y 为行号数字和列号数字。
如果区域是一个矩形阵列,选中在区域内从最左上方单元格开始从左到右计数,遇到右侧边界折行继续计数的第 index 个单元格,单行或单列同样如此。
使用两个参数调用 Range.Item 时,row_index 是行号偏移量数字,column_index 是列号偏移量数字或列号字母,column_index 如果是字母,直接使用字母确定列,是数字时才需要计算,这两个数字都可以是负数或 0,它们实际上是相对于区域内最左上方单元格的相对行序号和列序号。
- xRange.Item(row_index, column_index)
复制代码 以上代码选择的单元格是 Range 区域内基于最左上方第一个单元格 RxCy 的 Rx+row_index-1Cy+column_index-1 单元格。
Range.Item 可以选择区域以外的单元格,如果计算后的单元格行号数字或列号数字小于1,将会报错。
Rows() 和 Columns() 会产生比较特殊的 Range 对象。
Rows([index]) 和 Columns([index]) 的参数 index 可以省略,如果不省略,该参数必须是 1 开始计数的整数,分别表示第 index 行整行的所有单元格或 第 index 列整列的所有单元格,如果不指定参数,它们选中的都是整个工作表的所有单元格。Rows() 和 Columns() 产生的 Range 对象的 Item 属性接受并且只接受一个参数,这个参数必须是从 1 开始计数的数字,需要注意的是 Rows().Item() 和 Columns().Item() 选择的不是一个单元格,而是一行或一列单元格。
Rows(x).Item(y) 选择第 x+y-1 行整行
Columns(x).Item(y) 选择第 x+y-1 列整列 |
|