Найти диапазон ячеек на основе двух критериев - PullRequest
0 голосов
/ 29 октября 2018

Я собрал несколько VBA, чтобы найти последнюю строку с определенным критерием, который соответствует текущему значению в моем цикле, а затем предпринять действия. Этот код VBA работает до тех пор, пока я не понял, что рабочая таблица может содержать совпадающее значение несколько раз, но с разными датами в другом столбце. Поэтому я сейчас пытаюсь добавить второй критерий поиска в свой VBA.

Вот фрагмент кода VBA на данный момент.

   For Each t In trans.Cells
            On Error GoTo NxtT2
                If t.Value = Empty Then
                On Error GoTo 0
                    ty = t.Offset(0, -3).Value
                    tx = t.Offset(0, -6).Value
                    Set searchTerm = .Range("E:E")
                    Set where = searchTerm.Find(what:=ty, after:=searchTerm(1), searchdirection:=xlPrevious)
                        If t.Offset(0, -3).Value = where.Value And IsError(where.Offset(0, 3).Value) Then
                            t.Value = "#N/A"
                        End If
                End If

NxtT:
    On Error GoTo 0
    If t.Offset(1, -3).Value = "" Then Exit For
    Next t

NxtT2:
    Resume NxtT

По сути, я пытаюсь сделать так, чтобы строка Set where = searchTerm.Find(what:=ty, after:=searchTerm(1), searchdirection:=xlPrevious) также включала значение tx вместе с ty, которое уже там.

Примерно так, если возможно?

Set where = searchTerm.Find(what:=ty & tx, after:=searchTerm(1), searchdirection:=xlPrevious)

Но я знаю, что это неправильный синтаксис для него.

Какой-нибудь совет, как подойти к этому проще всего?

1 Ответ

0 голосов
/ 29 октября 2018

Не ответ на первоначальный вопрос, но на проблему, которую я создал с помощью своего обзора кода.

Ваша обработка ошибок никогда не завершается должным образом. Код все еще думал, что он был в обработчике ошибок, потому что вы «вышли» из обработчика ошибок с помощью Next, чего вы действительно не можете сделать - вам нужно оставить этот «экземпляр» обработки ошибок с помощью Resume.

Вместо этого сделайте снимок для очищенной обработки ошибок.

ПРИМЕЧАНИЕ: я объявил переменные, потому что у меня есть набор Option Explicit, который вы также должны иметь. Я сделал дерзкое предположение, что ваши переменные объявлены вне кода, которым вы поделились. Используйте переменные так, как вы их объявили, а не как мои быстрые исправления Variant объявлений.

Sub foo()
  Dim t As Variant
  Dim ty As Variant
  Dim tx As Variant
  For Each t In Cells
    On Error GoTo ErrorHandler
    If t.Value = Empty Then
      On Error GoTo 0
      ty = t.Offset(0, -3).Value
      tx = t.Offset(0, -6).Value
      Dim searchterm As Range
      Set searchterm = .Range("E:E")
      Dim where As Range
      Set where = searchterm.Find(what:=ty, after:=searchterm(1), SearchDirection:=xlPrevious)
      If t.Offset(0, -3).Value = where.Value And IsError(where.Offset(0, 3).Value) Then
        t.Value = "#N/A"
      End If
    End If

Continue:
  Next 

CleanExit:
  Exit Sub

ErrorHandler:
    If t.Offset(1, -3).Value = "" Then
      Resume CleanExit
    Else
      Resume Continue
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...