Если RevSID
не было объявлено явно, то RevSID
в процедуре1 не будет той же переменной, что и RevSID
в процедуре2: необъявленные переменные всегда имеют локальную область видимости, поэтому назначение их в процедуре2 не повлияет назначение переменной с тем же именем в процедуре 1.
Но это не то, что здесь происходит.Поскольку RevSID
где-то объявлено , ваш поиск должен завершиться сбоем (то есть он не находит значение RevSID
в таблице поиска).
Я предложу совершенно иной подход,вместо этого используется функция и шаблон, известный как «пример попытки», где у вас есть функция, которая возвращает Boolean
и выводит результат в параметре, который передается по ссылке, который имеет осмысленное значение только тогда, когда функция возвращает True
- и так как на первый взгляд кажется, что столбец [SID]
не является самым левым в таблице (почему бы вам не пройти до Contact.Parent
в противном случае?), Я предлагаю использоватьКомбинация INDEX и MATCH для выполнения поиска - обратите внимание, как порядок столбцов становится неактуальным с этим подходом поиска.
Вот версия с ранними связями WorksheetFunction
вызовами, которые вызывают ошибку времени выполнения приошибка:
Private Function TryGetRevisionDate(ByVal SID As String, ByRef outResult As Date) As Boolean
On Error GoTo CleanFail
With Application.WorksheetFunction
Dim matchRow As Long
matchRow = .Match(SID, Contact.ListColumns("SID").DataBodyRange, 0)
Dim indexValue As Variant
indexValue = .Index(Contact.ListColumns("Last Review").DataBodyRange, matchRow)
End With
If IsDate(indexValue) Then outResult = indexValue
TryGetRevisionDate = True
CleanExit:
Exit Function
CleanFail:
'lookup failed
Resume CleanExit
End Function
И версия с поздним связыванием WorksheetFunction
вызовов, которые возвращают значение ошибки при ошибке (обратите внимание, что в параметре нетfo, и нет проверки во время компиляции с кодом с поздним связыванием, так что следите за опечатками - Option Explicit
не может спасти вас здесь):
Private Function TryGetRevisionDate(ByVal SID As String, ByRef outResult As Date) As Boolean
With Application
Dim matchRow As Variant
matchRow = .Match(SID, Contact.ListColumns("SID").DataBodyRange, 0)
If IsError(matchRow) Then Exit Function
Dim indexValue As Variant
indexValue = .Index(Contact.ListColumns("Last Review").DataBodyRange, matchRow)
If IsError(indexValue) Then Exit Function
End With
If IsDate(indexValue) Then
outResult = indexValue
TryGetRevisionDate = True
End If
End Function
Используя любую версию, ваш код вызова теперь может делатьэто:
Dim revDate As Date
If TryGetRevisionDate(RevSID, revDate) Then
MsgBox revDate
Else
MsgBox "SID '" & RevSID & "' was not found."
End If