Saltar al contenido

Separar texto alfanumérico en celdas con el separador personalizado


pegones1

Recommended Posts

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

¿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

Enlace a comentario
Compartir con otras webs

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:

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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.

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
  • 96 ¿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

    • Si  no me he liado con los paréntesis: Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False Application.Calculation = xlManual Application.EnableEvents = False If Not Intersect(Target, Range("$L$5:$Y$9")) Is Nothing Then Range("E22") = WorksheetFunction.Sum(Range("E4:E21")) Range("E23") = WorksheetFunction.Sum(Range("E4:E19")) Range("E24") = Range("E23") - WorksheetFunction.Sum(Range("I4:I7")) Range("I22") = WorksheetFunction.Sum(Range("I4:I21")) Range("I4") = Range("E23") * 0.1 Range("I5") = Range("EN10") * Range("EN11") Range("I6") = Range("E23") * 0.0127 Range("I7") = Range("E23") * 0.006 Range("I25") = Range("E22") - Range("I22") Range("I12") = Range("E24") * 0.03 Range("C7") = Range("EQ8") - Range("EQ9") + Range("EN13") + Range("EN14") + Range("EN15") + Range("EN16") Range("C9") = Range("EQ9") + Range("EN17") + Range("EN18") + Range("EN19") Range("E7") = Range("E4") / Range("C4") * 7 / 44 * 1.5 * Range("C7") Range("E8") = Range("E4") / Range("C4") * 7 / 44 * 0.3 * Range("C8") Range("E9") = Range("E4") / Range("C4") * 7 / 44 * 1.3 * 1.5 * Range("C9") End If Application.Calculation = xlAutomatic Application.ScreenUpdating = True Application.EnableEvents = True End Sub  
    • Hola de nuevo a ambos, @daren, tu archivo lleva excesivos datos, que creo no son necesarios para la información final que buscas. Te subo otro archivo, simplificado al máximo, que, si lo he entendido bien, con esta fórmula simplificada: =CONTAR.SI('Casos de Prueba'!I:I;"OK")*('Casos de Prueba'!I1="Resultados Ciclo "&COLUMNA(A5)) se calcularía el primer dato, que se encuentra en la columna I. Copiando la fórmula a la derecha las celdas que necesites, se completaría el rango.  Tu fórmula la coloco en D7, y esta nueva en D9, que como ves (si, repito, he interpretado bien lo que buscas), da los mismos resultados. ---------------------------------------------------------------- En cuanto a: Aquí tienes, en el mismo archivo (Hoja 3) lo que devuelve tu fórmula cuando hay un determinado dato en A1 y en B2. No llego a entender qué es lo que quieres exactamente.  Tal vez con una pequeña explicación de lo que esperas obtener, sea suficiente para poner el hilo a la aguja. ? ----------------------------------------------------------------- En el caso de que falte por añadir o evaluar alguna otra variable o parámetro (en tu primer post hablabas sólo de 'OK' y ahora veo que en el archivo figuran además 'KO' y 'BLOCK'), por favor, intenta emular el ejemplo del archivo que estoy subiendo; añade EXCLUSIVAMENTE esos datos en la hoja allá donde proceda, explicando dónde o cómo deben contarse o sumarse. Mejor trabajar siempre con datos anónimos y reducidos. Desconozco si en tu archivo alguno de esos datos puede considerarse confidencial, pero seguro que no interesan a nadie. Mucho mejor obviarlos. Saludos, Plantilla V3 (B).xlsx
    • buenas noches, quisiera saber si puedo mejorar mi macros que se encuentra en el evento change de la hoja de calculo de Excel, son códigos de cálculos básicos, además si me pudieran ayudar a reducir el código o darme algún tip para reducirlo yo mismo estaría muy agradecido.  de ante mano muchas gracias     Private Sub Worksheet_Change(ByVal Target As Range)     Application.ScreenUpdating = False     Application.Calculation = xlManual     Application.EnableEvents = False              If Not Intersect(Target, Range("$L$5:$Y$9")) Is Nothing Then             Sub todo()          Range("E22") = WorksheetFunction.Sum(Range("E4:E21"))     Range("E23") = WorksheetFunction.Sum(Range("E4:E19"))     Range("E24") = WorksheetFunction.Sum(Range("E23") - WorksheetFunction.Sum(Range("I4:I7")))     Range("i22") = WorksheetFunction.Sum(Range("I4:I21"))     Range("I4") = Range("E23") * 0.1     Range("I6") = Range("E23") * 0.0127     Range("I5") = Range("EN10") * Range("EN11")     Range("I7") = Range("E23") * 0.006     Range("I25") = Range("E22") - Range("I22")     Range("I12") = Range("E24") * 0.03     Range("C7") = WorksheetFunction.Sum(Range("EQ8") - (Range("EQ9"))) + Range("EN13") + Range("EN14") + Range("EN15") + Range("EN16")     'Range("E7") = WorksheetFunction.Sum(Range("C7") * ((Range("E4") * 0.0077777)))     Range("C9") = Range("EQ9") + Range("EN17") + Range("EN18") + Range("EN19")     'Range("E9") = WorksheetFunction.Sum(((((Range("E4") / Range("C4")) * 7) / 45) * 1.3) * 1.5) * Range("C9")     'Range("E8") = WorksheetFunction.Sum(((((Range("E4") / Range("C4")) * 7) / 45) * 0.3)) * (Range("C8"))     Range("E9") = WorksheetFunction.Sum(((((Range("E4") / Range("C4")) * 7) / 44) * 1.3) * 1.5) * Range("C9")     Range("E8") = WorksheetFunction.Sum(((((Range("E4") / Range("C4")) * 7) / 44) * 0.3)) * (Range("C8"))     Range("E7") = WorksheetFunction.Sum((((Range("E4") / Range("C4")) * 7) / 44) * 1.5) * Range("C7")          End Sub              End If                  Application.Calculation = xlAutomatic     Application.ScreenUpdating = True     Application.EnableEvents = True     End Sub
    • Buenas perdonad la espera adjunto el fichero Excel y explico mas detallado lo que me solicitan: Lo que me solicitan es que esos CP de la pestaña Casos de prueba los cuales tienen formulas para que cuando se copien y peguen junto a sus pasos el CP se va autoincrementando a 1,2,3 etc...., pero si copias ese CP bien solo con el primer paso o con todos sus  pasos y lo insertas entre dos CP no continua con la numeración, como se ve en la foto al hacer eso el CP insertado continua con la numeración CP2 y el de abajo pone también CP2 no se incrementa ni ese ni el valor de CU que hay a la derecha que también es incremental. Necesitaría que continuara con esa numeración aun insertándolo entre medio de 2 tanto el CP como el CU de la derecha. También me solicitan que el campo Ciclo 1 de la pestaña Resumen es auto incremental cuando copias y pegas va sumando 1, pero en las formulas referentes a Ok KO Y bloqueo al copiar y pegar se mantiene la misma formula , la idea es que cuando copies y pegues la fila donde están los ciclos se autoincremente Ciclo a 1,2,3,4 etc... y la formula de los campos OK,KO y Bloqueos se incremente también pasando de la columna I a la J  luego a la k etc... y que en Resultados Ciclo el numero de la formula también se incremente Resultados Ciclo 1 , 2 ,3 etc... que cambie la columna a la vez que el numero de Resultados Ciclo. Gracias por adelantado un saludo. Plantilla v3 Pruebas.xlsx  
    • Saludos amigos espero estén bien Estoy intentando hacer un formulario que me convierta unidades de masa sin embargo  en el mejor de los casos solo he podido lograr la conversión de una unidad a la vez en los TextBox 1, 3, 5, 7, 9, 11 y 13 y cuando lo logro el resultado que se copia  en la celda no se corresponde con el obtenido originalmente en el Textbox del Formulario (frmconv)  ejemplo al convertir 1900 Kg a Lb el resultado en el TextBox1 =4188,78298142 sin embargo al guardar el resultado lo que se copia en la Celda  "F11" es  418.878.298.142,00, adicionalmente el resultado de la conversión no se visualiza inmediatamente por lo que debo de hacer click en los TextBox 1, 3, 5, 7, 9, 11 y 13  para ver el resultado. Mucho les sabre agradecer la ayuda que me puedan brindar. PRUEBA.xlsm
  • 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.