jueves, 27 de marzo de 2008

Grabar datos en un fichero de texto

Quizás os preguntéis: "¿Para qué quiero grabar en un fichero de texto, los datos de una hoja de cálculo de excel?". Pues la respuesta es sencilla: "Porque a veces tenemos la necesidad de exportar los datos a un fichero de texto plano (txt), para importar esos datos posteriormente desde otro programa".

Para ello, vamos a suponer que tenemos estos datos en un fichero de excel:


Vamos a ver como se podría hacer eso de grabar en un fichero de texto, pero de varias formas distintas. La primera opción nos permitirá guardar una copia de la hoja de cálculo activa, en un fichero de texto plano (un fichero que podremos abrir con el Bloc de notas de Windows). El macro no nos preguntará nada, pues cogeremos los datos, y directamente los grabaremos en un fichero con el mismo nombre que el fichero de excel, y en la misma ruta donde se encuentre éste. El macro sería este:

Sub Grabar_fichero_de_texto()
On Error Resume Next
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'copiamos la hoja activa en un nuevo libro
ActiveSheet.Copy
'copiamos y pegamos los valores
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
'Nos quedamos con el nombre del
'fichero y la ruta donde está

fichero = ThisWorkbook.Name
ruta = ThisWorkbook.Path
'Quitamos la extenxión de excel
fichero = Replace(fichero, ".xlsx", "")
fichero = Replace(fichero, ".xls", "")
'seleccionamos la hoja activa
ActiveSheet.Select
'omitimos los mensajes de aviso
Application.DisplayAlerts = False
'guardamos el fichero de texto acomodado
'en el mismo directorio donde tenemos el
'fichero de excel normal

ActiveWorkbook.SaveAs Filename:=ruta & "\" & fichero & ".txt", FileFormat:=xlText
'cerramos el fichero de texto
ActiveWorkbook.Close
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

El resultado que obtendríamos sería este que muestra la imagen:


Como veréis en la imagen anterior los datos salen descolocados, pero eso no quiere decir que estén mal, sino que es así como se graban por defecto los datos en un fichero de texto. Quizás os volváis a preguntar: "¿Se puede arreglar eso para que salgan los datos tabulados en el fichero de texto?". La respuesta, ya la sabes :-), así que vamos a ver como podríamos darle respuesta a tantas inquietudes. Para ello, copiaremos y pegaremos este macro en un módulo:

Sub Acomodar_texto_version_1()
On Error Resume Next
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'copiamos la hoja activa en un nuevo libro
ActiveSheet.Copy
'copiamos y pegamos los valores
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
'------------------------------------
'buscamos el dato más largo del rango

celda_inicial = InputBox("Introduce la celda inicial", "Pregunta")
celda_final = InputBox("Introduce la celda final", "Pregunta")
'------------------------------------
'pasamos los datos a variables

min_fila = Range(celda_inicial).Row
max_fila = Range(celda_final).Row
min_columna = Range(celda_inicial).Column
max_columna = Range(celda_final).Column
'nos situamos en la primera celda
Range(celda_inicial).Select
'si no es una fecha, que le de formato general
If Not IsDate(ActiveCell) Then Selection.NumberFormat = "@"
'comenzamos a contar caracteres de largo,
'e iremos recorriendo fila a fila, y
'dentro de cada fila, columna a columna

maximo = 0
For i = min_fila To max_fila
For j = min_columna To max_columna
'creamos una variable
maximo_tmp = Len(ActiveCell)
If maximo_tmp > maximo Then maximo = maximo_tmp
'pasamos a la siguiente columna
ActiveCell.Offset(0, 1).Select
'si no es una fecha, que le de formato general
If Not IsDate(ActiveCell) Then Selection.NumberFormat = "@"
Next
ActiveCell.Offset(1, -max_columna).Select
Next
'nos situamos en la primera celda
Range(celda_inicial).Select
'añadimos los espacios necesarios,
'una vez determinado el máximo

For i = min_fila To max_fila
For j = min_columna To max_columna
'añadimos tantos espacios en blanco,
'como sea la variable "maximo"

ActiveCell = ActiveCell & String(maximo - Len(ActiveCell), " ")
'pasamos a la siguiente columna
ActiveCell.Offset(0, 1).Select
Next
ActiveCell.Offset(1, -max_columna).Select
Next
'Nos quedamos con el nombre del
'fichero y la ruta donde está

fichero = ThisWorkbook.Name
ruta = ThisWorkbook.Path
'Quitamos la extenxión de excel
fichero = Replace(fichero, ".xlsx", "")
fichero = Replace(fichero, ".xls", "")
'seleccionamos la hoja activa
ActiveSheet.Select
'omitimos los mensajes de aviso
Application.DisplayAlerts = False
'guardamos el fichero de texto acomodado
'en el mismo directorio donde tenemos el
'fichero de excel normal

ActiveWorkbook.SaveAs Filename:=ruta & "\" & fichero & ".txt", FileFormat:=xlText
'cerramos el fichero de texto
ActiveWorkbook.Close
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Si ejecutáis el macro anterior, veréis una novedad, y es que os pregunta el área de datos a exportar. Debereís informar cual es la celda inicial (celda superior izquierda), y cual es la celda final (celda inferior derecha) del rango de datos de la hoja de cálculo. El resultado que obtendríamos sería este (si no lo veis bien, cliquead sobre la imagen para ampliarla):


Como veis los datos están tabulados. ¿Quizás excesivamente tabulados?. Hummmmmmm, puede, pero tiene su explicación si "leéis" el código del macro.

Quizás pueda arreglarse esa aparentemente excesiva tabulación, y os guste más esta otra opción que os presento a continuación, y que hace lo mismo, pero lo tabula de una forma diferente (esta sería la opción que yo elegiría, en el caso de querer tabular los datos que se graben en el fichero de texto):

Sub Acomodar_texto_version_2()
On Error Resume Next
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'copiamos la hoja activa en un nuevo libro
ActiveSheet.Copy
'copiamos y pegamos los valores
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
'------------------------------------
'buscamos el dato más largo del rango

celda_inicial = InputBox("Introduce la celda inicial", "Pregunta")
celda_final = InputBox("Introduce la celda final", "Pregunta")
'------------------------------------
'pasamos los datos a variables

min_fila = Range(celda_inicial).Row
max_fila = Range(celda_final).Row
min_columna = Range(celda_inicial).Column
max_columna = Range(celda_final).Column
'nos situamos en la primera celda
Range(celda_inicial).Select
'si no es una fecha, que le de formato general
If Not IsDate(ActiveCell) Then Selection.NumberFormat = "@"
'comenzamos a contar caracteres de largo, para
'e iremos recorriendo columna a columna, y
'dentro de cada columna, fila a fila

maximo = 0
For j = min_columna To max_columna
'seleccionamos la primera fila del rango
Cells(min_fila, j).Select
For i = min_fila To max_fila
maximo_tmp = Len(ActiveCell)
If maximo_tmp > maximo Then maximo = maximo_tmp
'pasamos a la siguiente fila
ActiveCell.Offset(1, 0).Select
'si no es una fecha, que le de formato general
If Not IsDate(ActiveCell) Then Selection.NumberFormat = "@"
Next
'seleccionamos la primera fila del rango
Cells(min_fila, j).Select
For i = min_fila To max_fila
'añadimos tantos espacios en blanco,
'como sea la variable "maximo"

ActiveCell = ActiveCell & String(maximo - Len(ActiveCell), " ")
'pasamos a la siguiente fila
ActiveCell.Offset(1, 0).Select
Next
Next
'Nos quedamos con el nombre del
'fichero y la ruta donde está

fichero = ThisWorkbook.Name
ruta = ThisWorkbook.Path
'Quitamos la extenxión de excel
fichero = Replace(fichero, ".xlsx", "")
fichero = Replace(fichero, ".xls", "")
'seleccionamos la hoja activa
ActiveSheet.Select
'omitimos los mensajes de aviso
Application.DisplayAlerts = False
'guardamos el fichero de texto acomodado
'en el mismo directorio donde tenemos el
'fichero de excel normal

ActiveWorkbook.SaveAs Filename:=ruta & "\" & fichero & ".txt", FileFormat:=xlText
'cerramos el fichero de texto
ActiveWorkbook.Close
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Si ejecutamos este último macro, obtendríamos algo como esto:



Como veis, parece ser que con las dos versiones del macro que nos permiten tabular el fichero de texto, se obtiene el mismo resultado, ...pero solo lo parece, pues ambos macros son completamente diferentes. Si alguno de vosotros se atreve a comentar cual es la diferencia sustancial entre ambos modelos, lo invito a que deje su comentario en este artículo (no es difícil descubrir las diferencias, si "leemos" el código de los macros, pues además, está comentado).

27 comentarios:

  1. Esta muy bien tu macro, pero COMO LE AGO SI QUIERO AGREGARLE DESPUES MAS DATOS AL MISMO FICHERO??????

    ResponderEliminar
  2. Hola que tal...

    A través de este artículo, explico como abrir el fichero de texto (para editarlo, o para lo que sea): http://hojas-de-calculo-en-excel.blogspot.com/2008/04/leer-un-fichero-de-texto-plano.html. Luego solo tendrías que guardarlo de nuevo, como en este artículo que acabas de leer.

    Salu2

    ResponderEliminar
  3. Basicamente esta buena,
    pero no puedo hacerlo para lo que requeria...

    Puesto, que en mi caso, requeria que:

    La Columna A, tuviera hasta "5" valores.
    La Columna B, tuviera hasta 8 valores.
    La Columna C, tuviera hasta "1"
    valor.
    La Columna D, tuviera hasta "60" valores

    Valores, me refiero a caracteres.

    Y así sucesivamente hasta completar el maximo permitido de valores por columna,
    y esto fila por fila (como lo hace esta macro).
    Cosa que todos los campos tengan la misma cantidad de valores.

    No se si me explico...

    En mi caso, esto paso a los programadores de VB de la empresa, y yo desisti del proyecto...

    Igual te dejo la macro que fui haciendo (entre grabadora y funciones dadas y lo que tu explicabas), haber si puedes mejorarla y que sirva para otros...



    Saludos:


    MACRO:

    Sub Exportar_a_TXT()

    'defino una constante con los primeros caracteres de la hoja:
    Const NuevaHoja As String = "Page_"
    Dim Numero As Integer
    Application.ScreenUpdating = False

    'incremento el Numero que llevará la hoja. Luego concatenaré esta constante
    'con la variable Numero para renombrar la hoja copiada:
    Numero = Sheets("BD a TXT").Range("a1").Value + 1
    'antes de iniciar el copiado, pregunto:
    If MsgBox("Desea crear una copia de la Hoja: " & ActiveSheet.Name & ", la cual se llamará " & NuevaHoja & Numero & "?", vbYesNo + vbQuestion, "Atención") = vbNo Then
    'si presionó NO, me voy:
    Exit Sub
    End If
    'aqui copio la hoja actual
    ActiveSheet.Copy After:=ActiveSheet
    'le doy un nuevo nombre. aqui coloco también un controlador de errores, para que todo se cancele si, por ejemplo,
    'duplicamos el nombre de la hoja:
    On Error GoTo Kilombo
    ActiveSheet.Name = Trim(NuevaHoja & Numero)
    'importante: aumento en 1 el valor de la celda A1 (en hoja1), para ir guardando los numeros correlativos:
    Sheets("BD a TXT").Range("a1").Value = Numero


    ' Cambio los formatos para cuadrar a los bytes, para anteponer los 0
    ' en el caso del Rut, Cod. Region, Cod. Comuna, Cod. Ciudad

    Range("K18").Select
    Range("K18:M18").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Range("K18").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Range("L14").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("L14").Select
    Selection.Copy
    Range("K18").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
    SkipBlanks:=False, Transpose:=False
    Range("K18").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.NumberFormat = "000"
    Range("L18").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.NumberFormat = "00"
    Range("M18").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.NumberFormat = "000"
    Range("L14").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("F18").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
    SkipBlanks:=False, Transpose:=False
    Selection.NumberFormat = "00000000"
    Range("F18").Select
    ActiveWindow.ScrollColumn = 1
    Range("L14").Select
    Selection.ClearContents




    ' Concateno para que los valores queden conforme a los bytes establecidos
    ' Nota: Buscar la forma de reducir la instruccion


    Range("Q9").Select
    ActiveCell.FormulaR1C1 = _
    "=CONCATENATE(RC[-16],RC[-15],RC[-14],RC[-13],RC[-12],RC[-11],RC[-10],RC[-9],RC[-8],RC[-7],RC[-6])"
    Range("Q18").Select
    ActiveCell.FormulaR1C1 = _
    "=CONCATENATE(RC[-16],RC[-15],RC[-14],RC[-13],RC[-12],RC[-11],RC[-10],RC[-9],RC[-8],RC[-7],RC[-6],RC[-5],RC[-4],RC[-3],RC[-2],RC[-1])"
    Range("Q18").Select
    Selection.End(xlUp).Select
    Selection.End(xlUp).Select
    Range("P1").Select
    Selection.End(xlToLeft).Select
    Rows("1:1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    Range("A1").Select
    Selection.End(xlDown).Select
    Rows("9:9").Select
    Selection.Delete Shift:=xlUp
    Range("H9").Select
    Selection.End(xlToRight).Select
    Range("P9").Select
    Selection.End(xlDown).Select
    Range("Q391").Select
    Range(Selection, Selection.End(xlUp)).Select
    Selection.FillDown
    Selection.End(xlUp).Select
    Selection.End(xlUp).Select
    Selection.End(xlToLeft).Select
    Selection.End(xlToLeft).Select
    Selection.End(xlDown).Select
    Rows("2:8").Select
    Range("A8").Activate
    Selection.Delete Shift:=xlUp
    Range("A1").Select
    Selection.End(xlToRight).Select
    Selection.End(xlToRight).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Selection.End(xlUp).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Columns("P:P").Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlToLeft



    Range("A1").Select

    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Workbooks.Add
    ActiveSheet.Paste
    Application.CutCopyMode = False
    'Nos quedamos con el nombre del
    'fichero y la ruta donde está
    fichero = ThisWorkbook.Name
    ruta = ThisWorkbook.Path
    'Quitamos la extenxión de excel
    fichero = Replace(fichero, ".xlsx", "")
    fichero = Replace(fichero, ".xls", "")
    'seleccionamos la hoja activa
    ActiveSheet.Select
    'omitimos los mensajes de aviso
    Application.DisplayAlerts = False
    'guardamos el fichero de texto acomodado
    'en el mismo directorio donde tenemos el
    'fichero de excel normal
    ActiveWorkbook.SaveAs Filename:=ruta & "\" & fichero & ".txt", FileFormat:=xlText
    'cerramos el fichero de texto
    ActiveWorkbook.Close

    'guardo los cambios:
    ActiveWorkbook.Save
    MsgBox "El proceso Exportacion a Finalizado Correctamente", vbInformation, "Exportar a TXT"
    'si no existieron errores, me voy
    Exit Sub
    'con la etiqueta defino las acciones a seguir en caso de error:
    Kilombo:
    If Err.Number <> 0 Then
    MsgBox "Se produjeron problemas al exportar a *.TXT" & vbCrLf & Err.Description, vbCritical, "Error: " & Err.Number
    End If
    Application.ScreenUpdating = True

    End Sub


    Te explico, el total de caracteres debia ser 363, y saltar a la siguiente linea.

    Nº las columnas:

    1 = 7
    2 = 2
    3 = 1
    4 = 1
    5 = 8
    6 = 1
    7 = 60
    8 = 50
    9 = 25
    10 = bla, bla bla

    Total de Caracteres (363)


    Concatene en vista de que tenia la formula
    =Base!B16&REPETIR(" ";Base!B$14-LARGO(Base!B16))
    para darle el total de caracteres.

    Obs. Si tenia por ejemplo en las columnas numericas menos de los caracteres, debia agregar un 0 a la izquierda.

    Todo esto como te daras cuenta, es para cumplir los formatos bancarios...

    .........

    Mi bajon, tiene que ver, que como paso a Informatica, no tendre la oportunidad de saber los codigos, por que programaran en VB, generando un programa con los codigos ocultos.

    ¬¬

    APRETADOS!!!


    xD


    Y yo queria captar...

    ResponderEliminar
  4. Muchas gracias por tu comentario, y tu excelente aporte. Le echaré un vistazo con calma.

    Sin duda es un buen complemento al artículo del blog, y ojalá le sirva a más usuarios.

    Si funciona eso que programaste, lo mejor es no tocarlo, porque tampoco vamos a utilizar eso tantas veces. Si funciona, mejor dejarlo así,

    Muchas gracias de nuevo.

    ResponderEliminar
  5. saludos, tengo una pregunta
    hice una macro que me crea un archivo de texto a partir de una hoja de excel, la cuestion es que le asigno un nombre por default al archivo que quiero crear,
    quisiera que la macro me preguntara como quiero llamar al archivo que quiero crear

    ResponderEliminar
  6. Lo tienes muy sencillo, si utilizas por ejemplo un inputbox. El dato que introduzcas (o que introduzca el usuario), será la variable que podrás utilizar como nombre del fichero.

    Puedes ver ejemplos de inputbox, en algunos artículos de este blog.

    Un saludo.

    ResponderEliminar
  7. Hola Esta muy bueno tu blog, y pues tengo una duda espero me puedas ayudar, resulta que estoy haciendo una interfaz en java para leer excell y escribir txt y depues enviarlo a un servidor unix y pues soy nuevo en esto y quiseira saber si hay alguna forma de que una ves que la macro exporto los datos al fichero txt, pudiera enviar algun mensaje de terminado para iniciar la conexion al servidor y exportar el fichero txt a unix, de antemano muchas gracias.

    ResponderEliminar
  8. hola como estan....los felicito por la pagina...ta re buena... les cuento que kiero hacer una macro donde me concatene varias formulas pero al poner la tercera formula me da error y me dice que no me graba tienen algo parecido para ver mi error...gracias

    ResponderEliminar
  9. hola como estan...les quiero hacer una consulta... tienen por ahi una macro o un comando donde yo a una macro que estoy diciendo que cree un archivo en txt de excel y me deje ponerle el nombre del archivo o como lo tengo que hacer para que me deje solito hacer eso???
    gracias

    ResponderEliminar
  10. estoy teniendo inconvenientes con las , en un texto cada ves que lee comas me las pones en el TXT de la siguiente forma ","
    Ej:

    upper_left: -23.827911 ",-61.929212"

    upper_right: -23.825221 ",-61.594255"

    lower_left: -24.136309 ",-61.926659"

    lower_right: -24.133580 ",-61.590904"

    ResponderEliminar
  11. ya lo eh solucionado , era cuestion de cambiar la fuente le mande una fuente arabic y listo pero igual sigue mi duda si alguien sabe por que seria de gran aporte

    ResponderEliminar
  12. Buenas. Los artículos que publicaste son muy buenos, me han ayudado mucho.
    Ahora tengo una pregunta, al guardar el fichero de texto quisiera reemplazar las "E" de los números con notación exponencial por "D" debido a que el otro programa así lo requiere. ¿Sugerencias? Gracias.

    ResponderEliminar
  13. Puedes utilizar la función replace. Por ejemplo, para reemplazar las E por las D, tendrías que hacer esto:

    nuevo_dato = replace(activecell,"E","D")

    De esa forma, en la variable nuevo_dato, tedrías el valor de la celda activa, pero donde había una letra (o varias) E, ahora tendrás la letra D.

    ResponderEliminar
  14. Muchas gracias, aunque recién me di cuenta que imprime el número completo, sin notación exponencial, por lo que no me hace falta complicarme la vida. Gracias de todas formas por tu sabiduría.

    ResponderEliminar
  15. Queria saber si se puede hacer lo que publico Cristian Hernandez, tengo que hacer lo mismo que el pero en vez que te den 0 a la izquierda me de un espacio. Como hago para hacer lo y decidir yo la cantidad de caracteres de cada columna????

    ResponderEliminar
  16. Saludos... felicitaciones y agradecimientos por tu gran aporte y quisiera pedirte un favor. podria en el archivo de texto que se genera cambiar cada espacio de tabulacion por una coma (,)
    Gracias.

    SALSEROMANIACO

    ResponderEliminar
  17. En lugar de grabarlo como fichero de txt, grábalo como fichero csv. Precisamente te graba los cambios, cambiando la tabulación por comas.

    La extensión del fichero será csv, pero es idéntica a un txt (de hecho puedes cambiársela posteriormente.

    Cambia la línea del macro donde informas del tipo de archivo a generar, para que en lugar de ser un txt, tengas esto:

    ActiveWorkbook.SaveAs Filename:=ruta & "\" & fichero & ".csv", FileFormat:=xlCSVWindows

    Un saludo.

    ResponderEliminar
  18. Quiero felicitarte por el excelente aporte que estas brindando a la comunidad. Y agradecerte ya que tu información me ha servido de mucho.
    Tenía además una pequeña inquietud.
    Con la instrucción:
    ActiveSheet.Copy
    Entiendo que copias lo hoja activa en un nuevo libro, pero para qué son necesarias las instrucciones de copiar y pegar que siguen, me refiero a:
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues
    Es que parece que con la primera instrucción es suficiente, o quizá las siguientes líneas tengan algún propósito adicional. Y si es así te agradecería me pudieras decir cual es éste.

    ResponderEliminar
  19. Puede parecer que es lo mismo, pero si te fijas, lo que estamos haciendo es esto:

    1.- Cogemos una hoja de un libro y la replicamos en otro nuevo libro. De ahí que copiemos la hoja.

    2.- Cogemos todos datos de ese nuevo libro (sin tocar los datos originales), los copiamos, y pegamos sobre sí mismo los valores (sin fórmulas de ese nuevo libro). De ahí que seleccionemos todas las celdas de esta nueva hoja replicada, y copypasteemos todo sobre sí mismo, pero solo los valores.

    Esto último (copypastear valores) es por si al grabar los datos en un fichero de texto, se nos grabaran las fórmulas, aunque esto en principio no debe suceder, lo mejor es arreglarlo para que al grabarlo no nos salgan cosas raras.

    Un saludo. Y gracias por tu interesante y observador comentario.

    ResponderEliminar
  20. Hola Javier, en primer lugar felicitarte, esta muy bien tu Blog y nos ayudas mucho.Partiendo de tu ejemplo intento crear un fichero plano txt,con separador "," para los campos y acotacion con "texto"para los campos de texto.La solución que das de pasarlo a fichero cvs no me vale pues separa con ";". ¿podrias orientarme como hacerlo?
    Adjunto lo que seria una línea del ficheo que quiero crear (el ejemplo es todo una línea):
    "11/05/10","A",3,0,"U00122 ","11/05/10","A",3,1,110.20,"I",16.0
    Gracias un saludo Rafael

    ResponderEliminar
  21. Hola antes que nada gracias por compartir, ya a nos has dicho como convertir de excela .txt pero conoces alguna forma para gurdarese txt con codificacion UTF-8

    ResponderEliminar
  22. hola que tal antes que nada eres un genio ,pero una pregunta ,como le ago para que me estraiga los datos de una hoja oculta de un libro de excel y de un rango espesifico aunq tenga filtros me estraiga todo el rango muchas gracias por este gran apote

    ResponderEliminar
  23. Hola tu aporte me parece muy buena solución para aquellos que lo necesitan, lo quisiera aplicar porque me es útil pero quisiera una mejora y es que quisera que en vez de tomar el nombre del mismo libro tome como nombre el valor que se encuentra en una celda de otra hoja del mismo libro.
    Gracias

    ResponderEliminar
  24. Sustituye esta línea:

    fichero = ThisWorkbook.Name

    Por esta otra (si está en la hoja3 que se llama por ejemplo "VENTAS", y en la celda B2):

    fichero = hoja3.Range("B2")

    O bien así, si quieres referirte al nombre de la pestaña (no al nombre interno de la hoja):

    fichero = Sheets("VENTAS").Range("B2")

    En esa celda de la que tomas el nombre, no debería haber caracteres "raros" como estos, entre otros:

    :/\?*[]

    Saludos.

    ResponderEliminar
  25. He probado lo que decis, pero no me acaba de servir porque me introduce tabs. Yo necesito indicarle el tamaño de los campos en el fichero para que me los grabe seguidos pero respetando las posiciones, para luego procesarlo

    ResponderEliminar
  26. Perdón por mi ignorancia.
    He probado muchas veces el macro
    Sub Acomodar_texto_version_2 y no termina de salirme como a ti. Puedes indicarme por qué.
    En la fila primera me queda desplazado el elemento que correspondería a D1.
    Muchas gracias.
    Jesús.

    ResponderEliminar
  27. 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

    ResponderEliminar