Saltar al contenido

Recommended Posts

publicado

Normalmente el auxiliar de relleno no será necesario introducirlo en las celdas separadas vacías ya que se usa su valor por defecto (espacio en blanco " " o string nula "").

En este caso la fórmula del post #16 se simplifica bastante:

=SIERROR(MED($A1;ENCONTRAR("
";SUSTITUIR($B1&$A1;$B1;"
";C$18));ENCONTRAR("
";SUSTITUIR($A1&$B1;$B1;"
";C$18))-ENCONTRAR("
";SUSTITUIR($B1&$A1;$B1;"
";C$18)));"")[/CODE]

En el caso más corriente de que el carácter separador sea la coma "," y sustituyendo la fila auxiliar por el número de celda a separar, resulta esta fórmula más simple:

[CODE]=SIERROR(EXTRAE(A1;ENCONTRAR("
";SUSTITUIR(","&A1;",";"
";2));ENCONTRAR("
";SUSTITUIR(A1&",";",";"
";2))-ENCONTRAR("
";SUSTITUIR(","&A1;",";"
";2)));"")[/CODE]

Este ejemplo es para separar el elemento 2 de la cadena de texto de la celda A1.

Solo falta sustituir 3 veces la cifra 2 por el elemento a separar y cambiar la celda A1 por la deseada.

Con el consentimiento tácito de sailepaty, adjunto el fichero anterior sin la columna con el carácter auxiliar.

NOTA: La función MED de Excel 2010 equivale a la función EXTRAE de versiones anteriores.

SepararTextoAlfanumerico2010.zip

publicado

Bajo las nuevas premisas anotadas por Pedro las formula que propuse quedarían de la siguiente forma.

Normalmente el auxiliar de relleno no será necesario introducirlo en las celdas separadas vacías ya que se usa su valor por defecto (espacio en blanco " " o string nula "").

=ESPACIOS(EXTRAE(SUSTITUIR($A1;$B1;REPETIR(" ";500));C$18;500))

En el caso más corriente de que el carácter separador sea la coma "," y sustituyendo la fila auxiliar por el número de celda a separar.
Este ejemplo es para separar el elemento 2 de la cadena de texto de la celda A1.

=ESPACIOS(EXTRAE(SUSTITUIR($A1;”,”;REPETIR(" ";500));1*500+1;500))

Ahora bien algunos comentarios; Las fórmulas propuestas por Pedro se tendrían que modificar para que funcionen en versiones de Excel anteriores a la 2007, esencialmente duplicando su tamaño por la necesidad de usar las funciones SI(ESERROR(…. en lugar de SIERROR(…..

En realidad en la mayoría de las ocasiones la longitud de la formula no determina la eficiencia de la misma, facilita si su mantenimiento y entendimiento.

Por ejemplo las propuestas de Pedro son mas rápidas en calculo que mi propuesta, inclusive la versión con las funciones SI(ESERROR( es ligeramente más rápida que la versión SIERROR(.

Sin embargo si el archivo que contiene la formula lo fuera a mantener otra persona, sin duda que recomendaría mi formula por la facilidad de mantenimiento.

Saludos

publicado
Bajo las nuevas premisas anotadas por Pedro las formula que propuse quedarían de la siguiente forma.

=ESPACIOS(EXTRAE(SUSTITUIR($A1;$B1;REPETIR(" ";500));C$18;500))

=ESPACIOS(EXTRAE(SUSTITUIR($A1;”,”;REPETIR(" ";500));1*500+1;500))

Ahora bien algunos comentarios; Las fórmulas propuestas por Pedro se tendrían que modificar para que funcionen en versiones de Excel anteriores a la 2007, esencialmente duplicando su tamaño por la necesidad de usar las funciones SI(ESERROR(…. en lugar de SIERROR(…..

En realidad en la mayoría de las ocasiones la longitud de la formula no determina la eficiencia de la misma, facilita si su mantenimiento y entendimiento.

Por ejemplo las propuestas de Pedro son mas rápidas en calculo que mi propuesta, inclusive la versión con las funciones SI(ESERROR( es ligeramente más rápida que la versión SIERROR(.

Sin embargo si el archivo que contiene la formula lo fuera a mantener otra persona, sin duda que recomendaría mi formula por la facilidad de mantenimiento.

Saludos

Estoy de acuerdo contigo en todo pero hay que tener en cuenta las limitaciones de estas fórmulas y, sobre todo, los límites de Excel para trabajar con strings: 32.767 caracteres en una celda.

En tus fórmulas sustituyes cada carácter separador por 500 espacios en blanco, por lo que una cadena de texto como:

1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,,,,,,,,,,,,,,,,,31,,,,,,,,,,,,,,,,,,,,,,,,,,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132

produce error: #¡VALOR! al necesitar más espacio por celda a separar del disponible.

Para abarcar más de 130 celdas a separar, puedes reducir el valor de sustitución 500 por uno más bajo. Para un valor de 100, llegarías a separar aproximadamente unas 650 celdas como máximo. ¿Por qué has empleado 500?

Mi solución es genérica y no requiere trabajar con strings muy largas por lo que es más eficiente espacial y temporalmente, ya que extrae el texto justo que se debe separar en cada elemento.

publicado
¿Por qué has empleado 500?

Simplemente fue el numero que se me vino a la mente y que funcionaba en el ejemplo propuesto, obviamente se puede reducir y evitar el error de Valor.

Mi solución es genérica y no requiere trabajar con strings muy largas por lo que es más eficiente espacial y temporalmente, ya que extrae el texto justo que se debe separar en cada elemento.

Eficiente si, genérica no. Que sucede con tu formula si el texto a evaluar contiene el carácter que utilizas en la función ENCONTRAR?

Nuevamente digo, por la diferencia no sustancial en eficiencia y facilidad de mantenimiento me inclino por mi propuesta.

Ustedes decidan, esta

=ESPACIOS(EXTRAE(SUSTITUIR($A1;$B1;REPETIR(" ";100));C$18;100))

O esta

=SI(ESERROR(MED($A1;ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18));ENCONTRAR("

";SUSTITUIR($A1&$B1;$B1;"

";C$18))-ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18))));"";MED($A1;ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18));ENCONTRAR("

";SUSTITUIR($A1&$B1;$B1;"

";C$18))-ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18))))

Saludos

publicado
Eficiente si, genérica no. Que sucede con tu formula si el texto a evaluar contiene el carácter que utilizas en la función ENCONTRAR?

Nuevamente digo, por la diferencia no sustancial en eficiencia y facilidad de mantenimiento me inclino por mi propuesta.

Ustedes decidan, esta

=ESPACIOS(EXTRAE(SUSTITUIR($A1;$B1;REPETIR(" ";100));C$18;100))

O esta

=SI(ESERROR(EXTRAE($A1;ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18));ENCONTRAR("

";SUSTITUIR($A1&$B1;$B1;"

";C$18))-ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18))));"";EXTRAE($A1;ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18));ENCONTRAR("

";SUSTITUIR($A1&$B1;$B1;"

";C$18))-ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18))))

Saludos

En mi fórmula sustituyo el separador por un salto de línea lo que para listas de números es genérico. He partido de que todos los casos de ejemplo no contenían strings en varias líneas. Es cierto que con strings conteniendo saltos de línea habría que sustituirlo por otro carácter o combinación de caracteres que no aparecieran en la cadena de texto.

Para Excel 2007 y 2010 la fórmula es más sencilla:

=SIERROR(MED($A1;ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18));ENCONTRAR("

";SUSTITUIR($A1&$B1;$B1;"

";C$18))-ENCONTRAR("

";SUSTITUIR($B1&$A1;$B1;"

";C$18)));"")

Y tu fórmula sería:

=RECORTAR(MED(SUSTITUIR($A1;$B1;REPETIR(" ";100));(C$18-1)*100+1;100))

Siempre partiendo de que en el rango C18:Q18 hay números enteros (1,2,3,..)

¿Has probado tu fórmula con textos de más de 100 caracteres? Como éste:

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111,2,3,4,5,6,7,8,9,10

Ya no sale el 2 en la segunda celda separada :mad:

publicado

Con respeto y buenas intenciones pregunto. Que es lo que tu ultimo post añade a lo ya planteado, ejemplificado y discutido anteriormente?

Ya se estableció cual es más eficiente, que no hay ninguna fórmula que sea genérica, cual es más fácil de mantener sin importar la versión de Excel que tengamos, en fin que nos falta?

A menos que alguien venga con otra propuesta me parece que la evaluación a tu formula y la mía se agoto.

Saludos

publicado
Con respeto y buenas intenciones pregunto. Que es lo que tu ultimo post añade a lo ya planteado, ejemplificado y discutido anteriormente?

Ya se estableció cual es más eficiente, que no hay ninguna fórmula que sea genérica, cual es más fácil de mantener sin importar la versión de Excel que tengamos, en fin que nos falta?

A menos que alguien venga con otra propuesta me parece que la evaluación a tu formula y la mía se agoto.

Saludos

¿Has probado tu fórmula con textos de más de 100 caracteres? Como éste:

11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 1111111111,2,3,4,5,6,7,8,9,10

Ya no sale el 2 en la segunda celda separada

publicado

Pedro, Pedro, me parece que ya quedo claro como se ajusta el problema de la longitud y de que no hay formulas genéricas.... Si se te ocurre algo nuevo en relación a este tema ven y postéalo, de otra forma sigamos adelante con otro tema.

Saludos

PD. No hace falta incluir en todas tus respuestas el total de las cita anterior.

publicado

Por lo que a mí respecta, sólo me queda dar las gracias a Macro Antonio, que ha contribuido con sus macros y UDF, a sailepaty por aportar su propia versión con fórmulas a este tema (lástima que no haya más propuestas) y a todos los usuarios lectores que se han interesado o se vayan a interesar en el futuro de cómo separar texto en celdas.

publicado

Hola sailepaty/pegones1

No lo han pedido pero si necesitan a un juez para decidir que formula es MEJOR O MEJOR, pues aqui estoy yo.....jejejeje

Veredicto:

sailepaty calificacion 10 y esta exento del examen final...jejejeje

pegones1 calificacion 10 y esta exento del examen final...jejejeje

Este post es de los que se agradecen, es ya uno de mis favoritos.

Saludos.

PD. En Mexico 10 es la calificacion mas alta.

Conéctate para comentar

Podrás dejar un comentario después de conectarte



Conéctate ahora
×
×
  • 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.