在VBA中,如何从该语句中访问With语句的主题?

时间:2019-01-22 16:42:35

标签: excel vba

我正在研究一种更快的方法,以一些先前编写的代码循环遍历表中的一列。我的问题是,在某个时候,我需要根据范围和附近单元格的值,将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属性通过工作表分配范围,但目前我真的很想找到一种更直接的方法。

1 个答案:

答案 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