Quitar espacio en blanco de una cadena de caracteres y números
Tengo la siguiente cadena:
3 New Vo... Healthy No No 29 GB 18 GB 37,93
Y tengo hecha una macro para que me separe el texto (esta cadena está dentro de un texto) por espacios, entonces cuando paso la macro me separa todo el texto bien menos esta cadena que me descuadra todas columnas. Como quiero que me quede es así:
3 NewVo... Healthy No No 29 GB 18 GB 37,93
Todo separado como está menos el espacio que hay entre New Vo..., mi pregunta es:
¿Hay alguna manera de quitar automáticamente ese espacio en concreto antes de separar el texto? Así cuándo pase la macro para separar el texto me lo separe todo bien y no me ponga "New" en una columna y "Vo..." en otra.
1 Respuesta
.16.01.17
Buenas, Alberto
Podrás usar la siguiente fórmula que quita el primer espacio que encuentre, respetando todos los demas. Asumiendo que estuviere en A2, coloca en otra celda, la siguiente fórmula:
=SUSTITUIR(A2;" ";"";1)
[Considera si usas comas o punto y coma para separar argumentos de las funciones. Yo usé ";"]
Asígnale el formato deseado y, luego, copia esta celda y pégala en las restantes de esta misma columna,
Eventualmente, luego podrás aplicar la macro sobre esta columna o puedes copiarla y pegarla como valor sobre la original.
.
¡Muchísimas Gracias!
Voy a probar lo que me dices, lo que tengo que mirar como lo meto en la macro. Lo único que estoy pensando es que no es el primer espacio el que quiero quitar, es otro número ¿El número de espacio a quitar lo puedo regular con el número de la izquierda? Un saludo!
Perdón me he confundido quería decir:
¿El número de espacio a quitar lo puedo regular con el número de la derecha? Un saludo
.
Correcto, Alberto,
El cuarto argumento de la fórmula indica qué ocurrencia tomar.
Ejemplo:
Eventualmente puedes usar esta subrutina que quita el espacio que le indiques a un listado.
Puedes correrla primero o integrarla a tu procedimiento actual:
Sub quitaEspacioN() Inicelda = "A2" ' primera celda de rango a modificar pos = 2 ' ordinal del espacio a quitar ' UltFila = Range(Left(Inicelda, 1) & Rows.Count).End(xlUp).Row For Fila = 0 To UltFila If Len(Range(Inicelda).Offset(Fila).Value) Then On Error Resume Next Range(Inicelda). Offset(Fila).Value = Application. WorksheetFunction. Substitute(Range(Inicelda). Offset(Fila).Value, " ", "", pos) Err.Clear On Error GoTo 0 End If Next End Sub
Espero que te sea de ayuda.
Un abrazo
Fer
.
Buenos días Fer:
He probado el código y funciona perfecto! Pero me ha salido un problema (he adaptado el código para que me busque el patrón en el que quiero quitar el espacio), el espacio me lo quita perfecto en el patrón que le digo, pero no se por que, también me quita espacio en otra fila que no tiene que ver nada con el patrón que le meto (y no se porque pasa esto, por que le pongo que no quite el espacio sino que me pinte la celda y solo pinta la del patrón, pero si le pongo el código de quitar el espacio es cuándo me quita también el espacio de la fila que no tiene patrón) te paso el código y los patrones que me modifica haber si lo solucionamos.
Patrón en el que tiene que quitar el espacio (lo hace perfecto):
3 New Vo... Healthy
Patrón en el que no tiene que quitar el espacio y lo quita (no se por que):
7 vol_me... Healthy
6 vol_logs Healthy
Un abrazo y muchas gracias por la ayuda.
Alberto
Perdona Fer que me he dejado de ponerte el código:
Sub quitaEspacioN()
Dim Celda As Range
Dim PALABRA As String
PALABRA = "*" & "3 New Vo... Healthy??????" & "*"
For Each Celda In Range("A1:A999")
If Celda.Value Like PALABRA Then
Celda.Interior.ColorIndex = 35
Inicelda = "A1" ' primera celda de rango a modificar
pos = 10 ' ordinal del espacio a quitar
UltFila = Range(Left(Inicelda, 1) & Rows.Count).End(xlUp).Row
For Fila = 0 To UltFila
If Len(Range(Inicelda).Offset(Fila).Value) Then
On Error Resume Next
Range(Inicelda).Offset(Fila).Value = Application.WorksheetFunction.Substitute(Range(Inicelda).Offset(Fila).Value, " ", "", pos)
Err.Clear
On Error GoTo 0
End If
Next
End If
Next
End sub
.
Hola, Alberto
En tu código noté una redundancia.
Hay dos ciclos For... next
En la rutina que te sugerí, estaba previsto que revisara todas las filas que encontrara en un rango hasta la útlima con dato.
Luego vi que las variables iniciales estaban dentro de ese bucle, lo cual no es necesario.
Por lo tanto, prueba con esta versión modificada:
Sub quitaEspacioN() Dim Celda As Range Dim PALABRA As String Inicelda = "A1" ' primera celda de rango a modificar pos = 10 ' ordinal del espacio a quitar PALABRA = "*" & "3 New Vo... Healthy??????" & "*" UltFila = Range(Left(Inicelda, 1) & Rows.Count).End(xlUp).Row 'For Each Celda In Range("A1:A999") <---- REDUNDANTE For Fila = 0 To UltFila If Range(Inicelda).Offset(Fila).Value Like PALABRA Then Range(Inicelda).Offset(Fila).Interior.ColorIndex = 35 On Error Resume Next Range(Inicelda). Offset(Fila).Value = Application. WorksheetFunction. Substitute(Range(Inicelda). Offset(Fila).Value, " ", "", pos) Err.Clear On Error GoTo 0 End If Next End Sub
Espero que funcione como necesitas.
Un abrazo
Fer
¡Muchas Gracias!
Buenas tardes Fer:
Aacabo de probar el código que me pasaste, pero no me quita ningun espacio. He estado haciendo alguna prueba y no he podido encontrar solución... Siempre me quita el espacio como te dije antes (en los dos sitios), es como si no buscara bien el patrón.
Un abrazo
Alberto
.
Buenas, Alberto
Entiendo que el problema puede ser con la cantidad de espacios que está evitando (10!) O porque la escritura de lo que guardas en PALABRA tenga alguna diferencia (por ejemplo mayúsculas o espacios.
Si crees que no es por alguna de esas razones, puedes probar con esta variante del código:
Sub quitaEspacioN() Dim Celda As Range Dim PALABRA As String Inicelda = "A1" ' primera celda de rango a modificar pos = 10 ' ordinal del espacio a quitar PALABRA = "3 New Vo... Healthy??????" UltFila = Range(Left(Inicelda, 1) & Rows.Count).End(xlUp).Row For Fila = 0 To UltFila If InStr(1, Range(Inicelda).Offset(Fila).Value, PALABRA) Then Range(Inicelda).Offset(Fila).Interior.ColorIndex = 35 On Error Resume Next Range(Inicelda). Offset(Fila).Value = Application. WorksheetFunction. Substitute(Range(Inicelda). Offset(Fila).Value, " ", "", pos) Err.Clear On Error GoTo 0 End If Next End Sub
Como verás en este caso, no son necesarios los asteriscos, pues la función evalúa VERDADERO cuando encuentre parcialmente lo que tengas como PALABRA dentro del texto de cada celda.
Espero que ayude a resolverlo.
Un abrazo
Fer
.
¡Muchas Gracias!
Buenos días Fer:
Ahora no puedo probar el código que me pasas, pero lo pruebo en cuanto pueda y te digo. Gracias por toda la ayuda que me estás prestando.
Un abrazo
Alberto
.
Ok, Alberto
Espero que te funcione.
Alternativamente prueba dejar al variable PALABRA como sigue:
PALABRA = "3 New Vo... Healthy"
es decir, SIN los signos de pregunta
La función SUSTITUIR que te sugerí y que está incluida en la rutina funciona como te expliqué: Quitará el 10 espacio en blanco si lo encuentra, para lo cual primero debe encontrar lo incluido en la variable.
Digo, porque noté que hiciste nuevamente esa consulta (Y obtuviste -de otro experto- la misma respuesta)
Un abrazo
Fer
.
¡Muchas Gracias!
Vale perfecto voy a hacer las pruebas que me dices y te comento. Gracias por preocuparte y ser tan rápido en tus respuestas!
Un abrazo
Alberto
Buenos días Fer:
Acabo de probar lo que me dices (poner palabra sin los signos de pregunta) y me sigue sin hacer nada, lo siento... Voy a seguir probando haber si encontramos solución ya que sino no puedo seguir con el proyecto.
Un fuerte abrazo
Alberto
Buenos días Fer:
Acabo de encontrar solución al problema, he puesto un if y el nombre lo he cambiado y he puesto el patrón directamente del documento:
Sub quitaEspacioN() Dim Celda As Range Dim PALABRA As String Inicelda = "A1" ' primera celda de rango a modificar pos = 10 ' ordinal del espacio a quitar PALABRA = "3 New Vo... Healthy" UltFila = Range(Left(Inicelda, 1) & Rows.Count).End(xlUp).Row If PALABRA = PALABRA Then For Fila = 0 To UltFila If InStr(1, Range(Inicelda).Offset(Fila).Value, PALABRA) Then Range(Inicelda).Offset(Fila).Interior.ColorIndex = 35 On Error Resume Next Range(Inicelda).Offset(Fila).Value = Application.WorksheetFunction.Substitute(Range(Inicelda).Offset(Fila).Value, " ", "", pos) Err.Clear On Error GoTo 0 End If Next End If End Sub
Creo que así me queda solucionado el tema!
Un fuerte abrazo y muchísimas gracias por toda la ayuda.
Alberto
.
Me alegro de que te haya funcionado, eso es lo único importante.
Me parece la solución fue tomar el patrón del documento. Como dije, dependía de cómo estaba escrito y que lo encontrara así para que la sustitución funcione.
El condicional If PALABRA = PALABRA siempre dará verdadero por lo que parecería redundante.
Pero si te funciona...
Saludos
Fer
.
- Compartir respuesta