none
Exportar a texto, sin comas ni tabs.

    Question

  • Hola, alguien sabe de un método sencillo para exportar datos de una hoja Excel a un archivo de texto, pero no tiene que estar separado por comas, ni tabs, ni nada.

    Tengo que cumplir con un formato que me pide la empresa de tarjetas de crédito, y es algo como: posición 1, logitud 10, código de comercio..., posición 20, logitud 16, importe (completar con ceros, dos decimales SIN la coma o el punto), etc.

    Es un lío hacerlo de un vez con Excel, y esto lo tengo que repetir cada mes, no soy muy hábil con las macro o la programación.

    Gracias,

    Javi.

    Saturday, October 14, 2006 10:55 PM

Answers

  • Hola Javi,

    En este caso, podrias usar el codigo publicado por Chip Pearson aqui: http://tinyurl.com/ufsk3

    de la siguiente forma:

     

    1) abre tu archivo a exportar

    2) clic derecho sobre el pequeño logo  de Excel a la izquierda del menu Archivo

    3) opcion: Ver Codigo (se abrira el Editor VBA)

    4) menu Insert>Module...

    5) en la ventana mas grande a la derecha pega el codigo que te pongo a continuacion

    6) pulsa las teclas Alt+F11 para volver a la hoja

    7) selecciona el rango a exportar

    8) pulsa las teclas Alt+F8 para abrir el dialogo de macros

    9) doble clic sobre Test

    10) busca el archivo *.txt en la misma carpeta donde esta tu libro

     

    Code Snippet

       Public Sub ExportToTextFile(FName As String, Sep As String, SelectionOnly As Boolean)
            Dim WholeLine As String
            Dim FNum As Integer
            Dim RowNdx As Long
            Dim ColNdx As Integer
            Dim StartRow As Long
            Dim EndRow As Long
            Dim StartCol As Integer
            Dim EndCol As Integer
            Dim CellValue As String
            Application.ScreenUpdating = False
            On Error GoTo EndMacro:
            FNum = FreeFile
            If SelectionOnly = True Then
                With Selection
                    StartRow = .Cells(1).Row
                    StartCol = .Cells(1).Column
                    EndRow = .Cells(.Cells.Count).Row
                    EndCol = .Cells(.Cells.Count).Column
                End With
            Else
                With ActiveSheet.UsedRange
                    StartRow = .Cells(1).Row
                    StartCol = .Cells(1).Column
                    EndRow = .Cells(.Cells.Count).Row
                    EndCol = .Cells(.Cells.Count).Column
                End With
            End If
            Open FName For Output Access Write As #FNum
            For RowNdx = StartRow To EndRow
                WholeLine = ""
                For ColNdx = StartCol To EndCol
                    If Cells(RowNdx, ColNdx).Value = "" Then
                        CellValue = Chr(34) & Chr(34)
                    Else
                        CellValue = Application.WorksheetFunction.Text(Cells(RowNdx, ColNdx).Value, Cells(RowNdx, ColNdx).NumberFormat)
                    End If
                    WholeLine = WholeLine & CellValue & Sep
                Next ColNdx
                WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))
                Print #FNum, WholeLine
            Next RowNdx
        EndMacro:
            On Error GoTo 0
            Application.ScreenUpdating = True
            Close #FNum
        End Sub

        Sub test()
            ExportToTextFile ThisWorkbook.Path & "\test.txt", "", True
        End Sub

     

     

    Sunday, October 15, 2006 3:27 AM

All replies

  • ¿Que se supone que debe haber entre la posicion 10 (que es donde termina el codigo comercio) y la posicion 20 (donde empieza el importe)?

    En todo caso, prueba lo siguiente:

    Suponiendo que el importe empieza en la posicion 11 (y no 20)...

    1) elimina el separador de decimales en la columna de importes

    a. si los importes estan en fomato numerico, pon en una celda vacia 100, copialala, selecciona todos los valores de la columna Importe, ve al menu Edicion>Pegado especial..., marca las opciones Valores y Multiplicar, pulsa Aceptar

    b. si los importes estan en fomato texto, usa el menu Edicion>Reemplazar... para reemplazar la coma por un vacio.

    2) Selecciona la primera columna (codigo comercio), ve al menu Formato>Celda..., pestaña Numero, categoria: Personalizada, tipo: 0000000000

    3) Selecciona la segunda columna (importe), ve al menu Formato>Celda..., pestaña Numero, categoria: Personalizada, tipo: 0000000000000000 (ojo - Excel solo permite hasta 15 digitos significativos en un numero, por lo que siempre deberas dejar el primer o el ultimo digito en 0)

    4) Selecciona las dos columnas y realiza el Auto-ajuste de ancho para que ambas queden ajustadas a los valores (coloca el cursor sobre el nombre de una de las columnas seleccionadas justo sobre el borde derecho para que aparezca un simbolo parecido a <-|->  y haz doble clic)

    5) Ve al menu Archivo>Guardar Como... y elige la carpeta y el nombre para el archivo

    6) En el desplegable Guardar como tipo elige Texto con formato (delimitrado por espacios) (*.prn) y pulsa Guardar

    7) Busca el archivo *.prn recien creado y cambiale la extension por *.txt

    8) Abrelo y mira a ver si es lo que buscabas.

    Sunday, October 15, 2006 1:21 AM
  • Gracias KL, entre la posición 10 y la 20 hay más campos, sólo mencioné un par como ejemplo.

    Lo del formato personalizado es muy bueno y me simplifica un montón el trabajo. El único problema con el guardar como .prn es que toma toda la hoja. Yo tengo totales, encabezados, columas que no van al txt, etc.

    Pero lo estoy solucionando moviendo los datos a otra hoja vacía y dándole el formato como me indicasta ahí.

    Lo que buscaba era algo del tipo del importador de datos desde .txt de Excel, pero "al revés"   :-)

    Saludos,

    Javi.

     

     

     

    Sunday, October 15, 2006 2:26 AM
  • Hola Javi,

    En este caso, podrias usar el codigo publicado por Chip Pearson aqui: http://tinyurl.com/ufsk3

    de la siguiente forma:

     

    1) abre tu archivo a exportar

    2) clic derecho sobre el pequeño logo  de Excel a la izquierda del menu Archivo

    3) opcion: Ver Codigo (se abrira el Editor VBA)

    4) menu Insert>Module...

    5) en la ventana mas grande a la derecha pega el codigo que te pongo a continuacion

    6) pulsa las teclas Alt+F11 para volver a la hoja

    7) selecciona el rango a exportar

    8) pulsa las teclas Alt+F8 para abrir el dialogo de macros

    9) doble clic sobre Test

    10) busca el archivo *.txt en la misma carpeta donde esta tu libro

     

    Code Snippet

       Public Sub ExportToTextFile(FName As String, Sep As String, SelectionOnly As Boolean)
            Dim WholeLine As String
            Dim FNum As Integer
            Dim RowNdx As Long
            Dim ColNdx As Integer
            Dim StartRow As Long
            Dim EndRow As Long
            Dim StartCol As Integer
            Dim EndCol As Integer
            Dim CellValue As String
            Application.ScreenUpdating = False
            On Error GoTo EndMacro:
            FNum = FreeFile
            If SelectionOnly = True Then
                With Selection
                    StartRow = .Cells(1).Row
                    StartCol = .Cells(1).Column
                    EndRow = .Cells(.Cells.Count).Row
                    EndCol = .Cells(.Cells.Count).Column
                End With
            Else
                With ActiveSheet.UsedRange
                    StartRow = .Cells(1).Row
                    StartCol = .Cells(1).Column
                    EndRow = .Cells(.Cells.Count).Row
                    EndCol = .Cells(.Cells.Count).Column
                End With
            End If
            Open FName For Output Access Write As #FNum
            For RowNdx = StartRow To EndRow
                WholeLine = ""
                For ColNdx = StartCol To EndCol
                    If Cells(RowNdx, ColNdx).Value = "" Then
                        CellValue = Chr(34) & Chr(34)
                    Else
                        CellValue = Application.WorksheetFunction.Text(Cells(RowNdx, ColNdx).Value, Cells(RowNdx, ColNdx).NumberFormat)
                    End If
                    WholeLine = WholeLine & CellValue & Sep
                Next ColNdx
                WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))
                Print #FNum, WholeLine
            Next RowNdx
        EndMacro:
            On Error GoTo 0
            Application.ScreenUpdating = True
            Close #FNum
        End Sub

        Sub test()
            ExportToTextFile ThisWorkbook.Path & "\test.txt", "", True
        End Sub

     

     

    Sunday, October 15, 2006 3:27 AM
  • Nuevamente, gracias KL.

    He encontrado un programita comercial que parece hacer justamente lo que estoy necesitando, lo voy a probar y si no me convence tendré que arremangarme y lidiar con el código que amablemente me mandaste.

    El utilitario ese está en: e2a.santafetech.com

    Saludos,

    Javi.

     

     

    Monday, October 16, 2006 12:11 AM
  • Hola Javi, No se a que te refieres diciendo "lidiar" con el codigo. Ni siquiera tienes que entenderlo. Simplemente sigue los pasos que te he indicado - esta todo mas que masticado :-) A proposito, mi solucion me parece: - mucho mas flexible (puedes jugar con los formatos como tu quieras y seleccionar las partes de la hoja que tu quieras) - menos peligroso (no tengo forma ni interes en meterte addware, spyware o virus) - menos pesado para el sistema (no hay que instalar nada) - mas rapido (una vez copiado el codigo, no tienes que seguir cada vez el Asistente paso a paso)
    Monday, October 16, 2006 8:13 AM
  • Hola KL, hice la prueba con el código que mandaste, resultó como tu dices. Combinado con las indicaciones sobre como preparar el formato de tu primera respuesta estoy llegando al resultado que necesito. Porque el ancho de las columnas debe ser fijo, completando con espacios a la derecha aunque la celda esté vacia (voy a cambiar la macro porque pone un par de ") si es texto y con 0 a la izquierda si es numérica. Pienso que agregando una fila arriba de todo, tipo cabecera, que contenga en cada celda un valor numérico que sea el ancho requerido de la columna en el txt, puedo hacer que la macro arme la línea de longitud fija. No te preocupes por mandarme más código, voy a ver si lo hago yo mismo y de paso aprendo un poco :-)

    Otra vez, muchas gracias por tu atención.

    Atte,

    Javi.

    Monday, October 16, 2006 11:50 AM
  • hola amigo estaba leyendo por curiosidad tu macro la corri en proceso que tengo por probar lo que estabas indicando el archivo queda grabado autimaticamente como txt sin comas esa instruccion no la conocia gracias por esa ayuda indirecta
    Tuesday, February 27, 2007 5:50 AM
  • Hola

     

    A mí me sirvió este código, pero necesito que me tome en cuenta los ceros que están a la izquierda para poder mantener un tamaño por columna.

     

    Gracias y Saludos,

    Tuesday, May 08, 2007 9:32 PM
  • Hey KL, mil gracias por tu aporte, si que me ha servido tal codigo, Gracias viejo.
    Wednesday, May 09, 2007 3:50 PM
  • Para exportarlo grabalo con la extension .CSV y abre el archivo directamente del explorador este se abrira con el notepad.

     

    Thursday, July 26, 2007 2:22 AM
  • KL, yo necesito exportar archivos desde excel a prn, con filas de mas de 1000 caracteres.

    Como tendria que ser el codigo ?  (no se VB)

    Gracias

    Saludos

    Thursday, September 18, 2008 9:23 PM
  • KL MUY BUENA ESTA MACRO, LA VERDAD QUE ES UN MUNDO NUEVO PARA MI,LA PROBÉ Y FUNCIONÓ. YO ESTARÍA NECESITANDO ESTO MISMO PERO DE LA SIGUIENTE MANERA, POR EJEMPLO

    ORDEN                                TIPO                 DESDE             HASTA        LONGITUD
    1 APELLIDO Y NOMBRE         TEXTO                 1                         50            50
    2 TIPO DE DOCUMENTO        NUMERO              51                       51              1
    3 NUMRO DE DOCUMENTO    NUMERO              52                        64             13

    MI PREGUNTA ES ¿CÓMO HACER PARA QUE M.EXCEL AL ARMARME MEDIANTE LA MACRO EL .TXT ME RESPETE ESOS CARACTERES?, DESDE YA MUCHAS GRACIAS!!!!
    Tuesday, February 09, 2010 11:24 PM
  • Estimado,

    Encontre este aporte y lo utilizo en mi planilla (que contiene 4 hojas) y poscicionado en la ultima hoja lo ejecuto y solamente me guarda el dato de la primera celda en el txt generado... por que puede ser esto..??

    Lo que yo necesito es que (posicionado en la cuarta hoja del libro) lleve la hoja completa como archivo txt y no solo la primera celda (a1)

    Veo que tu aporte es del año 2006 seria genial que aun pudas seguir dando comentarios

    Saludos y muchas gracais.

    Wednesday, November 30, 2011 4:41 PM
  • Hola Javi,

    En este caso, podrias usar el codigo publicado por Chip Pearson aqui: http://tinyurl.com/ufsk3

    de la siguiente forma:

     

    1) abre tu archivo a exportar

    2) clic derecho sobre el pequeño logo  de Excel a la izquierda del menu Archivo

    3) opcion: Ver Codigo (se abrira el Editor VBA)

    4) menu Insert>Module...

    5) en la ventana mas grande a la derecha pega el codigo que te pongo a continuacion

    6) pulsa las teclas Alt+F11 para volver a la hoja

    7) selecciona el rango a exportar

    8) pulsa las teclas Alt+F8 para abrir el dialogo de macros

    9) doble clic sobre Test

    10) busca el archivo *.txt en la misma carpeta donde esta tu libro

     

    Code Snippet

       Public Sub ExportToTextFile(FName As String, Sep As String, SelectionOnly As Boolean)
            Dim WholeLine As String
            Dim FNum As Integer
            Dim RowNdx As Long
            Dim ColNdx As Integer
            Dim StartRow As Long
            Dim EndRow As Long
            Dim StartCol As Integer
            Dim EndCol As Integer
            Dim CellValue As String
            Application.ScreenUpdating = False
            On Error GoTo EndMacro:
            FNum = FreeFile
            If SelectionOnly = True Then
                With Selection
                    StartRow = .Cells(1).Row
                    StartCol = .Cells(1).Column
                    EndRow = .Cells(.Cells.Count).Row
                    EndCol = .Cells(.Cells.Count).Column
                End With
            Else
                With ActiveSheet.UsedRange
                    StartRow = .Cells(1).Row
                    StartCol = .Cells(1).Column
                    EndRow = .Cells(.Cells.Count).Row
                    EndCol = .Cells(.Cells.Count).Column
                End With
            End If
            Open FName For Output Access Write As #FNum
            For RowNdx = StartRow To EndRow
                WholeLine = ""
                For ColNdx = StartCol To EndCol
                    If Cells(RowNdx, ColNdx).Value = "" Then
                        CellValue = Chr(34) & Chr(34)
                    Else
                        CellValue = Application.WorksheetFunction.Text(Cells(RowNdx, ColNdx).Value, Cells(RowNdx, ColNdx).NumberFormat)
                    End If
                    WholeLine = WholeLine & CellValue & Sep
                Next ColNdx
                WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))
                Print #FNum, WholeLine
            Next RowNdx
        EndMacro:
            On Error GoTo 0
            Application.ScreenUpdating = True
            Close #FNum
        End Sub

        Sub test()
            ExportToTextFile ThisWorkbook.Path & "\test.txt", "", True
        End Sub

     

     

    hola q tal amigo, fijate he intentado con el codigo q publica pero sin exito podrias explicarlo un poco para adaptarlo a lo q necesito...?? tambien tengo la misma duda q javi lozano. pero recopilando ejemplo he armado el siguiente y estas son las especificaciones. a ver si me hechan una manito, la verdad ya no se que hacer :D 

    Saludos y bendiciones,

    escribo para ver quien pueda ayudarme con una duda, junto con estos ejemplos he creado siguiente codigo para exportar los datos q tengo en mi hoja1 para un archivo txt, el cual ya he establecido ciertos parametros pero debo completar lo siguiente, el archivo txt no debe estar separado por tabulaciones, debera ser una linea entera donde cada columna es delimitada segun la posicion y tamaño q esta ocupe. ejemplo:

    así es el archivo original en excel:

    Rif: Nombre: numero de cuenta Monto: Codigo de factura:

    J-29365705-9 MICRO SKY 01340363503631296334 BS 73.777,51 1695



    así va con el código q adjunto:

    J293657059 MICRO SKY 01340363503631296334 000007377751 0000001695



    así debería quedar en el TXT

    J293657059MICRO SKY 013403635036312963340000073777510000001695

    rif empieza en la posicion 1 y tiene una longitud de 10caracteres,nombre debera empezar en la posicion 11 con una longitud de 35caracteres,numero de cuenta en la posicion 46 con una longitud de 20caracteres,monto en la posicion 67 con una longitud de 12caracteres,Codigo de factura en la posicion 79 con longitud de 10 caracteres. los simbolos como "-" "," "." y "BS" los remplase x espacios en blanco con el codigo adjunto y los espacios en blancos son rellenados con ceros en los casos de monto y codigo de factura..

    alguien podria ayudarme a terminar este ultimo paso? alguna idea o aporte :)

    Sub Exportando_TXT()
    On Error Resume Next
    'Ocultamos el procedimiento
    Application.ScreenUpdating = False

    'Cambiando los formatos para el TXT
    '------------------
    Range("A1").Select
    'recorremos para abajo fila a fila,
    'hasta encontrar una vacía
    Do While Not IsEmpty(ActiveCell)
    'reemplazamos simbolos por nada,
    'o lo que es lo mismo, los quitamos
    'siempre y cuando no estemos en una fórmula
    If Left(ActiveCell.Formula, 1) <> "=" Then
    ActiveCell = Replace(ActiveCell, "-", "")
    End If
    'bajamos una fila
    ActiveCell.Offset(1, 0).Select
    Loop
    Range("D1").Select
    'recorremos para abajo fila a fila,
    'hasta encontrar una vacía
    Do While Not IsEmpty(ActiveCell)
    If Left(ActiveCell.Formula, 1) <> "=" Then
    ActiveCell = Replace(ActiveCell, "BS", "")
    ActiveCell = Replace(ActiveCell, ".", "")
    ActiveCell = Replace(ActiveCell, ",", "")
    End If
    ActiveCell.Offset(1, 0).Select
    Loop
    'Defino el rango para los ceros a la izquierda segun formato
    Range("C1").Select
    Do While Not IsEmpty(ActiveCell)
    ActiveCell.NumberFormat = "@"
    ActiveCell = Format(ActiveCell, "00000000000000000000")
    ActiveCell.Offset(1, 0).Select
    Loop

    Range("D1").Select
    Do While Not IsEmpty(ActiveCell)
    ActiveCell.NumberFormat = "@"
    ActiveCell = Format(ActiveCell, "000000000000")
    ActiveCell.Offset(1, 0).Select
    Loop

    Range("E1").Select
    Do While Not IsEmpty(ActiveCell)
    ActiveCell.NumberFormat = "@"
    ActiveCell = Format(ActiveCell, "0000000000")
    ActiveCell.Offset(1, 0).Select
    Loop
    '------------------------------------
    'copiamos la hoja activa en un nuevo libro

    ActiveSheet.Copy
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues
    fichero = ThisWorkbook.Name
    ruta = ThisWorkbook.Path
    fichero = Replace(fichero, ".xlsx", "")
    fichero = Replace(fichero, ".xls", "")
    ActiveSheet.Select
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=ruta & "\" & fichero & ".txt", FileFormat:=xlText
    ActiveWorkbook.Close
    Application.ScreenUpdating = True

    End Sub 

    Tuesday, May 08, 2012 3:37 PM