ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > excel VBA中单元格的各种引用方式

excel VBA中单元格的各种引用方式

作者:绿色风 分类: 时间:2022-08-17 浏览:414
楼主
wise
单元格作为VBA入门的一个必需掌握的概念,单元格的引用有多种方式,现在根据自己的经验及参考相关的书本来整理涉及单元格引用的知识。
最近发现自己对单元格方面的知识并没有完全掌握,收到了罗版的VBA自学宝典,结合以前的那些相关资料,一边学习,一边把相关的知识点记录下来。
一、选取所有单元格。
  1. Sub 选取全部单元格一()
  2.   Cells.Select
  3. End Sub
注:cells是所有单元格的集合。
  1. Sub 选取全部单元格二()
  2. Rows.Select
  3. End Sub
而Rows则是所有行的集合。
  1. Sub 选取全部单元格三()
  2. Columns.Select
  3. End Sub
而columns则是所有列的集合。
无论是所有单元格的集合,还是所有行或列的集合选取,都是工作表中全选所有单元格的表示方式。
2楼
wise
二、Range引用来选取单元格
1、Range引用单元格方式1:Range("单元格地址")
例如:Range("A1"):表示单元格A1,注意:单元格地址要加双引号
值得注意的是:双引号的输入必须是在半角状态下输入的,否则会出现错误。
"单元格地址"里面的单元格地址不区分相对引用和绝对引用的,无论你是使用Range("A1")、Range("$A1")、Range("$A$1")还是Range("A$1"),都是引用通一个单元格。
一般为了简化作用,直接用Range("A1")这种形式来表示引用单元格。
2、Range引用单元格方式2:Range("单元格区域")
在VBA数组中,经常遇到arr=Range("A1:D10")这种数组赋予方式,而里面出现了Range("单元格区域")的这种单元格区域引用。
从这个最常见的例子中,我们可以发现,"A1:D10"代表了一个单元格区域的引用,其中A1是该区域的左上角上面的单元格,而D10则是该区域右下角下面的单元格。
但大家可以从下面两个例子来发现:
  1. Sub q1()
  2. Range("A1:D10").Select
  3. End Sub
  4. Sub q2()
  5. Range("D10:A1").Select
  6. End Sub

这两个小例子得到的结果都是选取A1:D10这个单元格区域
3楼
wise
值得大家注意的,以下的这些通过索引号作为参数的引用,都是比较陌生的。
比如以下这个小例子:
例子1:
  1. Sub T1()
  2. Range("B2:E6")(1).Select
  3. End Sub

注释:该例子代表了选取B2:E6区域中的第一个单元格的,即选取B2
例子2:
  1. Sub T2()
  2. Range("B2:E6")(3).Select
  3. End Sub

注:该例子代表选取B2:E6区域中的第三个单元格,即D2,而单元格的区域的读取一般是从左到右,然后再从上到下进行读取的,故该区域的前3个单元格分别是B2、C2、D2,而第3个单元格就是为D2
例子3:
  1. Sub T3()
  2. Range("B2:E6")(3.5).Select
  3. End Sub

注意:当里面的索引号为小数时,excel会对其进行四舍五入,比如例子3中的3.5,excel会把它转换为4,故例子3中的代表是B2:E6区域的第4个单元格选取,即选取E2
例子4:
  1. Sub T4()
  2. Range("B2:E6")(3.2).Select
  3. End Sub

而例子4中,因为四舍五入的关系,得到的结果是选取该区域的第3个单元格,即选取D2
4楼
wise
例子5:
  1. Sub F1()
  2. Range("B2:E6")(1, 4).Select
  3. End Sub

注:在例子5中,Range("单元格区域")(行号,列号),所代表的是选取该单元格区域中第几行与第几列交叉的那个单元格,而例子5中代表是选取B2:E6区域中的第1行第4列的单元格,在该区域中,所符合条件的单元格为E2。
值得关注的是,(行号,列号)里面的参数可以使用0或者负数。
当行号的参数为0的时候,则向该区域的左上角单元格向上偏移一个单位,当列号为0时候,则向该区域左上角单元格向左偏移一个单位;如果参数是负数的时候,在原来的基础上追加偏移量。
具体请看例子6、7:
  1. Sub F1()
  2. Range("B2:E6")(0, 0).Select
  3. End Sub

例子6中是选取了A1单元格,即B2:E6区域左上角单元格B2分别向上偏移一行,向左偏移一列,所得到的单元格为A1
例子7:
  1. Sub F1()
  2. Range("C3:E6")(-1, -1).Select
  3. End Sub

例子7中代表了C3:E6区域的左上角单元格C3分别向上偏移两行,向左偏移两列,所得到的单元格为A1
5楼
wise
3、Range("列标" & 行数)的单元格引用方式:
例子7:
  1. Sub Y()
  2. Range("B" & 10).Select
  3. End Sub

从这个最简单的例子,一个最常见的单元格引用方式。注意:列标需要加上双引号,并且要用到"&"把列标和行号连接起来。
经常用到的一个例子:往A1:A100里面分别填充1到100等这100个数字
  1. Sub a()
  2. Dim i As Integer
  3. For i = 1 To 100
  4.   Range("A" & i) = i
  5. Next i
  6. End Sub

从中可以看到这种单元格方式引用的作用。
6楼
wise
4、Range("定义名称")的单元格引用:
首先在excel2007中,公式→定义名称→把"A1:A100"区域定义为"数字"。
便可以使用这种方式,具体请看以下例子:
  1. Sub B()
  2. Range("数字").Select
  3. End Sub

注:A1:A100这个区域已经定义名称为"数字",该代码表示选取A1:A100单元格区域
注意:定义名称也必须添加双引号,并且是半角下输入的。
7楼
wise
5、Range方式引用多个区域:
前面详细说了:Range("A1:B10")这样类似的区域引用方式,但值得注意的是,那只是连续区域的引用。还有一些不连续的区域,则需要在区域中间加,号
比如以下例子:
  1. Sub 多区域引用()
  2. Range("A1,C1,D3:E8").Select
  3. End Sub

注意:"A1,C1,D3:E8"这个为不连续的区域,中间需要用,号隔开,并且不连续的区域直接还是要用双引号作为标记,这个代码表示选取A1、C1、D3:E8。
这里主要要关注,号的使用。
但是,该方式引用有一个限制:参数的长度不能超过256个字符,否则产生运行错误。
8楼
wise
连接上面那个例子,给出另外一种使用方式:
  1. Sub 多区域引用2()
  2. Union(Range("A1"), Range("C1"), Range("D3:E8")).Select
  3. End Sub

该例子中主要使用了union 来进行连接,这种方式得到的结果和上面的那个例子所得到的结果是一样的。
这两种方式,都是对不连续区域进行连接,相对比,还是上面的那个例子比较简洁。
9楼
wise
Range嵌套使用
主要语法:Range(cell1,cell2),其中cell1cell2是必选参数。Cell1代表指定区域目标的左上角单元格,Cell2代表指定区域目标右下角单元格。
具体看例子


  1. Sub a()
  2. Range(Range("A1"), Range("E4")).Select
  3. End Sub


注:该例子表示选取A1E4区域

而下面这个例子:

  1. Sub B()
  2. Range(Range("A1:A3"), Range("E2")).Select
  3. End Sub


注:上面这个例子表示选取A1E3区域。注意不是选取A1E2的区域。VBA会从两个区域中最左上角的单元格作为新的区域作为参照起点,再取两个区域所跨越的最大行作为新的区域行数,取两个区域跨越的最大列作为新区域的列数。
10楼
wise
与Range相关的选取整行或整列:
  1. Sub a()
  2. Range("A:A").Select
  3. End Sub
上面这个例子,表示选取A列,注意,无论是"A:A"或者是"A:a",代表的都是选取A列,里面不区分大小写。
另外表示选取第一列,还可以用下面的代码:
  1. Sub yy()
  2. Columns(1).Select
  3. End Sub
  1. Sub aa()
  2. Columns("A").Select
  3. End Sub
  1. Sub aa1()
  2. Columns("A:A").Select
  3. End Sub

而选取第一行可以用下面的例子:
  1. Sub b()
  2. Range("1:1").Select
  3. End Sub

而选取第一行,还可以使用下面的代码:
  1. Sub yy1()
  2. Rows(1).Select
  3. End Sub
  1. Sub aa2()
  2. Rows("1").Select
  3. End Sub
  1. Sub aa3()
  2. Rows("1:1").Select
  3. End Sub
11楼
wise
三、Cells引用单元格
1、Cells(行数,列数)
请看下面例子:
  1. Sub a()
  2. Cells(1, 2).Select
  3. End Sub

该例子表明选取B1单元格
2、Cellls(行数,列标)
请看例子:
  1. Sub ba()
  2. Cells(2, "B").Select
  3. End Sub

该例子中表明选取B2 单元格,但该方法引用单元格永远只能引用一个,并且不能引用区域。
12楼
wise
3、Range.cells(横坐标,纵坐标)
这种方式引用单元格是以其父对象Range左上角单元格作为参照系,向下累加的坐标系数来指定单元格。
请看下例:
  1. Sub aa()
  2. Range("B2:F10").Cells(2, 2).Select
  3. End Sub

该代码表示B2:F10单元格中横坐标为2、纵坐标为2的单元格C3,该参照是以B2为基准的。
另外,cells里面可以使用小数,不过VBA会对其进行四舍五入再计算,具体看下例:
  1. Sub au()
  2. Range("B2:F10").Cells(3.8, 3.4).Select
  3. End Sub

该代码表示B2:F10单元格中横坐标为4、纵坐标为3的单元格D5。
13楼
wise
4、Range.cells(索引号)
当使用单个索引号作为参数时,它表示父对象中的一个索引子集。其编号方式是先行后列、先左后右。
请看下例:
  1. Sub au()
  2. Range("B2:F10").Cells(3).Select
  3. End Sub

该例子表示B2:F10区域中第3个单元格D2。
这种方式比较少见,也比较少用。
14楼
wise
四、[A1]方式引用单元格,该单元格表示的简化方法。
单元格的简化表达方式:[单元格地址]
表示单元格A1,简写为[A1]
注意:单元格地址外是中括号([]),单元格地址不能使用双引号。
  1. Sub 选取单元格A1的方法()
  2. [A1].Select
  3. End Sub

该例子表示选取单元格A1。
另外,该方式可以用来表示选取单元格区域:
  1. Sub 选取()
  2. [A1:D10].Select
  3. End Sub

表示选取A1:D10区域。
而[]之间可以使用逗号开选取不连续单元格,具体请看下例:
  1. Sub 选取()
  2. [A1:D10,H1,H10].Select
  3. End Sub

表示选取A1:D10、H1、H10等区域的单元格。
从该例子看出,[A1]的方式是最简单的写法。
15楼
yncxxmj
对vba单元格的引用讲得非常清楚,易懂。楼主继续加油。
16楼
san__mao
非常的多,易懂。谢谢楼主!
17楼
mayjay
清楚,易懂!有老师的风范!
18楼
ljx63426
清楚,易懂!
19楼
rzz8118
好贴,收藏了
20楼
wnianzhong
谢谢分享,学习了!
21楼
z305147482
22楼
高玉甫

学习了,谢谢了。
23楼
jl128
24楼
wangqilong1980
收藏慢慢学习。越学习,越发现自已的无知!
25楼
rbq555
收藏了,支持一下楼主!多谢分享!
26楼
fangjianp
还有简写方式:
  1. [A1].Select
例如:
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. [A2:A4].Select
  3. End Sub
27楼
qing33670000
谢谢楼主分享好东西,先下载来学习学习
28楼
简单
谢谢老师的精彩讲解!
29楼
benben
很好的知识,谢谢!
30楼
bensonlei
豁然开朗! 多谢分享! 收藏了!
31楼
联系谁
豁然开朗! 多谢分享! 收藏了!
32楼
我家有鹅
33楼
老糊涂
很好的资料
34楼
yeminqiang
这说的很简单易懂!


免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap