Регулярное выражение для проверки почтовых индексов США и Канады - Ошибка выполнения 438 Excel - PullRequest
1 голос
/ 23 мая 2019

Я написал этот код, чтобы помочь с проверкой ячеек почтового индекса в нашей форме поставщика. Я хочу, чтобы он подтвердил, когда перейти к следующей ячейке. Я получаю ошибку 438 во время выполнения: объект не поддерживает это свойство или метод, когда я пытаюсь перейти к следующей ячейке. Мне нужно это для проверки всех почтовых индексов США и Канады (используется английский).

Я пытался сделать это с проверкой данных, и у меня могут быть США или Канада, но не оба.

Private Sub worksheet_selectionchange(ByVal target As Range)
    If Selection.Count = 1 Then
        'Erm, nothing to do here....
    ElseIf Not Intersect(target, Range("B39,B50")) Is Nothing Then
        Exit Sub
    End If

    Dim searchRange     As Excel.Range
    Dim cell            As Variant
    Dim RegEx           As Object

    Set RegEx = CreateObject("VBScript.RegExp")

    With RegEx
        .Pattern = "^(\d{5}(-\d{4})?|[A-CEGHJ-NPRSTVXY]\d[A-CEGHJ-NPRSTV-Z] ?\d[A-CEGHJ-NPRSTV-Z]\d)$"
        .Global = True
        .MultiLine = True
    End With

    Set searchRange = ActiveSheet.Range("B39,B50")
    For Each cell In searchRange.Cells
       If RegEx.IsMatch(subjectString, "^(\d{5}(-\d{4})?|[A-CEGHJ-NPRSTVXY]\d[A-CEGHJ-NPRSTV-Z] ?\d[A-CEGHJ-NPRSTV-Z]\d)$") Then
            MsgBox ("Valid ZIP code")
        Else
            MsgBox ("Invalid ZIP code")
        End If
    Next cell
    Set searchRange = Nothing
    Set RegEx = Nothing

End Sub

Строка отладки:

  If RegEx.IsMatch(subjectString, "^(\d{5}(-\d{4})?|[A-CEGHJ-NPRSTVXY]\d[A-CEGHJ-NPRSTV-Z] ?\d[A-CEGHJ-NPRSTV-Z]\d)$") Then

Мне все равно, пользуюсь ли я проверкой данных или VBA, мне просто нужно что-то для проверки. Пожалуйста, будьте внимательны в своих ответах. Я все еще довольно "зеленый" с VBA и Regex.

1 Ответ

0 голосов
/ 24 мая 2019

Должно работать (при условии, что шаблон в порядке):

Private Sub worksheet_selectionchange(ByVal target As Range)

    Static RegEx As Object '<<
    Dim searchRange As Range

    Set searchRange = Application.Intersect(Target, Me.Range("B39, B50"))
    If searchRange Is Nothing then Exit Sub

    'see if we need to set up the regexp object
    If RegEx Is Nothing Then
        Set RegEx = CreateObject("VBScript.RegExp")
        With RegEx
            .Pattern = "^(\d{5}(-\d{4})?|[A-CEGHJ-NPRSTVXY]\d" & _
                       "[A-CEGHJ-NPRSTV-Z] ?\d[A-CEGHJ-NPRSTV-Z]\d)$"
            .Global = True
            .MultiLine = True
        End With
    End If

    For Each cell In searchRange.Cells
        MsgBox IIf(RegEx.Test(cell.Value), "Valid", "Invalid") & " ZIP code"
    Next cell

End Sub

Редактировать: если у вас есть две вещи, которые вы хотите сделать в Worksheet_Change, то вы можете либо объединить весь свой код в одном обработчике событий,или сделайте что-то вроде этого:

Private Sub worksheet_change(ByVal target As Range)
    HandleFirstThing Target
    DoSomethingElse Target
End Sub

Sub HandleFirstThing(Target As Range)
   'first thing to handle
End Sub

Sub DoSomethingElse(Target As Range)
   'next thing to handle
End Sub
...