Busco Macro para guardar excel como txt delimitado por pipes, que pueda determinar cantidad de caracteres por columna

Tengo planilla excel que necesito transformar a TXT delimitado por pipes. Obtuve una, pero necesito que la cantidad de caracteres de algunas de ellas tengan un tamaño determinado. Ejemplo:

Este es formato que debería tener

23/01/2017|E|114215                    |D|     2861.00|       100.42|     0|      28.490000|           0.00|23/01/2017|Eg.Caja|413|Patrimonio- DGI DGI| 1|4|

Este es el formato que obtengo

23/01/2017|E|114214|D|2861|100.42|0|28.49|0|23/01/2017|Eg.Caja|413|Patrimonio-DGI|1|4

1 respuesta

Respuesta
2

Puedes decirme lo siguiente.

  • En qué fila empiezan los datos
  • En qué columna empiezan los datos
  • Las fechas son texto o tienes una fecha en la celda
  • La cantidad de caracteres de cada campo, por ejemplo:

"A", "B", "C", etc

10,   1,  27, etc

Envíame tus comentarios en ese orden

¡Gracias!  Los datos comienzan en la cela A1, en esa fila no tengo problema con los tamaños, porque es información resumida de lo que sigue a partir de la celda A2.                                                   A partir de la  la fila 2, necesito que las siguientes columnas tengan la siguiente medida de caracteres:                                                                                                                                                              COLUMNA       CANTIDAD DE CARACTERES  

         C                         25

          E                         12

          F                          12

          G                             5

           H                            14

            I                              12

            N                              8

Esta es la macro que estoy utilizando:

Sub proceso()
'por luismondelo
ruta = ActiveWorkbook.Path & "\"
Open ruta & "ejemplo.txt" For Output As #1
Range("a1").Select
Do While ActiveCell.Offset(0, 1).Value <> ""
ubica = ActiveCell.Address
Do While ActiveCell.Column < 75
If ActiveCell.Value <> "" Then
lista = lista & "|" & ActiveCell.Value
End If
ActiveCell.Offset(0, 1).Select
Loop
lista = Mid(lista, 2, Len(lista) - 1)
Print #1, lista
lista = ""
Range(ubica).Offset(1, 0).Select
Loop
Close #1
MsgBox "Se ha creado el txt en la ruta: " & ruta
End Sub

Estoy confundido.

Faltaron varias columnas, qué pasa con la información de esas columnas, ¿no van el txt?

¡Gracias! , Las columnas que faltan en el detalle, también van al *.txt, pero como son de fechas, o texto, no me generan problemas en la conversión. Necesitas que le envíe la cantidad de caracteres de c/u de ellas? 

¿Ya no estoy entendiendo es por tamaño de campo o por formato de campo?

Te anexo la macro.

En la macro puedes actualizar el tamaño de campo para cada una de las columnas.

También puedes poner el formato que necesites por campo, por ejemplo, para las columnas 5, 6 y 9 el formato es "0.00", se establece el formato, pero también se ajusta el tamaño del campo que estableciste, por ejemplo, la columna "E" tiene longitud de 12 y formato "0.00", es decir, la macro realizará las 2.

Si no sabes la longitud de un campo, entonces solamente pon un 1, por ejemplo la A y la B les puse un 1.

Sub GuardarTxt()
'Por.Dante Amor
    FileNum = FreeFile()
    ruta = ThisWorkbook.Path & "\"
    arch = "archivo.txt"
    Open ruta & arch For Output As #FileNum
    'columnas       A  B  C   D  E   F   G  H   I   J  K  L  M  N  O
    cols = Array(0, 1, 1, 25, 1, 12, 12, 5, 14, 12, 1, 1, 1, 1, 8, 1)
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        For j = 1 To Columns("O").Column
            dato = Cells(i, j)
            Select Case j
                Case 1, 10
                    dato = Format(dato, "dd/mm/yyyy")
                Case 5, 6, 9
                    dato = Formatear(dato, cols, j, "0.00")
                Case 8
                    dato = Formatear(dato, cols, j, "0.000000")
                Case 7, 14
                    dato = Formatear(dato, cols, j, "0")
            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 #FileNum, car;
            Next
            Print #FileNum, "|";
        Next
        Print #FileNum,
    Next
    Close #FileNum
    '
    MsgBox "Txt generado"
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Hola Dante, te envío esta parte como ejemplo para ver si puedo ser mas claro.

RELACION COLUMNAS EXCEL CON CADENA DE TEXTO 

       A             B            C                   D           F                    G

23/01/2017|E|114215                    |D|     2861.00|       100.42|

las columnas F y G son valores monetarios en el excel y se transcriben como los ves en la cadena, el de la Columna C es un código de cuenta que genera espacios vacíos hasta completar una cadena de 25 caracteres en total.  

Te envié la macro, prueba y me comentas.

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

¡Gracias!  OK. Lo pruebo y te comento

Presento mensaje de error al correr la macro. Modifique luego las sentencias que decían "formatear" por "format". Pero me apareció otro mensaje que dice lo siguiente;

Se ha producido el error '55' en tiempo de ejecución: 

El archivo ya está abierto.

Formatear es una función que yo creé, no modifiques la macro.

¿Qué dice el primer mensaje que te aparece?

¿Y en qué línea se detiene?

Perdona, me faltó la función formatear, pon todo en un módulo y ejecuta la macro GuardarTxt

Sub GuardarTxt()
'Por.Dante Amor
    FileNum = FreeFile()
    ruta = ThisWorkbook.Path & "\"
    arch = "archivo.txt"
    Open ruta & arch For Output As #FileNum
    'columnas       A  B  C   D  E   F   G  H   I   J  K  L  M  N  O
    cols = Array(0, 1, 1, 25, 1, 12, 12, 5, 14, 12, 1, 1, 1, 1, 8, 1)
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        For j = 1 To Columns("O").Column
            dato = Cells(i, j)
            Select Case j
                Case 1, 10
                    dato = Format(dato, "dd/mm/yyyy")
                Case 5, 6, 9
                    dato = Formatear(dato, cols, j, "0.00")
                Case 8
                    dato = Formatear(dato, cols, j, "0.000000")
                Case 7, 14
                    dato = Formatear(dato, cols, j, "0")
            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 #FileNum, car;
            Next
            Print #FileNum, "|";
        Next
        Print #FileNum,
    Next
    Close #FileNum
    '
    MsgBox "Txt generado"
End Sub
'
Function Formatear(dato, cols, j, formato)
    dato = Format(dato, formato)
    l = Len(dato)
    m = cols(j)
    d = m - l
    Formatear = String(d, " ") & dato
End Function

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas