我正在研究一种更快的方法,以一些先前编写的代码循环遍历表中的一列。我的问题是,在某个时候,我需要根据范围和附近单元格的值,将With语句的主题(单个单元格范围)分配给一系列范围。
我已经剪裁了代码,只取了解决问题所需的那些位。见下文:
Dim wb As Workbook
Dim wsFit As Worksheet
Dim fittingsTable As ListObject
ReDim fittings(0) As Range
Dim x As Integer
Dim y As Integer
Set wb = ActiveWorkbook
Set wsFit = wb.Worksheets("Fittings")
Set fittingsTable = wsFit.ListObjects("FittingsTable")
For x = 1 To fittingsTable.DataBodyRange.Rows.Count
With fittingsTable.DataBodyRange(x, 15)
If .Value <> vbNullString And .Value <> "0" Then
If .Offset(0, -2).Value <> "TBC" Then
'Do some stuff
Set fittings(y) = 'PROBLEM HERE
Else
'Do other stuff here
End If
End If
End With
Next
我想将fittingsTable.DataBodyRange(x,15)分配给fittings(y),但是我不知道如何访问With语句的主题范围。
我知道我可以在With语句开始之前将所需范围分配给另一个变量,然后将该变量分配给Fittings(y),但是我觉得必须有一种简单的方法来访问对象的初始主题。 With语句,这样我就不会最终用更多变量阻塞代码。我还可以使用.Address属性通过工作表分配范围,但目前我真的很想找到一种更直接的方法。
答案 0 :(得分:2)
您的With
块保存着一个Range
对象引用。
您可以使用.Cells
(无参数)属性来检索对该Range
对象的引用:
Set fittings(y) = .Cells
或者,更明确地说,它是一个单细胞范围:
Set fittings(y) = .Cells(1, 1)
这将进行隐式默认成员调用,最终最终等同于:
Set fittings(y) = .Item(1, 1)
适用于Range
。对于许多其他类,没有属性返回对对象的引用。例如,Collection
:
With New Collection
.Add 42
Set foo = ???? ' can't get a reference to the Collection object!
End With
一般的解决方案是将With
块变量提取到局部变量中,现在可以像访问其他任何局部变量一样访问该变量了:
Dim c As Collection
Set c = New Collection
With c
.Add 42
Set foo = c
End With
对于您控制的自定义类,您可以使用一个属性获取器,该返回器返回Me
:
Public Property Get Self() As Class1
Set Self = Me
End Property
现在可以通过该属性访问With
块变量:
With New Class1
.Something = 42
Set foo = .Self
End With