VBA入门之单元格的访问

 '前几天碰到一个访问非当前Sheet的单元格时的问题,困扰了半天,正好5.1有空就花了点时间研究了一下如何访问单元格。现把我所了解的总结如下,希望能够对像我这样的VBA入门者有一些帮助。

'************************************************************************

'1、访问单个单元格

'单个的单元格可以采用下面的几种形式:
Range("A1") = 1     '很直观,不用多解释了吧
[B1] = 1            '跟Range差不多,但更简洁
Cells(1, 3) = 1     'Cells有2个参数Rowindex和ColumnIndex,分别是行号和列号。注意是先行后列,和上两句的先列后行不一样。这句是把C1单元格赋值为1

'注意这里是针对当前的工作表的单元格,例如当前工作表为Sheet1,完整的用法应该是:

'Sheets("Sheet1").Range("A1").Value = 1     'Value一般也可以省略
'Sheets(1).Range("A1").Value = 1            '使用 Sheets(index)访问工作表(其中 index 是工作表名称或索引号),这两句和上面的Range("A1")=1的结果一样

'在访问当前Sheet时,前面的Sheets("Sheet1")或Sheets(1)可以省略。

'************************************************************************

'2、访问连续单元格区域

[A3:C5] = 2         '简洁直观,有点像使用Excel函数

'Range可以带1个或2个参数,即Range(Cell1)或Range(Cell1, Cell2),这里Cell1和Cell2可以是一个单元格,也可以是单元格区域。
'当使用Range(Cell1,Cell2)时,Cell1不一定是在Cell2的左上角,可能在Cell2的右下角,也可能这是2个相交的区域。返回的区域是包含Cell1和Cell2的最小的矩形区域。
'下面5条语句的执行结果一样,都是把区域A7:C9的值设置为3
Range("A7:C9") = 3
'Range("A7", "C9") = 3
'Range("A9", "C7") = 3           'Cell1在Cell2的右下角
'Range("A7:B7", "C8:C9") = 3
'Range("A8:C8", "B7:B9") = 3     'Cell1和Cell2是相交的2个区域

'Cells只能访问单个单元格,但是通过配合Resize命令就可以访问连续的单元格区域
Cells(11, 1).Resize(2, 3) = 4       'Cells(11,1)返回单元格A11,然后Resize(2,3)把A11向下扩展2行,向右扩展3列,返回区域A11:C12。

'************************************************************************

'3、访问不连续的单元格区域
[A14:B14,C15:C16] = 5           '返回用逗号隔开的2个区域
[A18,A20,B19:C19] = 6           '可以用多个逗号分割多个不连续的区域
Range("A23:C23,B22:B24") = 7    '和上两句的[]用法差不多。但要特别注意,这句的逗号是在两头的引号里面,所以只能算是一个参数,和第2点里面的Range用逗号隔开的2个参数时的含义不一样。

'用Cells好像不不能访问不连续的单元格区域

'************************************************************************

'4、用参数控制访问单元格区域
'有时候必须在程序中用参数运算来获得需要访问的单元格区域
'这时用Cell(R1,C1)或者Cell(R1,C1).Resize(R_count,C_count)会比较方便,这里R1、C1、R_Count、C_Count都是变量

Dim R1 As Integer, R2 As Integer, C1 As Integer, C2 As Integer, R_Count As Integer, C_Count As Integer
R1 = 1
C1 = 6
R_Count = 2
C_Count = 3
Cells(R1, C1).Resize(R_Count, C_Count) = 8      '通过参数使F1:H2的值为8

'把Range和Cells嵌套在一起使用也可以实现参数化,例如
R1 = 4
R2 = 5
C2 = 8
Range(Cells(R1, C1), Cells(R2, C2)) = 9     '使用2个带参数的Cells返回2个单元格,然后作为Range的2个参数,这样就能实现用变量来控制Range访问的单元格区域
'###特别注意###:如果使用Range+Cells嵌套使用,Range必须要使用2个参数,比如Range(Cells(R1,C1))只有一个参数,就会报错。像Range(Cells(R1,C1),"F9")有2个参数,即使只用了一个Cells也对的。

'另外还可以采用如下方法来实现Range参数化
R1 = 7
R2 = 9
Range(Chr(64 + C1) & R1, Chr(64 + C2) & R2) = 10       'Chr(65)="A",所以可以用Chr(64+变量)来得到列号
'Range(Chr(64 + C1) & R1 & ":" & Chr(64 + C2) & R2) = 10     '这句和上面一句实现的功能一样,都是设置F7:H9的值为10。如果已经知道列号,可以用Range("F" & R1)这种形式。

'[]好像不太容易参数化

'************************************************************************

'5、访问非当前Sheet的单元格
'在第一条中提到,当Sheet1为当前Sheet,访问Sheet1的单元格时,前面的Sheets(1)可以省略。但是如果访问的不是当前工作表,必须要补齐Sheets(index)。例如:

Dim i As Integer
i = 2
Sheets(i).[A3:C5] = 2
Sheets("Sheet2").Range("A7", "C9") = 3
Sheets(i).Cells(11, 1).Resize(2, 3) = 4

'###特别注意###,上面1~4条的代码中,只有Range+Cells嵌套使用的语句不能用于访问非当前Sheet,其他语句都可以。
'比如语句Sheets(2).Range(Cells(26, 1), Cells(28, 4)) = 1,执行时会出错。

'************************************************************************

'6、其他
'Offset(RowOffset,ColumnOffset)可以获得偏移后的单元格
[A1:C1].Offset(10, 5) = 11      'A1:C1向下偏移10行,向右偏移5列,得到F11:H11。Offset还可以和Range、Cells、ActiveCell配合使用,不一一举例了。


'第一条里面提到Cells有2个参数,其实Cells也可以只使用1个参数。使用一个参数时是把按从左到右,从上到下去找该单元格。
Cells(10) = 12      '第一行从左到右第10个单元格,即J1
Cells(266) = 12     '在Excel2003里,最大行号为IV,即256,所以266是第二行的第10列的单元格,即J2。

[F13:H14].Cells(3) = 12             'Cells(单参数)也可以和[]或Range所访问的单元格区域一同使用
Range("F13:H14").Cells(4) = 12      '此时不再是从整个工作表的从左到右从上到下去找单元格,而是在圈定的单元格区域内去找。F13:H14有2行3列,Cells(4)会返回该区域的第二行第一个单元格即F14
Range("F13", "H14").Cells(10) = 12   'Cells后面的索引号也可以超过前面指定的区域的单元格数目,超出部分会继续按规则一行一行找,这一句是把F16赋值为12。


'ActiveCell返回活动单元格,何谓活动单元格。用鼠标选中一个单元格,该单元格就是活动单元格。
'如果选择的是一个区域,该区域中有一格是白色的,这就是活动单元格。
'还有一个简单方法,地址栏中就是活动单元格的地址(前提是选中的区域不是经过命名的区域)。
[F18].Select        '选中F18,这时F18就是活动单元格。
ActiveCell = 13
ActiveCell.Offset(1, 0).Resize(1, 3) = 13   'F18向下偏移到F19,然后通过Resize扩展到F19:H19
ActiveCell.Range("A3:C3") = 13          '注意这里不是访问A3:C3,而是针对活动单元格的偏移。ActiveCell.Range("A1")表示活动单元格本身,用Range("A3:C3")返回的是F20:H20。
'这里的Range不能被[]代替,不知道为什么。

'************************************************************************

'上面这些例子,列举了Range、[]、Cells的一般用法。如果知道要访问的区域,用[]最直观,最简单。
'[]的所有用法都能被Range代替,但在某些场合,Range具有[]所没有的功能。
'如果要用参数控制访问的区域,Cells使用起来比较简单,特别是访问多个Sheet上的区域时。
'访问单元格区域的方法很多,具体使用时还是要根据当时的场合选取最合适的语句。

'************************************************************************

你可能感兴趣的:(VBA入门之单元格的访问)