Esta consulta la he recibido un par de veces, motivo por el cual levantaré una entrada al respecto. Resulta que muchos de mis lectores necesitan llevar los valores de una hoja de cálculos hacia un archivo TXT (texto plano), pero al momento de realizar esa migración los números deben presentarse de cierta forma (obviamente distinta a la que existe en la planilla), ya que interactúan con otros programas y/o sistemas.
Reciben una tabla que contiene: fecha, nombre e importe, mas o menos como la siguiente:
Y quieren que la exportación resulte en esto:
[+/-] Ver el resto / OcultarVeamos las diferencias entre la tabla de nuestra planilla y el txt:
1) las fechas están invertidas (año, mes, día)
2) el campo "nombre" tiene una longitud fija de caracteres
3) el campo "importe" tiene una longitud fija de caracteres, se han eliminado los separadores decimales y, hacia la izquierda, se completó toda la cadena de texto con ceros.
Estos formatos son muy requeridos por sistemas que utilizan ciertas bases de datos, ya que luego los "levantan" desde ese TXT. Ahora bien, si tenemos que hacer esta tarea registro x registro (dar vuelta las fechas, agregar espacios hasta completar la longitud del nombre, quitar separadores decimales y agregar ceros, etc, etc)... sencillamente nos volveríamos locos y el trabajo estaría propenso a errores.
Intentaremos dar una solución utilizando las funciones de Excel, sin macros. Iremos tratando campo x campo y viendo la forma mas sencilla de llevar a cabo esta labor. Empecemos.
1) Dar vuelta las fechas:
=AÑO(A2)&MES(A2)&DIA(A2)
¿Sencillo, no? Concateno el año, mes y día de la fecha presente en A2. El resultado:
Bien, nos enfrentamos al primer problema: ahí dice "1974112", cuando en realidad debería decir "19740112"....al mes le falta el 0. Y, para adelantar problemas, desde ya les digo que con el día pasa lo mismo: si es menor a 10, omite colocar el 0. Y la vamos a arreglar de una forma muy sencilla:
=AÑO(A2)&SI(MES(A2)<10;"0"&MES(A2);MES(A2))&SI(DIA(A2)<10;"0"&DIA(A2);DIA(A2))
Dentro de esa concatenación agregamos dos funciones SI(), que evalúan: si el día o mes es menor a 10, coloca un 0 (cero) delante, caso contrario coloca el mes o día tal cual está. ¿El resultado?:
listo, ya tenemos al mes (menor a 10) con su respectivo 0 por delante.
2) Campo nombre: que tenga una longitud fija de 30 caracteres, completando con espacios en blanco hasta alcanzar dicha cantidad.
Veamos: "damian" tiene 6 letras, o sea que faltan 24 espacios en blanco para que dicho registro tenga la longitud total de 30 caracteres que nos exige el área de sistemas. Bien, la función sería:
=B2&REPETIR(" ";(30-LARGO(B2)))
Por partes: primero coloco el valor de B2 ("damian", en este caso) y luego le concateno la función REPETIR(), pasando como primer argumento un espacio en blanco. Como segundo argumento le brindo la cantidad de veces que quiero que repita esos espacios en blanco, restando a 30 la longitud de "damian" (o el valor que exista en B2). En la nueva tabla ahora tengo todos los nombres con el largo deseado y con espacios en blanco que rellenan hasta alcanzar esa cantidad:
¿Como sabemos si está funcionando? Provisoriamente utilizaré la columna G con la función LARGO(), para mostrales que, independientemente del largo del nombre, la cantidad total de caracteres es igual a 30:
bien, otro tema solucionado.
3) Quitar el separador decimal de los números, hacerlos de longitud fija completando con ceros hacia la izquierda hasta alcanzar los 20 caracteres... y algo mas.
Si hago:
=ENTERO(C2), obtengo solamente la parte entera: 100.
Si luego efectúo: =(C2-ENTERO(C2))*100, obtengo: 23. En esta parte resto 100,23 - 100, lo que me da 0,23, que al multiplicarlos por 100 me arrojan al final lo 23 centavos.
Pero cuando intento concatenar surgen problemas:
definitivamente esos decimales nos complican la vida
Entonces haremos uso de la función TEXTO(valor, formato) para definir mejor las cosas y obtener los resultados deseados:
=TEXTO(ENTERO(C2);"000000000000000000")&TEXTO(((C2-ENTERO(C2))*100);"00")
Analicemos: lo único que hice fue agregar a TEXTO() antes de cada separación, indicándole en el primer caso que el formato es de 18 ceros y, en el segundo, de 2 ceros. Así completo los 20 caracteres que me requiere el campo (rellenos con ceros) y a la vez quito el separador decimal:
ahora sí.
¿Comparamos ambas tablas?
tal cual lo requerido.
Si alguno de mis lectores necesita llevar a cabo esta tarea con macros, solo me avisa y levanto el post. El objetivo de haber solucionado este problema con funciones es brindar ayuda a los lectores que no son programadores, pero sí conocedores de las funciones y demás herramientas de Excel. Para simplificar las cosas hice todo en una misma hoja, pero sería conveniente que la tabla con las funciones estén en otra o bien en un libro distinto, a los fines de poder exportarla hacia TXT sin problemas. (archivo / guardar como / tipo de archivo: texto).
Ya sabemos como repetir caracteres una determinada cantidad de veces o bien usar a TEXTO() para que cumpla con dicho cometido, en el caso de los números. Vimos como concatenar con el signo &, usando a la vez funciones condicionales. ¿Es la única forma de hacerlo? No, de ninguna manera, existen cientos de maneras distintas de encarar estos problemas, pero en esta entrada traté de mostrar algo sencillo con funciones comunes y poco complicadas. La idea central pasa por conocer estas alternativas que se encuentran al alcance de todos.
Salu2, y cualquier cosa me avisan. Gracias por los mails y mensajes que recibo a diario, son un gran apoyo a la tarea de llevar este blog adelante. Link al archivo.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Funciones
Etiquetas:
Funciones
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios
Publicar un comentario