Hojas de cálculo en Excel - página principal

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:

Anónimo dijo...

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

Javier Marco dijo...

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

Cristian Hernandez dijo...

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

Javier Marco dijo...

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.

juan dijo...

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

Javier Marco dijo...

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.

SAMUEL ELOY dijo...

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.

Anónimo dijo...

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

alberto dijo...

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

El_gaita dijo...

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"

El_gaita dijo...

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

Nico Ruiz dijo...

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.

Javier Marco dijo...

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.

Nico Ruiz dijo...

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.

Anónimo dijo...

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????

Anónimo dijo...

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

Javier Marco dijo...

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.

Jorge dijo...

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.

Javier Marco dijo...

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.

Anónimo dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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

Javier Marco dijo...

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.

Anónimo dijo...

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

Anónimo dijo...

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.

JESURF dijo...

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