EXPORTAR ARCHIVOS TXT DE ANCHO FIJO DESDE EXCEL

Siguiendo con el post anterior de exportar .txt delimitado por caracteres, hoy toca hacer referencia a los archivos .txt de ancho fijo.

Cuando hablamos de ancho fijo queremos decir que cada campo ingresado en nuestro .txt tiene un ancho específico, es decir: la longitud del propio elemento más el carácter específico con el que queramos rellenar hasta llegar al ancho deseado.

Como norma general, cuando hablamos de texto, debemos rellenar espacios en blanco por la derecha y cuando hablamos de números, ceros por la izquierda. Pero en cualquier caso, esto lo encontraréis en las especificaciones que suelen acompañar a los .txt

Rellenar ceros por la izquierda ya lo habíamos visto en otra entrada, y podríamos utilizar esta fórmula perfectamente para realizar nuestra macro (también por la derecha cambiando el orden de la fórmula), os recuerdo que la fórmula era esta:

.Cells(i, 2) = WorksheetFunction.Rept("0", 15 - Len(.Cells(i, 1))) & .Cells(i, 1)

si quisiésemos que fuese por la derecha solo hay que cambiar el orden:

.Cells(i, 2) = .Cells(i, 1) & WorksheetFunction.Rept("0", 15 - Len(.Cells(i, 1)))

Pero para el caso de hoy vamos a utilizar dos funciones específicas para cada caso, para añadir caracteres a la izquierda y a la derecha. Siguiendo con el ejemplo del post anterior, nos piden un archivo txt de ancho fijo con las siguientes especificaciones para cada uno de los campos:

El Campo1 (Marca) debe tener una longitud de 20 caracteres a la derecha, y se rellena con espacios en blanco.
El Campo2 (Carburante) debe tener una longitud de 23 caracteres a la derecha, y se rellena con espacios en blanco.
El Campo3 (Comunidad autónoma de residencia) debe tener una longitud de 28 caracteres a la derecha, y se rellena con espacios en blanco.
El Campo4 (Total) debe tener una longitud de 4 caracteres a la izquierda, y se rellena con ceros.

Pues bien, vemos antes de nada la macro y luego las dos funciones que vamos utilizar:

Sub EXPORTAR_TXT_ANCHOFIJO()
Dim i As Double
'Creamos automáticamente un .txt en blanco que llamamos EJEMPLO
'el archivo se creará en la misma unidad que tenemos el Excel.
Archivo_txt = ThisWorkbook.Path & "\" & "EJEMPLO.txt"
'si queremos cambiar su ubicación basta con poner Archivo_txt = "E:\EJEMPLO.txt"
Open Archivo_txt For Output As #1
With Sheets(1)
fin = Application.CountA(Range("A:A"))
For i = 2 To fin
'Asignamos a cada Campo la función que necesitamos aplicar
Campo1 = C_Der(.Cells(i, 1), 20)
Campo2 = C_Der(.Cells(i, 2), 23)
Campo3 = C_Der(.Cells(i, 3), 28)
Campo4 = C_Izq(.Cells(i, 4), 4)
Print #1, Campo1 & Campo2 & Campo3 & Campo4
Next i
Close
End With
End Sub

Como podéis observar solo tendremos que aplicar a cada campo la función que necesitemos y especificar la longitud de la cadena que le queremos pasar.

Las funciones que vamos a utilizar son dos: Rellenar caracteres por la izquierda:

Function C_Izq(ByVal sCadena As String, ByVal nLargo As Integer, Optional sCaracter As Variant) As String
'Creamos cadena para rellenar por la izquierda con el caracter indicado
Dim sValor As String
If IsMissing(sCaracter) Then sCaracter = "0"
sCadena = Trim(sCadena)
If Len(sCadena) > nLargo Then sCadena = Right(sCadena, nLargo)
sValor = String(nLargo - Len(sCadena), sCaracter) & sCadena
C_Izq = sValor
End Function

Y rellenar caracteres por la derecha:

Function C_Der(ByVal sCadena As String, ByVal nLargo As Integer, Optional sCaracter As Variant) As String
'Creamos cadena para rellenar por la derecha con el caracter indicado
Dim sValor As String
If IsMissing(sCaracter) Then sCaracter = Space(1)
sCadena = Trim(sCadena)
If Len(sCadena) > nLargo Then sCadena = Left(sCadena, nLargo)
sValor = sCadena & String(nLargo - Len(sCadena), sCaracter)
C_Der = sValor
End Function

Una vez que hayamos aplicado la macro, se creará en la misma carpeta o ubicación de nuestro archivo Excel un .txt denominado “EJEMPLO” con la siguiente información:

EXPORTAR ARCHIVOS TXT DE ANCHO FIJO

Efectivamente, ya tenemos nuestros datos correctamente escritos en nuestro archivo de texto 🙂

Y con este post finalizamos cuatro capítulos dedicados a los .txt, espero que os sean de utilidad.

Descarga el archivo de ejemplo pulsando en: EXPORTAR ARCHIVOS TXT DE ANCHO FIJO DESDE EXCEL

 

Anuncios

16 pensamientos en “EXPORTAR ARCHIVOS TXT DE ANCHO FIJO DESDE EXCEL

  1. Hola, como puedo hacer para que una tabla con el formato de 3 columnas “nombre” “edad=20” y “peso=70”, se convierta en base de datos “nombre” “edad=20” y en la siguiente linea “nombre” “peso=70”
    Es decir, que repita el nombre x cantidad de veces (una vez por linea) de acuerdo a las columnas que tiene, en este caso 2, pero si tengo mas características o datos en mas columnas, se tiene que reperir el primer nombre las veces que tenga datos en las columnas . Muchas Gracias. Muy buen aporte

    Me gusta

  2. Hola, tengo una duda. Al exportar una columna de datos de tipo fecha-hora-min (dd/mm/aaaa:hh:mm), en la hoja de texto me coloca por defecto el formato de dd/mm/aaaa hh:mm:ss (am/pm) quisiera, solo guardar la configuración tal cual está en mi hoja excel, ¿cómo podría hacer?

    Me gusta

    • Hola Josua:

      Para eso, debes darle el formato que necesites en el código, por ejemplo así:
      Format(Campo3, “m/d/yyyy h:mm”) , sin los segundo y sin am/pm.
      Saludos.

      Me gusta

  3. Buenas tardes Segu, Muchas Gracias por compartir esta macro me a sido de mucha utilidad, Es mas estoy acondicionando para mi proyecto pero tengo dos dudas quisiera saber si me puedes asesorar,
    1 como hago para leer el encabezado osea la primera fila pero de forma independiente al resto de las columnas, Yo se que se podría leer empezando el For i = 1 desde uno pero el problema es que el encabezado debe tener espacios distintos o condiciones aperte del resto del columnas, De hay en adelante no tendría problema ya todos las columnas deben tener las mismas condiciones.

    2. La otra inquietud es como hago para condicionar algunas columnas ejemplo si en la primera columna encuentra un Cero (0) que me lo cambie por (0.000) la condición no seria para una celda si no para toda columna en general.

    Quedo atento a sus comentarios muchas Graciasss.

    Me gusta

    • Hola Carlos:, gracias a ti por comentar : )

      Sobre la primera pregunta, creo con un if lo puedes solucionar fácilmente, del tipo:

      For i = 1 To fin
      If i = 1 Then
      else
      end if
      print

      Es decir, comienzas la macro en la fila 1 y condicionas el valor de la variable a que cuando sea 1 aplicas X formatos, y si es distinto de 1 el resto.

      Sobre la segunda pregunta, debes utilizar otro condicional: If campo1 = 0 Then campo1 = “0.000”

      Saludos.

      Le gusta a 1 persona

      • Buenas tardes SEGU;
        Agradecido de todo corazón por responder mis Inquietudes, La segunda pregunta ya quedo resuelta muchas Gracias De Nuevo. Pero en la primera pregunta no pude asignarle el formato ya que si le asigno un valor o formato al for iniciando en 1 me va modificar todo la columna, y a lo que quiero llegar es que en la primera FILA ejemplo A1, B1, C1, D1 o RANGO(A1 hasta U1) para poder asignarles sus números de espacios o formato para cada celda ya que son distintos a los asignados de la fila dos (2) en adelante ya que todos lo campos son iguales en cada columna.

        En conclusión ya tengo listo el archivo de la fila dos en adelante no se realmente si me toca insertar otro ciclo independiente para poder leer la información de la primera fila y sus celdas esto para poder indicar los espacios puntuales que debe llevar el encabezado del archivo. Te adjunto las imágenes y los archivos TXT de como llevo el proyecto y a que debo llegar, En lo que me puedas ayudar te agradezco en el alma, Feliz Noche.
        Enlace Drive https://drive.google.com/drive/folders/1cCE4eFw5zewe_01ul52Kvkhk6od6faYJ?usp=sharing

        Me gusta

        • Hola Carlos:

          ¿Has probado a introducir el condicional, tal y como te comentaba en la respuesta anterior?, lo tendrías que hacer así:

          With Sheets(1)
          fin = Application.CountA(Range("A:A"))
          For i = 1 To fin
          If i = 1 Then
          Campo1 = C_Izq(.Cells(i, 4), 4) & "hola "
          Campo2 = C_Izq(.Cells(i, 4), 4) & "adios "
          Campo3 = C_Der(.Cells(i, 1), 20) & ":)"
          Campo4 = Now
          Else
          'Asignamos a cada Campo la función que necesitamos aplicar
          Campo1 = C_Der(.Cells(i, 1), 20)
          Campo2 = C_Der(.Cells(i, 2), 23)
          Campo3 = C_Der(.Cells(i, 3), 28)
          Campo4 = C_Izq(.Cells(i, 4), 4)
          End If
          Print #1, Campo1 & Campo2 & Campo3 & Campo4
          Next i

          En el if indica en los primeros campos la estructura que quieres para la primera fila, después del else el resto.

          Así debería funcionarte.

          Saludos.

          Le gusta a 1 persona

  4. Buenas noches Segui; Muchas gracias por la respuesta me fue de mucha ayuda, Me puedes por favor ayudar con la siguiente duda tengo una celda donde viene la siguiente información; febrero de 2018 y necesito pasarlo cuando que cuando se convierta quede con el siguiente formato de fecha YYYY-MM osea queda ASi; 2018-02 pero el inconveniente es por que una parte de la información la trae en STRING el mes y el año si viene en numero, Actualmente lo tengo con la siguiente condición, If Campo15 > 1 Then Campo15 = Format(Date, “yyyy-mm”) Esta perfecto por que me trae la fecha actual y mes y año pero el problema es que tiene leer es el mes y el año que viene en la celda no me sirviria de esa forma, Ya que en la celda podría venir cualquier mes del año y esto ocurre con el año puede ser cualquier año, La pregunta señor SEGUI como capturo el año y el mes de la celda si viene de la siguiente forma noviembre de 2017, Se podría traer la información y que quede 2017-11, Agradezco su colaboración con esta consulta, Muchas Gracias felices pascuas.

    Me gusta

    • Buenas tardes Segui Espero que este bien, Otra opción que esta pensando referente al comentario anterior es como ya sabemos que el problema fundamental es que la funciones no reconocen la celda como fecha es por el (de) que viene siempre en la mitad de la celda EJEMPLO; febrero de 2017 o también puede ser, diciembre de 2015, enero de 2016 osea el problema es el de, Te pregunto señor SEGUI si hay algún condicionante que puede eliminar esa palabra (de) ya que si quedara ejemplo febrero 2018 o marzo 2015 omitiendo la palabra (de) funcionaria la función para llegar al YYYY-MM (2018-02) con la función CDate probé y me funciono sin el (de) se podría eliminar de la celda para que la función fecha funcione bien, Agradecería su asesoría o guía con esta consulta, Gracias por su atención.

      Me gusta

      • Puedes hacerlo así:

        Fecha = Format(Replace(dato, " de ", " "), "yyyy-mm")

        Donde dato es la fecha en texto que tu tienes, febrero de 2017. Lo que hacemos es reemplazar el de (ojo con los espacios) por un espacio vacío, eliminando finalmente el “de”. Luego aplicamos el formato que indicas.

        Lo he probado y funciona perfectamente.

        Saludos.

        Le gusta a 1 persona

  5. Buenas noches Segu, Espero que este bien, Quiero agradecerle por responder mis comentarios fueron de Gran ayuda y pedirle también disculpas por tanta molestia, Por ultimo Quiero preguntarle qui si conoce alguna forma de que no me guarde el archivo en la ubicacion donde tengo la macro, Me gustaría que me genere el cuadro de dialogo de “guardar como” para que el usuario indique el nombre del archivo y la ubicación donde lo quiera guardar, Tengo entendido que se realiza con la función (application.filedialog(msofiledialogsaveas).show) Agradezco su colaboración y asesoría, Muchas Gracias por todo.

    Me gusta

¿Te ha gustado?. Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s