В VBA как получить доступ к теме оператора With из этого оператора? - PullRequest
0 голосов
/ 22 января 2019

Я работаю над более быстрым способом циклического перебора столбца в таблице в некотором ранее написанном коде.Проблема, с которой я столкнулся, заключается в том, что в какой-то момент мне нужно назначить тему оператора 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

Я хочу назначить FittingTable.DataBodyRange (x, 15) для фитингов (y), но я не знаю, как получить доступ к диапазону, который является предметом оператора With.

Я знаю, что мог бы присвоить желаемый диапазон другой переменной до начала оператора With, а затем вместо этого присвоить эту переменную фитингам (y), но я чувствую, что должен быть простой способ доступа к исходнойтема утверждения With, чтобы я не засорял свой код еще большим количеством переменных.Я также мог бы использовать свойство .Address, чтобы назначить диапазон с помощью рабочего листа, но на данный момент мне действительно любопытно найти более прямой путь.

1 Ответ

0 голосов
/ 22 января 2019

Ваш блок 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...