我有很多格式非常相似的表格;桌子周围有相同的标题和大量的绒毛。
我想编写代码,可以以相同的方式更改每个工作表中表格中的某些单元格。这些表可以更改,因此每次运行此例程时,感兴趣的范围可能会有所不同。像这样:
Sub Testing()
Dim WS As Worksheet
Dim WantedRange As Range
'This range could be anything.
Set WantedRange = Cells(5, 5)
For Each WS In Application.ThisWorkbook.Sheets
'Do stuff with WS.WantedRange
Debug.Print WS.WantedRange
Next WS
End Sub
问题是,Debug.Print WS.WantedRange
会引发Compile error: method or data member not found.
为什么是这样? WantedRange
未分配父工作表,因此它应该只是一个范围,它是工作表对象支持的属性。
如果该行被Debug.Print WS.Range(WantedRange.Address)
替换,则一切正常。我的问题在于它失败了使用另一个变量存储范围的目的,以便于阅读和提高效率。我也可以存储表示列和行索引的整数,然后编写WS.Cells(WantedRowIndex, WantedColumnIndex)
。
有更好的方法吗?
感谢Scott Cramer,即使未指定,也始终使用工作表初始化范围。那么有没有一种方法可以在没有初始化工作表的情况下制作类似范围的对象?
答案 0 :(得分:0)
初始化范围对象时,会使用工作表初始化它。您实例中的此工作表是活动工作表。
因此通过添加WS。在前面就像是说:
Sheets("Sheet1").Sheets("Sheet2").Cells(5,5)
每次都会抛出一个错误。
WS.Range(WantedRange.Address)
使用范围对象时,是正确的。
您可以改为使用字符串:
WantedRange = Cells(5, 5).Address
或只是
WantedRange = "E5"
然后使用
WS.Range(WantedRange)
如果你有很多范围要做同样的事情,那么创建一个字符串数组然后遍历它们:
Dim StrArr() as String, i&
StrArr = Array("E5","B16","A1:A10")
For i = lBound(StrArr) to uBound(StrArr)
'Do Stuff with WS.Range(StrArr(i))
Next i