Macro para generar formato txt de acuerdo a ejemplo

De favor me podrían ayudar con la siguiente situación, ya que no he podido encontrarla, la situación es la siguiente:

Tengo un archivo en excel que debo convertir a txt, lo hago utilizando el siguiente código:

Sub Exportarfiletxt()
ruta = "D:\test.txt"
lastrow = Cells(Rows.Count, 1).End(xlUp).Row
Open ruta For Output As #1
For i = 1 To lastrow
Print #1, Cells(i, 1).Value; Cells(i, 2).Value; Cells(i,3).Value; Cells(i, 4).Value; Cells(i, 5).Value; Cells(i, 6).Value; Cells(i, 7).Value; Cells(i, 8).Value; Cells(i,9).Value; Cells(i, 10).Value; Cells(i, 11).Value; Cells(i, 12).Value; Cells(i, 13).Value; Cells(i, 14).Value; Cells(i, 15).Value
Next i
Close #1
End Sub

Pero me genera el txt de la siguiente manera:

y debería generarlo con el formato de la siguiente manera:

Les agradecería mucho, si alguien me pudiera orientar.

Anexo archivo xls, para mejor comprensión.Archivo de prueba

1 Respuesta

Respuesta
3

Por lo que veo, quieres una longitud exacta para cada columna. En la siguiente macro debes poner la longitud que necesitas para cada columna.

No conozco la longitud de tus columnas, así que estoy poniendo un ejemplo.


También por lo que veo, la columna 14 es un importe y lo quieres justificado a la derecha.

La macro tiene una función para los números y justificarlos a la derecha.


Pon todo el código en un módulo. Si alguna columna no está correcta, me comentas y lo reviso.

Sub GuardarTxt()
'Por.Dante Amor
  Dim ruta As String, car As String
  Dim i As Long, j As Long, k As Long, largo As Long
  Dim dato As Variant, cols As Variant
  '
  ruta = "C:\trabajo\test.txt"
  Open ruta For Output As #1
  'columnas       A   B  C  D  E   F  G  H  I  J  K  L  M   N  O
  cols = Array(0, 4, 20, 1, 2, 6, 12, 5, 4, 3, 2, 2, 2, 2, 25, 2)
  For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
    For j = 1 To Columns("O").Column
      dato = Cells(i, j).Value
      Select Case j
        Case 14
          dato = Formatear(dato, cols, j, "0.00")
      End Select
      largo = cols(j)
      If largo = 1 Then
        largo = Len(dato)
      End If
      For k = 1 To largo
        car = Mid(dato, k, 1)
        If car = "" Then car = " "
        Print #1, car;
      Next
      Print #1, ;
    Next
    Print #1,
  Next
  Close #1
  '
  MsgBox "Txt generado"
End Sub
'
Function Formatear(dato, cols, j, formato)
  Dim l As Long, m As Long, d As Long
  dato = Format(dato, formato)
  l = Len(dato)
  m = cols(j)
  d = m - l
  Formatear = String(d, " ") & dato
End Function

¡Gracias! , Funciona de manera excelente, como mencionas, solo lo adapte al tamaño que requería cada columna.

solo una duda, porque al inicializar el arreglo "cols" el primer valor es "0"?

Solamente por cuestión de orden. El índice de esos arreglos empiezan en 0, por eso al primer valor le asigno un 0. En el índice 1 va el valor de la columna A, ya que la columna A es 1, la B es 2 ...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas