BigBen в значительной степени ответили на ваш вопрос об использовании #
с оператором Like
, поэтому я не буду вдаваться в подробности. Но я заметил, что вы использовали много операторов Like в своем операторе If, поэтому я решил, что воспользуюсь возможностью поделиться функцией, которую я создал некоторое время назад, и использовать ее часто.
Цель этой функции - уменьшить количество операторов Like
при сравнении с одним значением. Хотя эта функция не решает вашу конкретную проблему, она может оказаться полезной в будущем.
Function OrLike(ByVal compareVar As Variant, ParamArray CompareArgs() As Variant) As Boolean
Dim i As Long
If IsArray(CompareArgs(0)) Then
For i = LBound(CompareArgs(0)) To UBound(CompareArgs(0))
If compareVar Like CompareArgs(0)(i) Then
OrLike = True
Exit Function
End If
Next
Else
For i = LBound(CompareArgs) To UBound(CompareArgs)
If compareVar Like CStr(CompareArgs(i)) Then
OrLike = True
Exit Function
End If
Next i
End If
End Function
Сначала функция проверяет первое значение, используемое в CompareArgs
. Если это значение является массивом, оно сравнивается с массивом, в противном случае будет использовано ключевое слово ParamArray
. Это позволяет использовать эту функцию двумя способами:
С переменной Array в качестве аргументов
Dim Arr() As Variant
Arr = Array("Blah*", "Blah2*")
If Orlike("BlahBlah", Arr) Then
' . . .
End If
Использование ParamArray
If OrLike("BlahBlah", "Blah*", "Blah2*") Then
' . . .
End If
Очевидно, вы не хотите использовать свое текущее заявление If, которое вы предоставили. Но если вы в качестве примера, посмотрите, как эта функция упрощает ваше утверждение и значительно улучшает читабельность, повернув это:
ElseIf LastName Like "*1*" Or LastName Like "*2*" Or LastName Like "*3*" Or LastName Like "*4*" _
Or LastName Like "*5*" Or LastName Like "*6*" Or LastName Like "*7*" _
Or LastName Like "*8*" Or LastName Like "*9*" Or LastName Like "*0*" Then
В это:
ElseIf OrLike(LastName, "*1*", "*2*", "*3*", "*4*", "*5*", "*6*", "*7*", "*8*", "*9*", "*0*") Then
Это не только улучшает читаемость, но и может фактически повысить производительность. Проблема с операторами VBA If...Then
состоит в том, что все в строке должно быть оценено, даже после оператора, который возвращает True
.
Эта функция принимает все эти аргументы и оценивает каждое утверждение до тех пор, пока один из них не станет True
, а затем немедленно выходит из функции - игнорируя оставшиеся аргументы.