Crear fichero plano a partir de excel

Partiendo de un ciertos datos existentes en un extracto bancario en excel y otros datos fijos que no aparecen en él debo crear un fichero de datos plano (.txt o .dat) para poder importar el extracto a un programa de contabilidad en forma de asientos contables. Mi pregunta es si eso es posible utilizando vba, ya que me encuentro dos problemas: Por un lado no consigo dar formato a las variables (al ser un fichero plano deben tener una longitud dada que debo completar con espacios y/o ceros) y por el otro no encuentro ninguna herramienta que me permita crear el archivo de salida.
Gracias anticipadas por la ayuda.
{"lat":41.3992129552362,"lng":2.1630859375}

1 respuesta

Respuesta
Si es posible hacer eso que pides tal vez creando una macro que te una los campos que tienes en excel y creando el txt, para ayudarte un poco más necesitaría el archivo donde tienes la base de datos en excel así como la cantidad de caracteres que debe de tener cada una de las columnas antes de exportarlo al txt. Si quieres me lo puedes mandar al siguiente correo [email protected].
No puedo mandar el archivo original puesto que son datos privados, pero en realidad debe servir cualquier extracto bancario. De la hoja donde esté el extracto preguntaré al usuario en qué columnas están los datos que interesan (p.e. la fecha en la columna B, el importe en la F y el concepto en la D) y a partir de ahí montaré el fichero de salida. Sobre la cantidad de caracteres pongo los tres casos que me encuentro:
El campo "concepto" debe tener 30 caracteres de largo. La columna concepto del extracto original puede ser más larga, y deberé acortarla a 30, o más corta y deberé completar hasta los 30 con espacios. "Recibo" debe convertirse en "Recibo ".
El campo "cuenta" debe ser solo numérico y tener 12 caracteres de largo. Si en origen el valor es, por ejemplo "572" deberé completar con ceros a la derecha hasta tener "572000000000"
El campo "importe" debe tener 14 caracteres de largo y se compone de un signo + o -, una parte entera de diez dígitos con ceros a la izquierda, un punto decimal y dos dígitos más para la parte decimal, de manera que -117,3 debe quedar como "-0000000117.30".
Un saludo.
Se me hace muy difícil poderte explicar sin tener un archivo base para partir de ahí a hacer lo que pides, pero te trataré de explicar. Suponiendo que en Excel tienes la hoja1 que contiene la base de datos la cual quieres pasar a un txt, en esta hoja tendríamos tres columnas concepto(30), cuenta(12) e importe(14), entre paréntesis puse la cantidad de caracteres que debe de tener cada columna en el txt, bueno podemos mediante una super fórmula condicional concatenar las tres columnas con la cantidad de caracteres requerida, quedaría algo así:
=si(largo(a2)>30,izquierda(a2,30),si(largo(a2)=30,a2,si(largo(a2)<30,a2&consultav(largo(a2),hoja2!a:b,2,0),"")))&" "&si(largo(b2)>12,izquierda(b2,12),si(largo(b2)=12,b2,si(largo(b2)<12,b2&consultav(largo(b2),hoja2!d:e,2,0),"")))&" "&si(largo(si(izquierda(med(c2,1,encontrar(".",c2,1)-1),1)="-",med(c2,2,encontrar(".",c2,1)-2),med(c2,1,encontrar(".",c2,1)-1))&"."&si(largo(med(c2,encontrar(".",c2,1)+1,2))<2,med(c2,encontrar(".",c2,1)+1,2)&"0",med(c2,encontrar(".",c2,1)+1,2)))<14,si(c2>0,"+","-")&consultav(largo(si(izquierda(med(c2,1,encontrar(".",c2,1)-1),1)="-",med(c2,2,encontrar(".",c2,1)-2),med(c2,1,encontrar(".",c2,1)-1))&"."&si(largo(med(c2,encontrar(".",c2,1)+1,2))<2,med(c2,encontrar(".",c2,1)+1,2)&"0",med(c2,encontrar(".",c2,1)+1,2))),hoja2!g:h,2,0)&si(izquierda(med(c2,1,encontrar(".",c2,1)-1),1)="-",med(c2,2,encontrar(".",c2,1)-2),med(c2,1,encontrar(".",c2,1)-1))&"."&si(largo(med(c2,encontrar(".",c2,1)+1,2))<2,med(c2,encontrar(".",c2,1)+1,2)&"0",med(c2,encontrar(".",c2,1)+1,2)),si(izquierda(med(c2,1,encontrar(".",c2,1)-1),1)="-",med(c2,2,encontrar(".",c2,1)-2),med(c2,1,encontrar(".",c2,1)-1))&"."&si(largo(med(c2,encontrar(".",c2,1)+1,2))<2,med(c2,encontrar(".",c2,1)+1,2)&"0",med(c2,encontrar(".",c2,1)+1,2)))
Después para pasarlo al txt solo quedaría copiar el contenido de la columna en donde se encuentra la fórmula y pegarlo en un block de notas y quedaría así como lo solicitas, te comento que todo esto lo podríamos meter a una macro para automatizarlo más pero con los recursos que me das me es difícil ir un poco más allá.
Reeevisalo y si esto te es satisfactorio finaliza y califica por favor la respuesta, de lo contrario estoy a tus ordenes.
Como dije buscaba un método para conseguirlo mediante una macro de VBA, por lo que tu respuesta desgraciadamente no me es útil. Finalmente conseguí tanto dar formato como grabar a un archivo txt por mi mismo. De todas maneras te agradezco el esfuerzo realizado y espero poder contar contigo en próximas consultas. Para quien pueda servirle adjunto las soluciones que he aplicado a los dos problemas. No se si serán las más idóneas pero son completamente funcionales:
Para dar formato añadiendo cualquier carácter a derecha o izquierda del texto deseado primero les concateno delante o detrás según el caso el máximo de caracteres que puede tener el campo y recorto el sobrante con las funciones left o right. Así por ejemplo
Right("00000" & Var1, 5)
Devuelve "00105" para un valor entrante "105"
y
Left(Var1 & "000000000000", 12)
Devuelve "572000010000" para un valor entrante de "57200001"
Para dar formato al número es aún más sencillo ya que solo necesito usar la función format, añadir un signo positivo o negativo según el caso y sustituir la coma decimal por un punto:
Replace("+" & Format(Var1, "0000000000.00"), ",", ".")
Devuelve "+0000001529.60" para un valor entrante de "1.529,6"
Un dato a tener en cuenta es que para mis necesidades, a pesar de contener datos numéricos las variables deberían tener formato de texto, por tanto en los ejemplos anteriores Var1 está definida como String. Probablemente si estuviera definida de otro modo el código devolvería algún error.
En cuanto a grabar los resultados en un archivo de texto el proceso es el siguiente:
'Creo el archivo de salida, el #1 es el identificador por el que nos referiremos al archivo de salida en adelante
Open "nombrearchivo.txt" (obviamente se puede sustituir el literal por una variable) For Output As #1
'Cada vez que queramos grabar una linea en el archivo
Print #1, "texto literal entre comillas" & variable1 & "texto2" & variable2 & variable3...
'Una vez acabado el proceso cerramos el archivo
Close #1
Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas