2011-05-04 8 views
6

Necesito reemplazar algo en una cadena, pero qué reemplazar puede variar. Puede serReemplazar cadena variable en VBA

XY - test 
XXxY-test 
XXyyXx-TEST 
yXyy  -Test 

y prácticamente cualquier otra combinación de espacios en blanco y casos de los anteriores.

Necesito reemplazar la parte "prueba" y dejar solo el "XXX". Por lo tanto, cuando se utiliza un sencillo reemplazar

Replace("XXX -test", "- test", "") 

No va a funcionar, obviamente. Entonces necesito una versión más sofisticada de Replace que pueda manejar esta tarea. ¿Hay algo que pueda usar o tengo que escribir por mi cuenta?

+1

expresiones regulares ([ver esto ] (http://www.vbforums.com/showthread.php?t=480272)) puede funcionar para usted. No estoy seguro de cómo se vería su cadena de patrones, pero hay muchos sitios para escribirlos. – jonsca

Respuesta

8

Si necesita más flexibilidad que la proporcionada por el método de mj82 (por ejemplo, puede que no conozca la duración de la expresión inicial), puede usar una expresión regular. Por ejemplo:

Regex.Replace("XXX -test", "\s*-\s*test", "", RegexOptions.IgnoreCase) 
+2

Estoy tratando de usar su función y estoy recibiendo un error de objeto no existe. Cuando agrego un reloj para "Regex", dice que el objeto está vacío. ¿Alguna idea de por qué está pasando esto? ¿Debo cargar una biblioteca? Estoy en Excel 2010 –

+0

Necesita agregar 'Expresiones regulares de Microsoft VBScript' a sus referencias (la versión actual es, creo, 5.5), luego declare la variable usando:' Dim Regex como Nueva Regexp'. – Toast

1

Si XXX es el primero, puede usar las letras Left Left (string; 3) tu corte 3 (o cualquier longitud que necesite) del lado izquierdo, entonces no importa lo que le sigue.

+0

Bien, olvidé aclarar eso en la pregunta. XXX también es variable de cualquier carácter (incluso incluyendo "prueba" y similares) –

+0

Si puede cortar hasta el signo "-" (y no puede estar en la expresión XXX), esto puede ayudar: Izquierda (mystr, InStr (mystr, "-") - 1), corta todas las letras hasta la primera aparición de "-". De lo contrario, Regex es la mejor solución. – mj82

8

Esto es para complementar la respuesta de eggyal. Esta es una función de regexreplace de VBA para que pueda usar su respuesta. Se dará cuenta añadí ignore_case como una opción de flexibilidad, por lo que su llamada sería:

=RegexReplace(cell, "\s*-\s*test", "", TRUE) 

Aquí es la función, espero que les sea útil:

' ------------------------------------------------------------------- 
' Search and Replace using a regular expression 
' ------------------------------------------------------------------- 

Function RegexReplace(ByVal text As String, _ 
         ByVal replace_what As String, _ 
         ByVal replace_with As String, _ 
         Optional ByVal ignore_case As Boolean = False) As String 

Dim RE As Object 
Set RE = CreateObject("vbscript.regexp") 

RE.ignorecase = ignore_case 
RE.pattern = replace_what 
RE.Global = True 
RegexReplace = RE.Replace(text, replace_with) 

End Function