Как удалить последние скобки LAST из текстовой строки Excel, которая содержит только числовые значения - PullRequest
0 голосов
/ 04 мая 2019

У меня есть таблица Excel с более чем 50 000 записей.Записи имеют имя и адрес, а иногда и номер телефона ВСЕ в той же строке.Я концентрируюсь на части телефонного номера строки, которая всегда в конце и заключена в скобки.Я пытался использовать код VBA для решения этой проблемы.Как удалить последние скобки LAST из текстовой строки Excel, которая содержит только цифры s в скобках.В любой заданной строке может быть либо НЕТ скобок, либо несколько скобок, но я хочу только удалить этот набор LAST и оставить содержащиеся в нем числа в строке

Пример строки "Toone Carkeet J., agt., Alliance AssuranceCo. Ltd. (филиал Provident Life), ул. Сент-Эндрю, 3 (1936) «Я пытался использовать VBScript.RegExp для определения» (1936) », но не могу получить RegExp для соответствия строке и замены скобок() с "".

For Each Cell In Range
    If strPattern<> "" Then
        strInput = Cell
        With regEx
            .Pattern="\(([0-9]))*)"
            .Global=False
        End With
        If .Pattern= True Then
            Replace(Cell.Value, "(","")
        End If

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Вот две быстрые пользовательские функции, которые не зависят от регулярных выражений.Первый использует VBA StrReverse, а второй InStrRev.

Function RemoveParens1(str As String)

    str = StrReverse(str)

    str = Replace(str, "(", vbNullString, 1, 1)
    str = Replace(str, ")", vbNullString, 1, 1)

    RemoveParens1 = StrReverse(str)

End Function

Function RemoveParens2(str As String)

    Dim o As Integer, c As Integer

    o = InStrRev(str, "(")
    c = InStrRev(str, ")")

    str = Left(str, c - 1) & Mid(str, c + 1)
    str = Left(str, o - 1) & Mid(str, o + 1)

    RemoveParens2 = str

End Function

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

Вот еще один пример использования Replace регулярного выражения.

Function RemoveParens3(str As String)

    Static rgx As Object, cmat As Object, tmp As String

    If rgx Is Nothing Then Set rgx = CreateObject("vbscript.regexp")

    With rgx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = "\([0-9]*\)"

        If .test(str) Then
            Set cmat = .Execute(str)
            tmp = cmat.Item(cmat.Count - 1)
            tmp = Mid(tmp, 2, Len(tmp) - 2)
            str = .Replace(str, tmp)
        End If
    End With

    RemoveParens3 = str

End Function
0 голосов
/ 04 мая 2019
Dim x, y, z As Long
x = 2 'ASSUMING YOUR DATA START AT RANGE A2
With Sheet1
Do While .Cells(x, 1).Value <> ""
    If Right(.Cells(x, 1).Value, 1) = ")" Then
        .Cells(x, 1).Value = Replace(.Cells(x, 1).Value, ")", "")
        z = VBA.Len(.Cells(x, 1).Value)
        For y = z To 1 Step -1
            If Mid(.Cells(x, 1).Value, y, 1) = "(" Then
                .Cells(x, 1).Value = Replace(.Cells(x, 1).Value, "(", "")
                Exit For
            End If
        Next y

        x = x + 1
    End If
Loop
End With
0 голосов
/ 04 мая 2019

Вот пример использования логики, аналогичной вашей.Я изменил имена переменных диапазона, так как не рекомендуется использовать ключевые слова для именованных переменных, даже если редактор разрешит это.

Вместо того, чтобы просто удалять скобки, мы сопоставляем все (nnnn)подстрока с номерами внутри группы захвата, а затем замените это совпадение только на захваченную группу.

Поскольку Replace ничего не сделает, если нет совпадений, проверять не нужно.

Кроме того, обратите внимание, что мы установили regEx вне цикла.

With regEx
    .Pattern = "\((\d+)\)"
    .Global = False
End With

For Each myCell In myRange
    myCell = regEx.Replace(myCell, "$1")
Next myCell

При необходимости из-за других подстрок с таким же шаблоном, вы можете изменить шаблон, чтобы совпадение было в концеили что это последний шаблон этого типа в строке.

Например:

  • Подстрока в конце строки

\((\d+)\)$
  • Подстрока последнего

\((\d+)\)(?!.*\(\d+\))

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

...