Я пытаюсь очистить некоторые адреса. У меня уже есть код, чтобы изменить «Sw», «Ne» и использовать их с большой буквы.

Тем не менее, я хотел бы добавить еще один шаг для привязки порядковых номеров к сельским адресам в том же коде, если это возможно.

Все адреса, которые мне нужно обновить, начинаются с 5 цифр, затем пробел, затем 3 цифры. "ННННН ННН"

У меня есть некоторый код для добавления ординалов, мне просто нужен способ добавить его только к этим 3 числам после 5. Например, с «56579 123» по «56579 123rd» и оставить остальную часть адреса в покое.

Вот мой текущий код.

Public Function TidyUp(sin As String) As String
    Dim i As Long
    arr = Split(sin, " ")
    For i = LBound(arr) To UBound(arr)

        If UCase(arr(i)) = "NE" Then arr(i) = "NE"
        If UCase(arr(i)) = "NW" Then arr(i) = "NW"
        If UCase(arr(i)) = "SE" Then arr(i) = "SE"
        If UCase(arr(i)) = "SW" Then arr(i) = "SW"

    Next i
    TidyUp = Join(arr, " ")
End Function

Вот порядковая функция, но она работает, только если у меня есть одно число в ячейке.

Function AddOrdinal(Address As String) As String

Select Case CLng(VBA.Right(Address, 1))
    Case 1
    AddOrdinal = Address & "st"
    Case 2
    AddOrdinal = Address & "nd"
    Case 3
    AddOrdinal = Address & "rd"
    Case Else
    AddOrdinal = Address & "th"
End Select
Select Case VBA.CLng(VBA.Right(Address, 2))
    Case 11, 12, 13
    AddOrdinal = Address & "th"
End Select
End Function

Это в основном то, чего я хочу достичь.

Address List        Expected Output
12345 673 Ave       12345 673rd Ave
213 N Apple St      213 N Apple St
69818 221st Rd      69818 221st Rd
569 Sw Maple Dr     569 SW Maple Dr
10005 654 Dr        10005 654th Dr
369 Ne Banana St    369 NE Banana St
54489 412th St      54489 412th St
986 W Timber St     986 W Timber St
79532 771 Dr        79532 771st Dr
126 E Washington Ave126 E Washington Ave
56898 422 Dr        56898 422nd Dr
0
SkysLastChance 30 Май 2019 в 18:07

2 ответа

Лучший ответ

Вы можете присоединиться к двум:

Public Function TidyUp(sin As String) As String
    Dim i As Long
    arr = Split(sin, " ")
    For i = LBound(arr) To UBound(arr)

        If UCase(arr(i)) = "NE" Then arr(i) = "NE"
        If UCase(arr(i)) = "NW" Then arr(i) = "NW"
        If UCase(arr(i)) = "SE" Then arr(i) = "SE"
        If UCase(arr(i)) = "SW" Then arr(i) = "SW"
        If IsNumeric(arr(i)) And i > 0 Then
            Dim temp As String
            Select Case CLng(Right(arr(i), 1))
                Case 1
                temp = arr(i) & "st"
                Case 2
                temp = arr(i) & "nd"
                Case 3
                temp = arr(i) & "rd"
                Case Else
                temp = arr(i) & "th"
            End Select
            Select Case CLng(Right(arr(i), 2))
                Case 11, 12, 13
                temp = arr(i) & "th"
            End Select
            arr(i) = temp
        End If

    Next i
    TidyUp = Join(arr, " ")
End Function

enter image description here

2
Scott Craner 30 Май 2019 в 15:49

Вы можете использовать функцию TidyUp для обработки второй "числовой" подстроки (если есть)

Public Function TidyUp(sin As String) As String
    Dim i As Long, arr
    arr = Split(sin, " ")
    For i = LBound(arr) To UBound(arr)

        Select Case UCase(arr(i))
            Case "NE", "NW", "SE", "SW"
                arr(i) = UCase(arr(i))
        End Select

        If i = 1 Then ' check 2nd substring
            If IsNumeric(arr(i)) Then arr(i) = AddOrdinal(CStr(arr(i))) 'if it's a "numeric" substring then have it processed by AddOrdinal() function
        End If

    Next

    TidyUp = Join(arr, " ")
End Function
2
DisplayName 30 Май 2019 в 15:44