Saltar al contenido

Separar texto alfanumérico en celdas con el separador personalizado


pegones1

Recommended Posts

En VBA y en otros lenguajes de programación es fácil separar texto alfanumérico, pero no lo es tanto usando las fórmulas de Excel.

Para preparar unos diagramas de Gantt en Excel necesitaba separar la lista de predecesores de una tarea representados como "6,10,24" y obtener los números separados por comas en otras celdas.

Después de buscar una solución, he intentado mejorarla para que sea más general y he obtenido el siguiente resultado:

294kvif.jpg

En la columna B se define el tipo de separador: un carácter alfanumérico, por ejemplo la coma ","

En la columna C se define el texto a incluir cuando no hay texto, por defecto es un espacio en blanco " "

En el próximo mensaje enviaré el fichero Excel con la solución propuesta.

Enlace a comentario
Compartir con otras webs

Aquí está el fichero con la solución propuesta sin macros para separar texto alfanumérico en varias celdas:

SepararTextoAlfanumerico.xls

Lo he subido a mi SkyDrive porque sigo sin poder subir ficheros al foro. :mad:

Espero que algún "Super-Merodeador" me lo pueda subir :rolleyes:

Enlace a comentario
Compartir con otras webs

Concatenar texto alfanumérico es fácil pues existe la función CONCATENAR(texto1; [texto2]; ...) o también se puede utilizar el operador de cálculo símbolo (&) para unir elementos de texto.

Lo que no existe es una función para DESCONCATENAR texto en varias celdas, aunque Excel lo resuelve como cuando importa datos externos.

Si en la celda A1 se escribe el texto alfanumérico a separar, por ejemplo:

1,ab,33,cde,4444

Se borran las celdas B1:F1 y se selecciona la celda A1

En el menú Datos, hacer click en Texto en columnas

Se abre un Asistente para convertir texto en columnas, como se explica en esta página de Microsoft.

ejm_1-480x369.jpg

En el paso 1, elegir Delimitados

En el paso 2, marcar solo la Coma como separador

En el paso 3, cambiar el Destino a la celda B1 (normalmente machaca A1) y pulsar Finalizar.

En el rango B1:F1 estará el texto alfanumérico separado.

1 ab 33 cde 4444

Para entenderlo mejor lee el artículo Separacion de texto en Excellentias.com

Enlace a comentario
Compartir con otras webs

Hola:

Siguiendo mi misión de evangelización por territorios "formulianos", os dejo una mini macro que sustituye a vuestras mas de 200 fórmulas.

Sub SepararTexto()
On Error Resume Next

Application.ScreenUpdating = False

If Selection.Columns.Count <> 1 Then Exit Sub
If Selection.Column <> 1 Then Exit Sub

For x = 1 To Selection.Rows.Count
celdas = Split(Cells(x, 1), Cells(x, 2))
y = 4
For c = 0 To 14
If celdas(c) = "" Then
Cells(x, y) = Cells(x, 3)
Else
Cells(x, y) = celdas(c)
End If
y = y + 1
Next c
Next x

End Sub
[/CODE]

¿ Porqué matar moscas a cañonazos cuando existe el insecticida ?.

Saludos. Antoni.

Enlace a comentario
Compartir con otras webs

En VBA y en otros lenguajes de programación es fácil separar texto alfanumérico, pero no lo es tanto usando las fórmulas de Excel.

Antoni, me parece que el tema estaba claramente expuesto.

En adición no son mas de 200 formulas es una sola, y te apuesto que me tarde menos en escribirla que lo que tú te tardaste en crear y probar la macro. Ademas que al cambiar el usuario el separador y el auxiliar en caso de que la cadena sea de longitud cero, los resultados se modificaran automáticamente. Se que le podrías poner la macro de evento, que no funcionaria si el usuario no activa las macros.

En fin no se trata de cual arma es mejor si no cual es la adecuada.

Saludos

Enlace a comentario
Compartir con otras webs

Jolín, que sentidos sois los "formulianos", os ofendeis enseguida, pero si en el fondo todos sabemos que os gustaría usar macros, ¡¡ Venga hombre !! animaros a usarlas, si es mucho mas sencillo de lo que parece, luego me lo agradecereis.

¡¡¡ Que nunca se pierda el sentido del humor !!! Saludoooooooooos a todoooooooooooos.

Macro Antonio.

Enlace a comentario
Compartir con otras webs

Ningún sentimiento de ofensa por este lado Macro, si mi respuesta ha sido por el lado gentil y amable que tengo:confused:.

Te cuento que desde hace algunos años mi trabajo lo desarrollo esencialmente con macros. Sin embargo me di cuenta que no podía seguir así, tenía que hacer algo, o algo serio me podía suceder; tenía que ejercitar el cerebro! Es entonces que decidí que mis respuestas se deberían de basar en formulas.:)

Saludos

Enlace a comentario
Compartir con otras webs

Parece mentira el deterioro cerebral que se sufre con el paso de los años.

¿ No será un exceso de tequila ?, hazme caso, pásate a la cerveza y lo verás todo mas claro.....jajaja:rolleyes:

Un saludo muy cordial desde la tierra de las meigas.

Macro Antonio.

Enlace a comentario
Compartir con otras webs

Hola, y yo me quedo con las excelentes propuestas y soluciones de todos ustedes, son diversas formas de abordar/solucionar un problema que de entrada es facil de resolver con la opcion texto a columnas de Excel.

Buenas soluciones y buenas formulas.

Saludos.

fornelasa, la opción Texto en columnas de Excel, que expuse en el Post #4, no es interactiva y cada vez que se cambia el texto obliga a pasar por el Asistente para convertirlo...

Enlace a comentario
Compartir con otras webs

Hola pegones1, gracias por la aclaracion, entonces corrijo mi comentario:

yo me quedo con las excelentes propuestas y soluciones de todos ustedes, son diversas formas de abordar/solucionar un problema.

Buenas soluciones y buenas formulas y tambien en mi opinion un muy buen tema.

Saludos.

Enlace a comentario
Compartir con otras webs

Veamos si podemos incrementar la atención en este post y tenemos otras propuestas. Aquí van un par de opciones extra, una con una fila auxiliar y otra sin la auxiliar.

Saludos

sailepaty, veo que has captado la esencia de este tema, que no es otra que olvidarse de los algoritmos y usar las fórmulas de Excel para separar textos, como si existiese la función DESCONCATENAR en Excel ¡que no existe! :mad:

Como todo (o casi todo) se puede hacer de diversas maneras y gracias a tus ideas, propongo otra solución con una única fórmula y sin tener que repetir 500 veces el espacio en blanco :mad: (por cierto, tu solución es muy ingeniosa :o)

=SIERROR(MED($A1;ENCONTRAR("
";SUSTITUIR($B1&$A1;$B1;"
";COLUMNAS($D1:D1)));1)&MED($A1;ENCONTRAR("
";SUSTITUIR($B1&$A1;$B1;"
";COLUMNAS($D1:D1)))+1;ENCONTRAR("
";SUSTITUIR($A1&$B1;$B1;"
";COLUMNAS($D1:D1)))-ENCONTRAR("
";SUSTITUIR($B1&$A1;$B1;"
";COLUMNAS($D1:D1)))-1);$C1)[/CODE]

NOTA: Se ha incluido a propósito, entre cada 2 dobles comillas, un salto de linea generado con la combinación de teclas [Alt]+[intro] porque no está incluido entre los caracteres del texto a separar.

Lo cierto es que se ha complicado bastante, para tener en cuenta la personalización del o los caracteres auxiliares, en caso de que la cadena resultante sea de longitud cero y ha obligado a llamar a la función SIERROR :P

SepararTextoAlfanumerico2.zip

Enlace a comentario
Compartir con otras webs

Para que la fórmula anterior del Post #15 sea independiente del número de columnas (entre la celda en la que se está separando el texto y la primera de ellas) hace falta una fila auxiliar con números enteros consecutivos (1, 2, 3, ..)

Si la fila auxiliar es la 18, la fórmula será:

=SIERROR(MED($A1;ENCONTRAR("
";SUSTITUIR($B1&$A1;$B1;"
";D$18));1)&MED($A1;ENCONTRAR("
";SUSTITUIR($B1&$A1;$B1;"
";D$18))+1;ENCONTRAR("
";SUSTITUIR($A1&$B1;$B1;"
";D$18))-ENCONTRAR("
";SUSTITUIR($B1&$A1;$B1;"
";D$18))-1);$C1)[/CODE]

La fila auxiliar hace las veces de argumento a la función:

[b]DESCONCATENAR(Texto; Número de celda a separar)[/b]

¡OJO función virtual no implementada en Excel 2007 ni Excel 2010!

Aunque la función completa sería algo así:

[b]DESCONCATENAR(Texto; Número de celda a separar; [separador]; [Auxiliar de relleno])[/b]

Siendo los valores opcionales por defecto:

Separador = , (coma)

Auxiliar de relleno = (espacio en blanco)

SepararTextoAlfanumerico2007.zip

Enlace a comentario
Compartir con otras webs

Hola:

Siguiendo mi misión de evangelización por territorios "formulianos", os dejo una mini macro que sustituye a vuestras mas de 200 fórmulas.

Sub SepararTexto()
On Error Resume Next

Application.ScreenUpdating = False

If Selection.Columns.Count <> 1 Then Exit Sub
If Selection.Column <> 1 Then Exit Sub

For x = 1 To Selection.Rows.Count
celdas = Split(Cells(x, 1), Cells(x, 2))
y = 4
For c = 0 To 14
If celdas(c) = "" Then
Cells(x, y) = Cells(x, 3)
Else
Cells(x, y) = celdas(c)
End If
y = y + 1
Next c
Next x

End Sub
[/CODE]

¿ Porqué matar moscas a cañonazos cuando existe el insecticida ?.

Saludos. Antoni.

Macro Antonio, las moscas son parte de la cadena alimenticia y pierden su valor al usar el insecticida ¡pobres de mis arañas! :rolleyes:

Si me hubieras dado una macro mas general, no anclada a la fila 1, sería una solución pero así no me vale.

Un método más ecolológico, sin matar a nada ni a nadie, es usar una tela aislante que impida el paso de las moscas. Me explico, ¿por qué no crear una función?

[CODE]Function Desconcatenar(cadena, num, separador, relleno)

' Devuelve el elemento indicado por num desde una cadena de texto.
' Usa el caracter separador para separar elementos de la cadena de texto.
' Si la cadena es de longitud cero devuelve el relleno.
Dim x As Variant
x = Split(cadena, separador)
If num > 0 And num - 1 <= UBound(x) Then
Desconcatenar = x(num - 1)
Else
Desconcatenar = relleno
End If

End Function[/CODE]

Si los valores de las celdas son:

A1 = 4,66,4,667,3,66,9,456,2,98

B1 = ,

C1 =

La llamada a la función:

=Desconcatenar(A1;4;B1;C1)

daría: 667

Se la voy a proponer a Microsoft para que en la versión Excel 2011 esté implementada!!! :mad:

Enlace a comentario
Compartir con otras webs

Hola:

Si me hubieras dado una macro mas general, no anclada a la fila 1, sería una solución pero así no me vale.

Me temo que va a ser que no. La macro corre correctamente para cualquier fila.

De hecho está adaptada a la primera imagen que proporcionaste, es decir, Texto en la columna 1, Separador en la columna 2, Auxiliar de relleno en la columna 3 y Resultados a partir de la columna 4.

La macro funciona con una selección de celdas de la columna 1.

fijate en la instrucción:

For x = 1 To Selection.Rows.Count[/CODE]

Hoy voy a ser bueno, y voy a colaborar con el "enemigo":

He hecho esta UDF con los parámetros que querías.

[CODE]Function DESCONCATENAR(Texto As Range, _
Posicion As Integer, _
Optional Separador As Variant = ",", _
Optional Auxiliar As Variant = "") As Variant
On Error GoTo Herror

If Texto.Columns.Count <> 1 Then Exit Function
Celdas = Split(Texto, Separador)
DESCONCATENAR = Celdas(Posicion - 1)
Exit Function

Herror:
DESCONCATENAR = Auxiliar
Resume Next
End Function
[/CODE]

[b]DESCONCATENAR(Texto; Número de celda a separar; [separador]; [Auxiliar de relleno])[/b]

Salu2. Macro Antonio.

PD: Me acabo de dar cuenta que ya habías desarrollado la UDF, pues ale, dos por el precio de una.

Enlace a comentario
Compartir con otras webs

Hola, parezco disco rayado pero la verdad este es un post fantastico por los aportes proporcionados.

Saludos.

Gracias fornelasa, la verdad es que con macros ya había un tema:

Macro para separar texto y valores en Distintas columnas

que Macro Antonio (hasta ayer conocido como Antoni Ayala) se encargó de resolver magistralmente, como siempre.

Lo que intento con este tema es ir por el camino de las fórmulas para quienes no tengan o no gusten de habilitar las macros...

Enlace a comentario
Compartir con otras webs

Crear una cuenta o conéctate para comentar

Necesitas ser usuario para poder dejar un comentario

Crear una cuenta

Registrarse para una nueva cuenta en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectarse

¿Ya tienes una cuenta? Conéctate aquí.

Conéctate ahora
  • 97 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola que tal amigos programadores por favor me podrían ayudar con una macro que me genere un archivo CSV delimitado por comas, la estructura del archivo CSV no deberá llevar encabezado, los datos del archivo CSV serán obtenidos de la hoja “Datos”. En la columna A: deberá tener la clave clues que se toma de la columna B de la hoja Datos En la Columna B: el Código (son 230 codigos que van del rango G1:IB1 de la hoja datos) En la Columna C: el valor almacenado a su correspondiente al código y clues En la Columna D: el número del mes que se obtendrá de la de la columna E de la hoja Datos En la Columna E: el año que se tomará de la columna F de la hoja de Datos   Son 230 códigos por lo que la macro generará 230 filas por cada clave clues que tenga la hoja Datos En el archivo anexo una hoja llamada CSV para que vean la estructura que tendrá, el archivo CSV estará delimitado por comas   Les agradecería mucho que me ayuden por favor, Dios los bendiga Exportar datos a csv.xlsx
    • Hola buenas tardes.   Debido al trabajo debo estar comparando en un periodo unos archivos dentro de una carpeta o subcarpeta. en base a la fecha de creacion o modificacion.  pero tengo que estar viendo carpeta por carpeta y aveces son varios. Con una macro intente  listar los archivos de cualquier carpeta y subcarpeta, esto activandolo segun la celdaactiva. El problema es que tiene algunos errores. 1. si la carpeta cuenta con subcarpetas me los manda a muchas filas abajo. Mi idea es hoja(Así debe quedar) Que con una macro pueda seleccionar la carpeta desde el buscador y me de la lista de archivos a partir de la fila 6. siendo columna A= fecha de modificación, columna B =Fecha de creación y columna C=Nombre del archivo con hiperlink. Con otro o con la misma macro poder seleccionar otra carpeta y sus subcarpetas, según sea el caso. y me liste a partir de la columna F de la fila 6 Siendo La columna F=Nombre del archivo, columna H=fecha de creación, columna I=ultima modificación   Para así poder acceder y comparar mis archivos, directamente desde excel.   Muchas gracias Mariano       Listar archivos de 2 carpetas para comparar.xlsm
    • Hola buenas, Os presento mis dudas. Tengo un libro  (llamémosle LibroDestino) con dos módulos, uno de definición de variables "ModDef" y otro de inicializacion de esas mismas variables "ModCfg". Necesito que al copiarme una hoja de otro libro(llamémosle LibroOrigen), mediante un procedimiento, sobrescribir el modulo de inicialización de variables del LibroDestino con el  contenido del módulo que hay en el LibroOrigen. Destacar que los dos módulos de cada libro tienen el mismo nombre "ModCfg". Y tienen una única variable llamada "Mensaje". En el LibroDestino tiene el valor "Hola" y en el LibroOrigen el valor "Adiós" Este procedimiento lo realiza perfectamente,  es decir se sobrescribe, pero si en el mismo procedimiento quiero utilizar el nuevo valor de esa variable, me conserva el valor de la variable anterior. Para hacer las comprobaciones he ejecutado un MsgBox al empezar y al acabar el procedimiento, pero en los dos casos me devuelve el valor original del LibroDestino el valor "Hola", cuando mi idea es que al sobrescribir el modulo con el nuevo valor de la variable, el último MsgBox me devuelva el valor "Adios". Mi objetivo es poder tener la inicialización de esas variables en un libro que no sea el de trabajo (LibroDestino), ya que según la hoja que importe puedo requerir que las variables tengan un valor u otro. ¿Por que no me coge en el procedimiento el nuevo valor de la variable? ¿Cómo podría conseguirlo? He tenido que activar en VBA  la referencia Microsoft visual basic for applications extensibility 5.3 desde  Herramientas -> Referencias. Creo que es la única manera de poder trabajar con los módulos desde VBA, aunque si se pudiera de otra manera creo que sería mas óptimo. Mil gracias de antemano, un saludo!         Libro1_Prueba.xlsm Libro2_Prueba.xlsm
    • Agradecido Antoni! Tus sugerencias me ayudaron mucho! Como pudiese hacerte llegar el archivo?
    • Prueba este código. Sin el archivo no te puedo ajustar más. Private Sub btnCargaBancos_Click() 'El tipo de dato debe especificase para cada variable Dim TasaCompra As Double, TasaVenta As Double, InvBanesco As Double, InvVzla As Double Dim MontoBanesco As Double, MontoVzla As Double, TasaDiaBan As Double, TasaDiaVzla As Double Dim TasaActual As Double 'Hay que comprobar que los textbox tienen contenido numérico 'Los datos numéricos solo pueden contener números y el separador decimal, cualquier otro caracter dará error al convertir If Not IsNumeric(txtInverBanesco) Or _ Not IsNumeric(txtInverVzla) Or _ Not IsNumeric(txtTasaCompra) Or _ Not IsNumeric(txtTasaVenta) Then MsgBox "Los datos deben ser numéricos", vbCritical Exit Sub End If InvBanesco = CDbl(txtInverBanesco) InvVzla = CDbl(txtInverVzla) TasaCompra = CDbl(txtTasaCompra) TasaVenta = CDbl(txtTasaVenta) 'Los datos de los divisores no pueden ser 0 (Indeterminación matemática) If TasaCompra = 0 Or _ InvBanesco = 0 Or _ InvVzla = 0 Then MsgBox "Los datos no admiten valor cero", vbCritical Exit Sub End If MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055) TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then TasaActual = TasaDiaBan Else TasaActual = TasaDiaVzla End If 'En VBA, los datos numéricos no admiten ser formateados, formatear directamente en las celdas, 'MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) 'MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) 'TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco = MontoBanesco txtBcoVenezuela = MontoVzla txtTasaDiaria = TasaActual End Sub  
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.