Cómo quitar el ÚLTIMO conjunto de Paréntesis de un Excel cadena de texto que contiene sólo numérico s

Tengo una hoja de cálculo de excel con más de 50.000 entradas. Las entradas tienen un nombre y una dirección y, a veces, un número de teléfono a TODOS en la misma cadena. Me estoy centrando en el número de teléfono de la parte de la cadena que está siempre al final y entre paréntesis. He estado tratando de utilizar código VBA para abordar esta cuestión. Cómo quitar el ÚLTIMO conjunto de Paréntesis de un Excel cadena de texto que contiene sólo numérico s entre los paréntesis. En cualquier cadena de texto no puede ser SIN paréntesis o varios paréntesis pero solo quiero quitar ese ÚLTIMO set y dejar los números que figuran en la cadena de

Ejemplo de cadena "Tono Carkeet J., agt.,Alianza De Aseguramiento De La Co. Ltd. (De previsión social de la Vida de rama), 3 San Andrés san. (1936)" yo he intentado usar VBScript.RegExp para definir "(1936)", pero no puedo conseguir el RegExp para que coincida con la cadena y sustituir los paréntesis () con "".

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

2 Respuestas

  • user11450033
    4 de mayo de 2019

    Aquí hay dos rápidas funciones definidas por el usuario que no se basan en expresiones regulares. La primera utiliza VBA del StrReverse y la segunda 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
    

    Si usted no desea utilizar Udf, solo escoge la lógica del método que prefiera y adaptarlo para sus propios fines.

    Aquí uno más con la expresión regular a Sustituir.

    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
    
  • Ron Rosenfeld
    4 de mayo de 2019

    He aquí un ejemplo de uso de una lógica similar a la suya. He cambiado los nombres de las variables de rango, ya que no es una buena idea utilizar las palabras clave para las variables con nombre, incluso si el editor lo permite.

    En lugar de simplemente eliminar los paréntesis, hemos partido de la totalidad de la (nnnn) subcadena con los números dentro de un grupo de captura y, a continuación, reemplace el partido con el grupo capturado.

    Desde Reemplazar a no hacer nada si no hay partido, no hay necesidad de prueba.

    También, tenga en cuenta que tenemos el regEx FUERA del bucle.

    With regEx
        .Pattern = "\((\d+)\)"
        .Global = False
    End With
    
    For Each myCell In myRange
        myCell = regEx.Replace(myCell, "$1")
    Next myCell
    

    Si es necesario debido a otros subcadenas con el mismo patrón, se puede modificar el patrón para asegurarse de que está al final de la línea, o que es el último patrón de ese tipo en la cadena.