Hojas de cálculo en Excel - página principal

Separar cadenas de texto

Hoy os presento una utilidad que puede serviros a más de uno. Aunque en Excel esta funcionalidad ya está incorporada en el menú Datos, seleccionando Texto en columnas..., esa opción no siempre nos va a servir. Se trata de descomponer un texto en tantas cadenas (o palabras) como haya. Por ejemplo, si tenemos en una misma columna un texto con los nombres y apellidos de nuestros clientes, y deseamos que nos separe el nombre y los apellidos en varias columnas, el macro que hoy os presento, nos solucionará el problema.

Imaginemos que tenemos esto:


Si queremos que nos quede así:


Tan solo tendremos que aplicar este macro:


Sub reorganizar_todo_version_1()
'*********************************************************************
'Tenemos que situarnos en la primera celda donde tengamos los datos a reorganizar
'Supondremos que es la celda A1
'*********************************************************************

Range("A1").Select
'Ocultamos el procedimiento para que no se vea en pantalla
'nada de lo que hacemos

Application.ScreenUpdating = False
'Mientras encontremos datos en la fila en cuestión,
'que ejecute el macro

Do While Not IsEmpty(ActiveCell)
'Primero nos fijaremos en qué celda estamos,
'para volver a ella una vez arreglada la fila

dondeestoy = ActiveCell.Address
'Descomponemos la cadena, en subcadenas,
'para lo cual indicamos el delimitador " ", aunque
'por defecto, podríamos haberlo omitido, pues es ese mismo (espacio)

datos = Split(ActiveCell, " ")
For i = 0 To UBound(datos)
'ponemos cada dato del array, en una columna
ActiveCell = datos(i)
'nos desplazamos a la columna adyacente (de la derecha)
ActiveCell.Offset(0, 1).Select
Next 'Seguimos con el bucle
'Volvemos donde estábamos inicialmente
Range(dondeestoy).Select
'pasamos a la fila siguiente, y volvemos a recorrer el bucle
ActiveCell.Offset(1, 0).Select
Loop
'Mostramos todo de nuevo
Application.ScreenUpdating = True
End Sub


Aunque puede que queramos dejarlo como en esta otra imagen, donde se nos mantiene el nombre y los apellidos en la primera columna, y en las otras adyacentes, nos separa el nombre y los apellidos:


Para este último caso, tendremos que adaptar el macro anterior, y dejarlo de la siguiente forma:


Sub reorganizar_todo_version_2()
'*********************************************************************
'Tenemos que situarnos en la primera celda donde tengamos los datos a reorganizar
'Supondremos que es la celda A1
'*********************************************************************

Range("A1").Select
'Ocultamos el procedimiento para que no se vea en pantalla
'nada de lo que hacemos

Application.ScreenUpdating = False
'Mientras encontremos datos en la fila en cuestión,
'que ejecute el macro

Do While Not IsEmpty(ActiveCell)
'Primero nos fijaremos en qué celda estamos,
'para volver a ella una vez arreglada la fila

dondeestoy = ActiveCell.Address
'Descomponemos la cadena, en subcadenas,
'para lo cual indicamos el delimitador " ", aunque
'por defecto, podríamos haberlo omitido, pues es ese mismo (espacio)

datos = Split(ActiveCell, " ")
For i = 0 To UBound(datos)
'ponemos cada dato del array, en una columna
ActiveCell.Offset(0, 1) = datos(i)
'nos desplazamos a la columna adyacente (de la derecha)
ActiveCell.Offset(0, 1).Select
Next 'Seguimos con el bucle
'Volvemos donde estábamos inicialmente
Range(dondeestoy).Select
'pasamos a la fila siguiente, y volvemos a recorrer el bucle
ActiveCell.Offset(1, 0).Select
Loop
'Mostramos todo de nuevo
Application.ScreenUpdating = True
End Sub



62 comentarios:

Anónimo dijo...

Muy bueno el truco.

Yo también lo hacía copiando y pegando 3 veces la lista y luego selecciono la columna hago CTRL+L

Substituir "espacio*espacio*"

Con lo que;

José Lopez Lopez

me quedaba

José

Y luego con "*espacio*espacio"

Sigue con tu blog, a los que nos gusta trabajar con excel no ecanta.

Javier Marco dijo...

Muy interesante tu propuesta, especialmente si no queremos complicarnos la vida, y si solo vamos a utilizar una vez lo de separar las cadenas de texto.

Muchas gracias por tu comentario.

Anónimo dijo...

UNA CONSULTA
PERO SI SOLO QUIERO SEPARAR PATERNO MATERNO Y NOMBRES OSEA 03 COLUMNAS
SE LO AGRADECERIA BASTANTE
SI ESPOSIBLE ENVIAR ME A MI CORREO eli25z@hotmail.com

Gracias

Javier Marco dijo...

El ejemplo que puse hace precisamente eso, separar nombres de apellidos, o apellidos de nombres. Da igual el orden.

Solo tienes que implementar alguno de los dos macros que propuse. Si no sabes como crear un macro, pásate por esta entrada del blog: http://hojas-de-calculo-en-excel.blogspot.com/2008/01/macros-en-excel.html

Salu2

Anónimo dijo...

Excelente blog. una pregunta; y como hacer cuando quiero organizar datos que no estan acomodados en columnas como en tu ejemplo? imagina un acomodo altamente aleatorio y arbitrario; yo quiero acomodar los datos por columnas, sera posible? Aqui te dejo el ejemplo: http://www.scribd.com/doc/3221740/ejemplo-08

Javier Marco dijo...

Hola, que tal...

Yo no veo tanta aleatoriedad, ni arbitrariedad en ese pantallazo, porque ahí veo una columna con nombres comerciales de productos, y en otra, los componentes activos.

¿Debo entender que quieres separar en columnas los nombre de las sustancias activas que tienes bajo el encabezado de "Sustancia"?.

Saludos, y gracias por tu comentario.

Anónimo dijo...

Gracias por tu tiempo, Javier. Mira, necesito "sacar" en una hoja o en la misma: Fecha, Num Circular, Sustancia Activa, los tres Precios (Mostrador, GI y Distribuidor) y Codigo de barras. Cada dato en una columna y eliminar u omitir las celdas, filas o columnas vacias. Tal vez es algo simple, lo que sucede es que el archivo no siempre esta de la misma forma, es decir: a veces empieza en A1, otras en c4 y asi, no se puede saber con certeza el rango... Te agradezco tu ayuda. Saludos desde la bella Guadalajara, Mexico.
Alberto Gutierrez

Javier Marco dijo...

Te propongo una cosa. Mándame una copia de ese fichero de excel, con datos inventados, para salvaguardar la confidencialidad de tu empresa (invéntate los datos, precios, nombres de las sustancias, y demás), especifícame más concretamente eso de la fecha, número de circular, y alguna otra cosa más que no veo en el ejemplo que dejaste, y veremos que se puede hacer (dame unos días para mirármelo, que voy mal de tiempo).

Especifícame que deseas concretamente, da igual que un día los datos estén en A1 o en J44. Solo dime que es lo que quieres, cuanto más específico seas, mejor.

Si te parece seguimos en contacto por email para no dejar comentarios sobre este tema en el blog.

Mi correo es este: mikorreo*gmail.com

(Cambia el * por @)

Unknown dijo...

muy bueno el macro, particularmente me parece mas rapido usar el separar en columnas y eligir el espacio como separador .. hace casi lo mismo.

saludos

Javier Marco dijo...

Gracias por tu comentario.

Tienes razón en lo que comentas, aunque yo dejé planteada la posibilidad de mantener los datos originales intactos en su propia columna, y separar las cadenas de texto en las columnas contiguas (también se podrían separar las cadenas en otra hoja de cálculo distinta), y esto no lo permite hacer excel, a no ser que lo programes mediante un macro. Además, siempre está bien ver las cosas desde el punto de vista de los macros, que es básicamente de lo que trata el blog, pero si he de ser sincero, sí, tienes toda la razón del mundo, porque en el 90% de las ocasiones, será más sencillo y rápido, utilizar la opción que ya nos brinda excel.

La variante que introduje, puede servirnos en alguna ocasión ;-)

David dijo...

Buenos días Javier,

Quería hacerte una consulta, estoy empezando en el tema de las macros de Excel. Tengo un fichero original en el que aparecen filas de separación por ";" con todos los datos relevantes (cógigo de venta, fecha, nombre, apellidos, e-mail, etc). Me gustaría saber si existe la posibilidad de crear una macro que separe todas esas filas en varios archivos (o dentro del mismo) por cada tipo distinto de código, para no tener que hacerlo de manera manual. Muchas gracias por todo.


David

Javier Marco dijo...

Hola, que tal...

Puedes hacerlo de 2 formas, con y sin macro.

Con macro, simplemente cambia esta línea:
datos = Split(ActiveCell, " ")
Y pon esta otra:
datos = Split(ActiveCell, ";")

Sin macro, Ves a "Datos" --> "Texto en columnas", y cuando te pida que separador quieres utilizar, ponle el punto y coma.

Salu2

David dijo...

Muchas garcias Javier,

de cualquier forma lo que pretendía es que las filas no perdieran su configuración original, es decir la secuencia de caracteres separadas por ";", ya que esto nos es necesario para luego ejecutar el volcado de contratos. Entiendo que devolver las filas a su estado original será más complicado que separarlas en columnas. Por ello creí que una macro en la que busque por ciertos caracteres, sin alterar la secuencia de la fila sería más sencillo. No sé si se puede hacer así. Muchas gracias de cualquier forma.


David.

Javier Marco dijo...

Hola David...

Por lo que interpreto, quieres mantener los datos en su estado original, y a la vez que te separe esos datos en columnas, cada vez que encuentre un punto y coma. ¿Es cierto?.

Bueno, como creo que sí, que es eso lo que quieres, tan solo debes echarle un vistazo al código del artículo, donde verás que hay 2 macros. El primero separa los datos como lo haría el propio excel a través del menús Datos, Texto en columnas.

El segundo de los macros, mantiene la columna original con los datos, y en las columnas adyacentes de la derecha, es donde se separan las cadenas de texto (fíjate en la imagen que hay, que se mantienen los nombres y apellidos tal y como estan originalmente, y a su derecha se separan en columnas).

Si no te he entendido mal, eso es lo que quieres hacer.

Salu2

David dijo...

La macro que has colgado me sirve en parte, aunque me da la impresión de que el proceso sería más largo. Lo que quiero no es exactamente eso. Te pongo un ejemplo, tengo 500 filas más o menos de esta forma:

R10,"PEPE","PEREZ","GONZALEZ","SANTA EUGENIA 8 2 C","x","47220","VALLADOLID","Valladolid","Spain","D PEREZ GONZALEZ","225334","09/06/2008","900 811 343","900 811...

Y así hasta 400 registros cada uno de ellos con todos los datos en sólo 1 celda, es decir en la columna 1 y las filas de 1 a 400. No me interesa separar en columnas si no es necesario, lo que me gustaría es crear varios ficheros para cada uno de los códigos del inicio, por ejemplo los R10, los R20, los R30 y también para los que en la secuencia tengan "@", es decir , los que se enviarán por e-mail. Por eso creía que la mejor forma era con una macro que encontrase esos valores en la secuencia y los extrajese. Siento darte mucho la lata, si te estoy quitando demasiado tiempo no dudes en decírmelo. Te estoy muy agradecido por la atención. Gracias de nuevo.


David.

Javier Marco dijo...

Hummmmmm, eso es otra cosa.

¿Eso quieres que se grabe en otros archivos (ficheros), o en otras hojas (pestañas?.

Si te parece, seguimos por email, para no llenar el artículo de comentarios para un tema particular.

Contéstame a este emai: mikorreo*gmail.com
(sustituye * por @).

Un saludo.

Anónimo dijo...

MUY BUEN DAtO..UNA MAS SI NOE S MOLESTIA..SI ME PONEN LA LISTA DE ONMBRS SEPARADOS CON UNA COMA DE LOS APELLIDOS COMO HAGO PARA ELIMINAR LA COMA DE LA ULTIMA PALABRA Q LAS SEPARA

Javier Marco dijo...

Pues puedes introducir esta línea (para reemplazar la coma por nada):

datos(i) = Replace(datos(i), ",", "")

justo después de esta otra línea:

For i = 0 To UBound(datos)

Salu2

Anónimo dijo...

buenas tardes quisrea saber si me pueden ayudar, tengo en una celda de excel una serie de datos expresados de la siguiente manera: 6,10986, como puedo eliminar la segunda coma de este dato???

Javier Marco dijo...

Prueba con esta macro (supondremos que el rango de datos empieza en A1):

Sub quitar_coma()
Range("A1").Select
Do While Not IsEmpty(ActiveCell)
Selection.NumberFormat = "@"
ActiveCell = Left(ActiveCell, Len(ActiveCell) - 1)
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Salu2

Anónimo dijo...

Una cosulta referente a separacion de texto, tengo 2 columnas con codigo de pais y la porterior con los cogidos de area separados por, y espacio un ejemplo es 1268 464, 723, 727, 728, 729, 764, 770, 771, 772, 773, 774, 775, 779, 780, 781, 782, 784, 786
1268 que es el Codigo de Antigua y los posteriores son codigos de area lo que requiero es que una macro me separe los registros de manera vertical y a su vez me agregue el 1268 para que queden de la siguiente manera:
1268 464
1268 723
1268 727
1268 728
1268 729
1268 764
1268 770
1268 771
1268 772
1268 773
1268 774
1268 775
1268 779
1268 780
1268 781
1268 782
1268 784
1268 786

Javier Marco dijo...

Hola que tal...

Prueba este macro:

Sub ejemplo()
'nos situamos en la 1ª celda con datos
Range("A1").Select
Do While Not IsEmpty(ActiveCell)
'miramos lo que hay en la celda de la derecha
datos = ActiveCell.Offset(0, 1)
'separamos los datos, por la coma
datos = Split(datos, ",")
'creamos un bucle para unir la celda actual
'con cada uno de los datos de la columna derecha
For i = 0 To UBound(datos)
nuevos_datos = nuevos_datos & "," & ActiveCell & " " & datos(i)
Next
'bajamos una fila, para seguir con el bucle
ActiveCell.Offset(1, 0).Select
Loop
'creamos un nuevo libro
Workbooks.Add
'Nos situamos en A1
Range("A1").Select
'le quitamos la primera coma al nuevo dato
nuevos_datos = Trim(Right(nuevos_datos, Len(nuevos_datos) - 1))
'escribimos los datos
nuevos_datos = Split(nuevos_datos, ",")
For i = 0 To UBound(nuevos_datos)
ActiveCell = nuevos_datos(i)
ActiveCell.Offset(1, 0).Select
Next
End Sub

Salu2

Anónimo dijo...

hola que tal,,, muy bien el macro, modifiqué un poco la lineas que de igual manera sirve, son menos lineas y no necesitas un rango especifico, solo basta con seleccionar el rango de tus datos, sin importar en que parte de la hoja de excel se encuentre...
se los dejo espero que les sirva

Sub spliter()
Dim j As Variant
For Each j In Selection
palabras = Split(j.Value, " ")
For i = 0 To UBound(palabras)
j.Offset(0, i) = palabras(i)
Next i
Next j
End Sub

saludos

Javier Marco dijo...

Muchas gracias Carlitos, por tu excelente código.

Salu2

Manuel dijo...

Separar texto en Columnas, utilizando la opción incorporada en el menú de Datos, forma parte de mi trabajo diario, y excel es muy hábil haciéndolo.

Yo tengo una única objeción y es que no es posible (o no conozco la forma de) definir por defecto un separador que no sea la tabulación. Es cierto que excel "recuerda" el separador que utilicé en mi último texto separado, pero si cierro el excel, por ejemplo, al terminar mi día de trabajo, la siguiente vez tendré que definirlo nuevamente.

¿Conoce alguien algún truco que me sirva para que la coma sea siempre mi separador de campos por defecto?

Eso haría un poco más cómodo mi trabajo.

Gracias

Unknown dijo...

Javier, en verdad es muy interezante la informacion que publicas y de mucha ayuda para nosotros los que trabajamos dia a dia con el excel., buscando paginas entritre tu Web. y me ha sido de mucha utilidad... ante todo quiero elevarte una conulta si esta a tu alcance ayudarme.. de todas manera de antemano te doy las gracias porque con la informacion que he visto en tu pagina me ha ligerado mucho mi carga de trabajo.

la consulta es la siguiente, existe un programa que baja los reportes en txt y de esta forma:

----------------- ---------------------------------------------- ----------------

5-1-1-1-28-36-00 GUARDERIAS PL SALDO INICIAL
T O T A L de Cargos, Abonos y S A L D O 8,732.55 1,050.00
----------------- ---------------------------------------------- ----------------

5-1-1-1-28-36-05 Guarderias Pl SALDO INICIAL
P.Cp 3 1/N ov/08 VEN/A/ F7097/ 959.07
P.Cp 3 1/N ov/08 VEN/A/ FCOB-S 319.69
P.Cp 3 1/N ov/08 VEN/A/ F00570 319.69
P.Cp 3 1/N ov/08 VEN/A/ FCOB- 319.69
P.Cp 3 1/N ov/08 VEN/A/ F7255/ 319.69
P.Cp 69 26/N ov/08 VEN/A/ FAV-N 319.69
T O T A L de Cargos, Abonos y S A L D O 2,557.52 -
----------------- ---------------------------------------------- ----------------

5-1-1-1-28-36-10 Guarderias Plun SALDO INICIAL
P.Cp 3 1/N ov/08 VEN/A/ F0184 319.69
P.Cp 3 1/N ov/08 VEN/A/ F018237/ 319.69
P.Cp 3 1/N ov/08 VEN/A/ F018236/ P 319.69
P.Cp 3 1/N ov/08 VEN/A/ F003566/ 319.69
P.Cp 3 1/N ov/08 VEN/A/ F003565/ 319.69
P.Cp 69 26/N ov/08 VEN/A/ F0414/ 319.69
P.Cp 69 26/N ov/08 VEN/A/ F041 319.69
P.Cp 69 26/N ov/08 VEN/A/ F0412/ 319.68
P.Cp 69 26/N ov/08 VEN/A/ F00400 319.69
P.Cp 69 26/N ov/08 VEN/A/ F004001/ 319.69
P.Cp 69 26/N ov/08 VEN/A/ F004022 319.69
P.Cp 78 27/N ov/08 VEN/A/ F195 300.00
P.Cp 78 27/N ov/08 VEN/A/ F195 319.69
T O T A L de Cargos, Abonos y S A L D O 4,136.27 -
----------------- ---------------------------------------------- ----------------

El primer registro me da el codigo y luego el detelle de lo cargado mensual, esta es una informe muy extenso, mi consulta es, existe alguna forma de colocar el codigo en cada unos de los detalle para poder realizar tablas o reportes?

Anónimo dijo...

Hola, y felicidades por la web lo primero.Estoy buscando una macro que haga justo lo contrario que esta..osea unir en una columna los datos que tengo repartidos en varias columnas, ya que si lo hago por el metodo de COMBINAR celdas pierdo datos.Gracias por anticipado.AMG

Unknown dijo...

Hola Marco:
Originalmente te escribia para que me ayudaras pero como ya resolvi mi problema, pues colaboro con el codigo, hice unas modificaciones a tu codigo, es basicamente lo mismo, pero funciona en vez de con celdas con un listbox.

x = 2
Do While Cells(x, 1).Value <> ""
x = x + 1
Loop
For i = 0 To ListBox1.ListCount - 1
Cells(x, 1).Select
ListBox1.ListIndex = i
datos = Split(ListBox1.Value, " ")
For j = 0 To UBound(datos)
ActiveCell.Value = datos(j)
ActiveCell.Offset(0, 1).Select
Next
x = x + 1
Next

Nota este listbox se lleno de items en funcion a un formulario normal, en vez de grabar los datos directamente en las celdas, decidi que se fueran almacenando en el listbox, por si habia error se puede borrar el item, y una vez finalizada la captura, ejecutar el codigo.

Saludos, sigue con el excelente trabajo

Javier Marco dijo...

Muchas gracias por tu código Gera. Seguro que a más de un usuario le es de gran utilidad :-)

Anónimo dijo...

hola te felicito por tu pagina a sido de gran interes para nosotros, te quiero ademas, hacer una consulta:
yo tengo una planilla en excel y que tiene 50 columnas con 100 filas pero solo necesito hacer de esta planilla 5 reportes con diferentes columnas y pasarlos a txt con sus respectivos carcteres ( me explñico: si la primera columna tiene 5 caracteres que aparezca en txt asi con 5 caracteres, si la 2da columna tiene 10 caracteres que aparezca con 10 caracteres en txt), y ademas poder copias en el txt las columnas que necesite sin tener que hacer el reporte en Excel antesde pasarlo a txt??
desde ya muchas gracias

Javier Marco dijo...

Mírate este artículo: Grabar datos en un fichero de texto

Anónimo dijo...

ese articulo ya lo vi pero lo que necesito por ejemplo tengo en un excel de la columna a hasta la z pero necesito tomar las columnas a,d,j,g,h,i solamente y pasarlos a un txt sin pasar por otro excel se puede hacer mediante una macro????
gracias por tus respuesta

Anónimo dijo...

esto fue lo que hice y me tiro la segunda columna al fianl y para el lado
Private Sub CommandButton1_Click()

Dim MiRango As Range, Largo As Integer, FilaActual As Long


On Error Resume Next
Set MiRango = Application.InputBox("Seleccione rango a exportar", Type:=8)

On Error GoTo 0
If MiRango Is Nothing Then Exit Sub
Open "C:\Documents and Settings\aacabezas\Escritorio\oTEXTO.txt" For Output As #1


For Each Celda In MiRango
If Largo <= Len(Celda) Then Largo = 1 + Len(Celda)
Next Celda
FilaActual = MiRango.Cells(1).Row


For Each Celda In MiRango
If FilaActual < Celda.Row Then
FilaActual = Celda.Row: Print #1, ""
End If
Print #1, CStr(Celda); Space(Largo - Len(Celda));
Next Celda
Close #1
Set MiRango = Nothing



End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Anónimo dijo...

sorry me equivoque fue esto lo que hice
Private Sub CommandButton1_Click()

Dim MiRango As Range
Dim MiRango2 As Range

Dim Largo As Integer
Dim Largo2 As Integer

Dim FilaActual As Long
Dim FilaActual2 As Long


On Error Resume Next
Set MiRango = ActiveSheet.Range("A1:A7")
Set MiRango2 = ActiveSheet.Range("C1:C7")
'Application.InputBox("Seleccione rango a exportar", Type:=8)

On Error GoTo 0
If MiRango Is Nothing Then Exit Sub
Open "C:\Documents and Settings\aacabezas\Escritorio\TEXTO.txt" For Output As #1




For Each Celda In MiRango
If Largo <= Len(Celda) Then Largo = 1 + Len(Celda)
Next Celda
FilaActual = MiRango.Cells(1).Row


For Each Celda In MiRango2
If Largo2 <= Len(Celda) Then Largo2 = 1 + Len(Celda)
Next Celda
FilaActual2 = MiRango2.Cells(1).Row

Anónimo dijo...

Realmente útil :) Especialmente si estás acostumbrado a Visual Basic pero no sabias nada sobre macros... Ese es mi caso, y me ha abierto tantas puertas gracias al ejemplo... :P

Gracias!

Anónimo dijo...

Hola, si tuviera esta cadena numerica "345678543785654753786", sin espacios ni corchetes, etc., y quisiera desglosar en varias columnas, que en la columna A tenga 5 digitos y en la B 8 y asi, cual seria su recomendacion, no se manejas las longitudes de celdas, saludos y gracias.

Anónimo dijo...

Con Macros.

Anónimo dijo...

Hola, yo tambien tengo este problema, desglozar en columnas, mediante macros, cadena de numeros largos, este es el codigo que utilizo creo que es mas o menos asi despues de la importacion:
(no se de formulas, Office 03)

Sub Importar_a_una_hoja_nueva() '

'dimensiones
Dim strNombreArchivo

'diálogo para abrir archivo
strNombreArchivo = Application.GetOpenFilename
If strNombreArchivo = False Then
'Se Cancela
Exit Sub
End If

'abrir el archivo y dividir en columnas
Workbooks.OpenText _
filename:=strNombreArchivo, _
Origin:=xlWindows, _
StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=false, _
Semicolon:=False, _
Comma:=False, _
Space:=false, _
Other:=false, _
FieldInfo:=Array(1, 1)
'Selection.TextToColumns Destination:=Range("A1:IV35536")
'Range("A1:IV35536").Select

'Inserta columna temporal
Range("A1").Select

'Inserta formula en el rango
For Each cell In Sheets("sheet1").Range("A:A")
cell.FormulaR1C1 = "=EXTRAE(A,1,7;HALLAR(B,8,17)"
Next

End Sub 'Fin del procedimiento principal

"123456789012345678901234567890"
Que la primer columna tenga 8 digitos, la segunda 3, la tercera 4 , etc.

NOTA: ESOS RANGOS SE MANEJAN EN TODA LA COLUMNA

Anónimo dijo...

Hola soy nuevo en esto de excel, el caso es de que tengo una lista de clientes en una sola columna y las nececito separa y algunos de los nombres y apellidos biene en minuscula.
Lo que necesito es poder separalos en columnas y que la primera letra de cada columna se ponga en mayuscula.
De antemano le agradesco su tiempo. Mil gracias

Anónimo dijo...

HOLA HICE UN FORMATO DONDE EL TOTAL DEVE SER CON LETRA, PERO ESTE DEBE ESTAR ENTRE PARENTESIS. 1,000,000.00

8,044.00
5,626.00
1,013,670.00

(UN MILLON TRECE MIL SEISCIENTOS SETENTA PESOS 00/100 M.N.)
ESTOY UTILIZANDO UNA MACRO PUDE PONER EL PARENTESIS FINAL PERO NO PUEDO CON EL INICIAL. =SI(D15-ENTERO(D15)=0,CONCATENAR(letra(D15)," PESOS 00/100 M.N.)"),letra(D15))

Javier Marco dijo...

Prueba de esta forma:

="("&SI(D15-ENTERO(D15)=0,CONCATENAR(letra(D15)," PESOS 00/100 M.N.)"),letra(D15))

Aunque también te sirve de esta otra forma:

=SI(D15-ENTERO(D15)=0,"("&CONCATENAR(letra(D15)," PESOS 00/100 M.N.)"),"("&letra(D15))


De nada.

Anónimo dijo...

Hola Javier, excelente tu pagina
tengo un problema que no puedo resolver y solicito tu ayuda
en una macro tengo las variables siguientes
a=872193
b=7
c = a * b
el resultado es c = 6105351
solo me interesan los ultimos cinco caracteres y los alamceno en d
y me doy cuenta que d vale 5351 y necesito que d valga 05351
¿como le hago?

Javier Marco dijo...

Entonces ya será un texto, porque los números no llevan ceros delante...

Podrías evaluar si la cifra tiene 5 caracteres, con la función LEN. Si no los tiene, le añades delante un "0" & numero.

Anónimo dijo...

Gracias, Javier

problema solucionado

angelito@ito dijo...

¡Que tal!

Estoy utilizando la función concatenar de excel, pero tengo un problema ya que me cambia la forma como aparecen las unidades. Se despliega de la siguente manera kg/m3, cuando el 3 debe ser exponente. La formula es la siguiente:
=CONCATENAR(A1,"kg/m3")
Gracias de antemano.
ancenl26@live.com.mx

Jaime dijo...

Buenas tardes, lo primero decir que el blog me parece fantástico para todos los que trabajamos con excel, ya que cada día aprendo cosas nuevas.
Y bueno, también pedir ayuda con una hoja que se me esta resistiendo, tengo en el sheet1 en la columna A una serie de nombre + apellido + 2apellido + frase + nombre + apellido + 2apellido y el problema es que no todas las filas de la columna son iguales (en una solo aparece el nombre + apellido + + frase + nombre + apellido + 2apellido, en otra nombre + apellido + frase + nombre + apellido, ...) y no he conseguido ninguna formula que me lo depure para que me separe el nombre en una celda, apellido en otra, ... y así sucesivamente. He pensado en una macro, pero me pierdo y me seria de gran ayuda un consejo o una formula mágica.

Muchas gracias

Sroor dijo...

Hola que tal pues me esta sirviendo mucho tu blog muchas gracias solo una duda que te la hicieron antes pero la contestaste por mail. necesito separar los mails de todos los demas datos como puedo poner en la macro para que valide solo los que tengan @ o algo asi para que me deje los puros mails en otra hoja ...

muchas gracias

y mi correo es elbruce@gmail.com por si gustas contestarme por alli

josh dijo...

Hola Muy bueno el Blog,

Tengo un problema para separar un numero dentro de una celda por ejemplo : 45612345 y debe de quedar en 8 columnas una por cada numero.

Espero me puedas ayudar

Saludos y felicidades por el blog

Unknown dijo...

que puedo hacer si debo separar los apellido en celdas distintas pero mediante una funcion, tengo el nombre jose perez soto y tengo una funcion para separar el nombre y q lo muestre en otra celda y otra funcion para q mueste los 2 apllidos juntos en otra celda pero lo que no logro hacer es que me arroje un solo apellido y bueno necesito esa formula si la sabes lo agradesco

Javier Marco dijo...

Puedes probar lo que se explica en el artículo, y luego, cuando tengas la columna A con el nombre, la B con el primer apellido, y la C con el 2º apellido, pon esto en la columna D (en este caso en D1):

=B1 & " " & C1

De esa forma, consigues en una columna auxiliar (D), el primer y segundo apellidos juntos.

Ahora copia y pega sobre sí misma esa columna (solo los valores), y ya tendrás lo que buscas. Eliminas las columnas B y C y listo, tema resuelto.

Albert Martín-Estrada dijo...

Buenas tardes,

Tengo una serie de celdas con texto que quiero quiero dividir, sin cortar palabras, en filas pero que contengan un número màximo de caracteres (por ejemplo 20 caracteres).

Por ejemplo. Tengo esto en Excel:

A1: "Esto es un ejemplo del texto que tengo"
A2: ""
A3: "Esto es otro ejemplo del texto que tengo en la fila siguiente"
A4: ""
A5: "Esto es otro ejemplo del texto que tengo en la fila siguiente"


Y me gustaría hacer una macro que lo convirtiera así:


A1: "Esto es un ejemplo"
A2: "del texto que tengo"
A3: ""
A4: "Esto es otro ejemplo"
A5: "del texto que tengo"
A6: "en la fila siguiente"
A7: ""
A8: "Esto es otro ejemplo"
A9: "del texto que tengo"
A10: "en la fila siguiente"


¿ Podéis ayudarme?


Mil gracias.


Albert

Alberto dijo...

Muchísimas gracias por el aporte.
Lo he utilizado como base y si a alguien le sirve, esta macro permite partir el contenido de la columna A por el espacio más cercano a la posición 30. Lo he utilizado para cargas masivas de datos en campos de base de datos que tengan una longitud limitada (en este caso a 30 caracteres)

Sub PartirA30()

Dim Valor
Dim Conta As Integer, Pos As Integer, Largo As Integer

Range("A1").Select
'Ocultamos el procedimiento para que no se vea en pantalla
'nada de lo que hacemos
Application.ScreenUpdating = False
'Mientras encontremos datos en la fila en cuestión,
'que ejecute el macro
Do While Not IsEmpty(ActiveCell)
'Primero nos fijaremos en qué celda estamos,
'para volver a ella una vez arreglada la fila
dondeestoy = ActiveCell.Address


'K2 tiene eltexto completo
Largo = Len(ActiveCell.Value)

'Se vuelca el resultado en K7 y K8
Pos = 1
Conta = 0
While Conta <> 1
On Error Resume Next
Valor = WorksheetFunction.Search(" ", ActiveCell.Value, Pos)
If (Valor <= 30) And (Valor > Pos) Then
Pos = Valor + 1
Else
Conta = 1
End If
Wend

'No encontró espacios
If (Pos = 1) Or (Valor + Pos - 1 <= 30) Then
ActiveCell.Offset(0, 1).Value = ActiveCell.Value
Else
ActiveCell.Offset(0, 1).Value = Left(ActiveCell.Value, Pos - 1)
ActiveCell.Offset(0, 2).Value = Mid(ActiveCell.Value, Pos, Largo)
End If

'Volvemos donde estábamos inicialmente
Range(dondeestoy).Select
'pasamos a la fila siguiente, y volvemos a recorrer el bucle
ActiveCell.Offset(1, 0).Select
Loop
'Mostramos todo de nuevo
Application.ScreenUpdating = True
End Sub

Anónimo dijo...

Hola,,,

CUando leo codigos de barras (matrix) con excel , se me van introduciendo uno detras de otro si separacion ninguna y todos en la misma celda, y quiero separar dichos codigos y ponerlos en columna. Como lo hago??

Ejemplo:

12345'5555A12354'8897A

"el ejemplo es la lectura de dos codigos, cad auno acaba con el caracter A"

Muchas gracias.

Anónimo dijo...

saludos amigos,
estoy usando tu codigo, pero tengo la siguiente situacion, tengo una hoja con aprox. 13000 datos donde las columnas de nombre y apellido, contienes datos como estos, ender camilo de jesus, como puedo hacer para separarlo en dos columnos nombre1 y nombre2, para que quede algo asi nombre1= ender y nombre2=camilo de jesus, se puede hacer??

kiki dijo...

HOLA

Yo también tengo que separar texto pero, de números, es decir, domicilios contenidos en una celda, sin un orden definido.

Ya obtuve la separación del último número que contiene la cadena:

REFORMA AGRARIA # 14

y obtengo el 14 y a parte el nombre(en distintas celdas)

Ahora quisiera saber si me puedes ayudar para eliminar esos caracteres, primero, como el #.

En otros casos, tengo las palabras NO., num., ext., etc.....

Me dijo alguien que eso es muuy complicado.

Quisiera ir haciéndolo manualmente mediante fórmulas; primero eliminar el "gatito", luego las palabras que digan No., NUM, EXT.....etc.

Además, tengo el conflicto de que tengo un número interior, el cual no he podido desconcatenar:

texto completo:

C U P J EDIF B-5 DEPTO 307


resultado:
C U P J EDIF B-5 DEPTO
resultado:
307

como podrás observar, tengo que eliminar DEPTO, y separar además eso de B-5, que viene siendo como el EXTERIOR(a este en otros casos,también debo eliminarles el 'int.')

¿me pueden auxiliar por favoooorrr??

Me súper urge!

Mil gracias.

Josue dijo...

buenas tardes javier, tengo un problema y recurro a ti una vez mas, te cuento en relacion a este mismo ejemplo de macro:
tengo una aplicacion(externa) que me arroja n lineas y cada linea tiene ej:300 caracteres hacia el lago, existe la posibilidad mediante una macro de que ese texto lo corte en la columna: 13, en la 14, en la 17, 25,,,y asi en las columnas que yo desee,, espero haber sido suficientemente explicito, de no ser asi, encantado te envio algun ejemplo del archivo,
nuevamente muchas gracias

saludos,
Josue

Javier Marco dijo...

Aquí tienes un ejemplo bastante completo, que tendrás que estudiar y desmenuzar :-) importar datos concretos de un fichero de texto.

Saludos.

ralde dijo...

Gracias por tu actitud compartir tus conocimientos, en verdad que eres grande. Un feliz 2013 y Dios siempre te guarde por muuuuuuuuuuuchos años.
Desde La Paz Bolivia
Hernan Alvarado

Mercedes dijo...

Javier:
Gracias por dar tanto apoyo a tus lectores y feliz de tenerte nuevamente.
A raíz de este articulo, me surge una duda: en una celda tengo datos como por ejemplo: Algebra,Trigonometria, .Quiero quitar la ultima coma y el espacio que hay después de la coma. Te agradezco tu atención y felicitaciones por tu estilo claro y sencillo de explicar lo desconocido y difícil para muchos de nosotros.
Saludos.

Javier Marco dijo...

Mercedes, prueba esto:

Sub ejemplo()
'Tenemos el primer dato en la celda A1,
'y en un rango contínuo hacia abajo
Range("A1").Select
Do While ActiveCell <> Empty
'pasamos el dato a una variable,
'quitando los espacios vacíos de la derecha,
'en este mismo momento
dato = RTrim(ActiveCell)
'si hay coma al final, la quitamos
If Right(dato, 1) = "," Then dato = Mid(dato, 1, Len(dato) - 1)
'escribimos el dato que nos interesa en la celda de la derecha
ActiveCell.Offset(0, 1) = dato
'
'si quieres que el dato se sobreescriba en la propia celda donde está
'cambia la línea anterior, por esta otra:
'ActiveCell = dato
'
'bajamos una fila, y seguimos con el bucle
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Mercedes dijo...

Javier:
Gracias por la respuesta y es lo que quería, con esto soluciono mi problema. Una duda mas: cual seria la modificación si el numero de comas seria variable?.
Un millón de gracias y esperamos mas de tu enseñanza.
Saludosssssss.

Javier Marco dijo...

Si lo que quieres es quitar todas las comas que haya, utiliza la función Replace.

Te dejo que investigues como funciona :-)