在VBA里使用range(cells(),cells()) ,一个容易出错的点:需要注意 range() 和cells() 前都指定好sheet名!

1 问题

在VBA里使用range(cells(),cells()) 发现处了下面这个状况

  • 当前sheet就是sh1时,代码正常运行
  • 当前sheet不是sh1时,有一行代码报错  arr3 = sh1.Range(Cells(4, 3), Cells(16, 8))
  • 为什么会这样呢?

Sub test1001()

   Dim sh1 As Object
   Set sh1 = ThisWorkbook.Worksheets("data")

   arr1 = sh1.Range("c" & 4 & ":h" & 16)
   arr2 = sh1.Range(sh1.Cells(4, 3), sh1.Cells(16, 8))
   arr3 = sh1.Range(Cells(4, 3), Cells(16, 8))

   Debug.Print "arr1(3, 3)=" & arr1(3, 3)
   Debug.Print "arr2(3, 3)=" & arr2(3, 3)
   Debug.Print "arr3(3, 3)=" & arr3(3, 3)

End Sub

 

 

2 问题原因和解决办法

2.1 出错原因时书写错误

  • 其实还是因为我的代码书写不规范导致的
  • arr3 = sh1.Range(Cells(4, 3), Cells(16, 8)) 因为这么写,VBA会去当前sheet去找,而不是指定sheet比如sh1去查找数据,就报错,除非刚好当前sheet是sh1就不报错
  • 所以以后记住  range(cells()) 前面也要指定sheet名!!
  • 所以要这么写才准确 arr2 = sh1.Range(sh1.Cells(4, 3), sh1.Cells(16, 8))

2.2 其他,为什么range() 不报错

  •  range() 因为只需要指定一次sh1.range() 所以没出错
  • sh1.Range(sh1.Cells(4, 3), sh1.Cells(16, 8)) 需要在range() 和cells() 每处都要限定好 sh1,指定是从哪个 sheet里取数据,所以这个要更小心,否则容易出错

### 回答1: VBA中,CellsRange都是用来引用单元格的对象。它们的区别在于: 1. Cells是基于行列号来引用单元格的,例如Cells(1,1)表示第1行第1列的单元格,Cells(2,3)表示第2行第3列的单元格。 2. Range是基于单元格的地址来引用单元格的,例如Range("A1")表示A列第1行的单元格,Range("C5")表示C列第5行的单元格。 3. Range还可以引用多个单元格,例如Range("A1:B3")表示A1到B3这个矩形区域的单元格。 4. CellsRange都可以用来读取或修改单元格的值、格式、公式等属性。 总的来说,Cells更适合用于循环遍历单元格的情况,而Range更适合用于引用特定的单元格或区域。 ### 回答2: 在Excel VBA中,CellsRange都是用来引用Excel中单元格的对象。它们有很多相似的地方,但也有一些重要的区别。 首先,Cells属性是用数字行列坐标来指定单元格的位置,比如Cells(1,1)代表A1单元格,Cells(2,1)代表A2单元格。则Cells(n,m)代表第n行,第m列。而Range属性则可以使用字母列坐标来指定单元格的位置,比如Range("A1")代表A1单元格,Range("B2")代表B2单元格。则Range("A" & n)代表第n行第一列,Range(chr(64+m)+1)代表第一行第m列。 同时,Cells属性比较适合在循环或打印单元格内容时使用,而且可以使用相对位置,也就是说句左侧字符是相对于当活动单元格的。比如ActiveCell.Offset(1,4).Cells代表的是当单元格下面一行的第5列单元格。而Range属性则比较适合选择单元格进行操作,比如合并单元格、设置边框等。 另外,Cells属性可以在单元格上进行一些简单的操作,比如设置单元格的值、颜色等属性。而Range属性则更适合对单元格范围进行操作,比如在多个单元格上设置相同的属性或公式。可以说在对单个单元格进行操作时,可以使用Cells属性来方便快捷地完成,而对于多个单元格的操作,Range属性则更加灵活方便。 总之,CellsRange都是Excel VBA中经常用到的对象,它们在引用单元格时各有优缺需要根据实际需求选择合适的对象。 ### 回答3: 在VBA中,CellsRange都是用于引用单元格或单元格区域的对象。虽然它们有一些相似之处,但它们也有一些重要的区别。 Cells一个单元格的方法,可以通过指定行号和列号来引用单个单元格。比如,Cells(3, 2)代表的是第3行第2列的单元格。Cells可以使用数字或变量作为参数,这使得它非常灵活。此外,它可以用在for循环中,来遍历一个区域中的每一个单元格。 Range一个单元格区域的对象,可以通过指定左上角和右下角单元格的地址来引用一组单元格。比如,Range("A1:C3")代表从A1到C3的单元格区域。Range可以用字符串或变量作为参数,因此也非常灵活。与Cells不同,Range通常用于处理大的单元格区域,如表格的列或行。 尽管CellsRange都可以用于引用单元格,但它们的使用场景有所不同。Cells更适用于处理单个单元格,它可以在代码中直接指定行号和列号,因此更加快捷。Range更适用于处理一组单元格,如表格与单元格之间的数据交互等,这种情况下Range的优势更加明显。 总之,在编写VBA代码时,需要根据具体业务场景来选择使用Cells还是Range对象,以达到更好的效果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值