Поиск строки VBA содержит число - PullRequest
0 голосов
/ 30 апреля 2019

Я проверяю качество данных в большом столбце строк (например, Фамилия) и хочу узнать, содержат ли они число.

Код VBA, который я пробовал до сих пор, должен быть прямым: если поле LastName содержит 1 или 2 (и т. Д.), Чем ReasonCode = 3. Позже, если ReasonCode = 3, результаты выдаются "Содержит число "

Однако в таких ситуациях, как «Маршалл», он по-прежнему заполняется «Содержит число»

ElseIf LastName Like "*#*" Or FirstName Like "*#*" Then

ReasonCode = 3

End If

ElseIf ReasonCode = 3 Then

    Cells(RowT, 16).Value = "Contains a number"

ReasonCode = 0

End If

1 Ответ

2 голосов
/ 01 мая 2019

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, а затем немедленно выходит из функции - игнорируя оставшиеся аргументы.

...