【问题标题】:Apply a range object to different worksheets?将范围对象应用于不同的工作表?
【发布时间】:2016-04-09 00:24:54
【问题描述】:

我有很多格式非常相似的表格;表头相同,周围有很多绒毛。

我想编写代码,以相同的方式更改每张工作表中表格中的某些单元格。这些表可以更改,因此每次运行此例程时感兴趣的范围可能会有所不同。像这样的:

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)

有没有更好的办法?

编辑 1:

感谢 Scott Cramer,即使未指定范围,也始终使用工作表初始化范围。那么有没有办法在没有初始化工作表的情况下制作类似范围的对象?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    当初始化范围对象时,它会使用工作表进行初始化。您实例中的此工作表是活动工作表。

    因此通过添加 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
    

    【讨论】:

    • 是有道理的,但必须有一种方法来处理这个问题,而不需要使用像字符串这样的“硬”数据类型,这样每次都需要写入Range(WantedRange)。是否可以创建一个具有范围的所有属性和方法但没有内部指定工作表的新类?
    • 对我来说,这比简单地使用WS.Range(WantedRange.Address) @BillyMatsumoto 更有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多