VBA之所以在Excel中能够如鱼的水,主要是因为VBA中提供了对Excel单元格操作的方法,通过这些方法,我们可以方便的对Excel的单元格内容进行读写操作以及对单元格格式进行设置。
1、常用引用单元格Range属性和Cells属性
Range属性和Cells属性是VBA中对Excel单元格操作最基础也是最常用的两种属性,但在语法、灵活性和适用场景上有所不同。这两中方法是VBA初学者入门的基础,能够熟练掌握这两种属性,就可以说半只脚已经迈进了VBA的大门。下面我们先来介绍一下这两种属性的使用方法。
Range属性是VBA中最通用、引用单元格频率最高的属性,该属性里有一个字符串的参数,可以是单个单元格、连续/不连续区域(例:Range("A1").Value,Range("A1:B10").Value),甚至是已命名的区域。如果你掌握了字符串的动态拼接,便能够实现对单元格的动态引用(例:Range("A" & i).Value)。
Cells属性适合在循环结构中使用,参数是行号和列号(数字或字母。例:Cells(1, 1).Value,Cells(1, "A").Value)。在循环中遍历行或列时效率很高。通常只能引用单个单元格,但可结合 Resize 属性引用区域。
2、快捷记号引用
在VBA中,还有一种对Evaluate方法的简写的引用方式(例:[A1].Value,[A1:B10].Value),这种方式更加简洁,但是只适用于硬编码的固定引用,不能在其中使用变量。
3、其他实用方法
除了对以上对单元格的基础引用,VBA还提供了多种更灵活的方法来引用单元格。
基于一个基准单元格进行偏移定位。例如 Range("A1").Offset(1, 0) 表示A1向下偏移一行的单元格,非常适合在循环中逐行操作。
直接引用整行或整列。例如 Rows(1) 或 Columns("A")
模拟Ctrl+方向键,从某单元格开始,沿方向跳到数据区域的边界。常用于动态查找数据区域的最后一行,如 Range("A1").End(xlDown)
代表工作表中所有已使用的单元格区域。可用于快速获取整个数据表。
返回特定类型的单元格,如常量、公式、空值等。
为单元格区域定义名称后,可直接通过 Range("MyRange") 或 [MyRange] 引用。
4、引用属性来源
在通过以上属性引用单元格时,如果属性前若未指定父对象(如 Worksheets("Sheet1")),则默认操作活动工作表(ActiveSheet),这可能导致意外错误。建议始终明确指定工作簿和工作表。以下是对引用来源的一些介绍。
Worksheets属性后面的参数为字符串,字符串内容为引用的工作表名,例如Worksheets("Sheet1")为引用工作表名为“Sheet1”的工作表对象;Worksheets("Sheet1").Range(“A1”).Value为引用工作表名为“Sheet1”里的“A1”单元格的值。
代表当前活动工作表。ActiveSheet.Range(“A1”).Value为引用当前活动工作表中的“A1”单元格的值。
代表当前活动工作表中选中的一个或多个单元格。
5、扩展学习
当需要读取大量单元格的值时,如果直接在循环中引用Range或Cells,会严重影响程序的运行效率。这时候,我们可以把单元格中的值一次性读取到内存中来(一次性将区域读入数组),在内存中处理完成后在重新赋值给展示的单元格区域。这样能避免频繁操作Excel对象,极大提升性能,加快数据的处理速度。
Dim dataArray As Variant' 将A1:B100的值一次性读入一个二维数组dataArray = Range("A1:B100").Value' 之后通过 dataArray(行号, 列号) 来访问数据。
6、总结与选择建议
固定单/多单元格:用 Range("A1") 或 [A1]。
循环遍历:用 Cells(i, j)。
动态单元格:用 Range 拼接字符串,或 Cells 配合 Offset。
大数据量:务必使用数组,这是提升效率的关键。
明确父对象:始终使用 Worksheets("Sheet1").Range("A1").Value 这类完整引用,避免操作错误工作表。
你可以根据具体的场景,选择最合适的方法来读取单元格。
长按加入office之家微信交流群
