Pasar varios libros de excel a TXT
Tengo una carpeta con 250 libros en excel y debo guardar cada libro en txt, ¿hay una macro que me ayude a ejecutar esta instrucción sin abrir los 250 libros?
1 respuesta
Para pasar los datos a txt es necesario abrir el libro y guardar como txt.
Se puede hacer un ciclo: abrir, pasar a txt, cerrar el libro.
Si quieres ayuda, puedes poner con detalle qué quieres hacer.
1. El libro puede tener varias hojas, cuál hoja quieres pasar a txt.
2. En dónde guardar el txt.
3. Cómo se va a llamar el archivo txt.
4. Qué formato de txt quieres, puedes poner un ejemplo.
Nota: Una cosa que debes tener en cuenta cuando haces una pregunta en un foro ... las personas a las que solicitas ayuda no saben absolutamente nada acerca de tus datos, absolutamente nada sobre cómo están en el libro de trabajo, absolutamente nada sobre lo que tú quieres que se haga con él y absolutamente nada sobre cómo quieres el resultado ... debes ser muy específico al describir cada una de estas áreas, en detalle, y no debes suponer que seremos capaces de "resolverlo" por nuestra cuenta. Recuerda, nos estás pidiendo ayuda ... así que ayúdanos, brindando la información que necesitamos para hacerlo, incluso si esa información te parece "obvia" (recuerda, sólo es obvia para ti porque estás familiarizado con tus datos, su diseño y el objetivo general para ellos).
Perdón por no ser más detallista
El libro solo tiene una hoja, voy a guardarla en una carpeta que tengo en el escritorio, el txt se va a llamar igual que el libro y el txt va separdo por un =
Gracias por la ayuda
Faltan datos.
En cuál carpeta están los libros.
Inicia la Grabadora de macros realiza lo siguiente:
Abre uno de tus archivos de excel. Guarda la hoja con el formato de texto deseado. Cierra el archivo.
Regresa a detener la macro.
Pega aquí la macro.
Hola, gracias por tu paciencia y por tu ayuda.
En cuanto al formato, estoy un poco confundida, porque no se cual es el adecuado para este caso.
Mira esta es la macro que uso para crearlos y donde quedan guardados:
Sub Macro2()
Dim RutaArchivo As String
Dim sh As Worksheet
Dim ho As Worksheet
Dim l2 As Workbook
Dim i As Long
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set sh = Sheets("Hoja1")
Set ho = Sheets("Hoja2")
RutaArchivo = "C:\Users\Usuario\Documents\Pruebas\"
For i = 2 To sh.Range("A" & Rows.Count).End(3).Row
Set l2 = Workbooks.Add
With l2.Sheets(1)
.Cells.NumberFormat = "@"
.Range("A1:A61").Value = Application.Transpose(ho.Range("A1:BI1").Value)
.Range("B1:B61").Value = Application.Transpose(ho.Range("A2:BI2").Value)
.Range("B4:B11").Value = Application.Transpose(sh.Range("A" & i & ":H" & i).Value)
.Range("B13:B14").Value = Application.Transpose(sh.Range("I" & i & ":J" & i).Value)
.Range("B19").Value = Application.Transpose(sh.Range("K" & i & ":K" & i).Value)
.Range("B28:B61").Value = Application.Transpose(sh.Range("L" & i & ":AS" & i).Value)
.Range("B1:B70").HorizontalAlignment = xlLeft
l2.SaveAs RutaArchivo & "20211030" & "_" & .Range("B32").Value & ".xls", xlNormal
l2.Close False
End With
Next
Application.ScreenUpdating = True
MsgBox "El proceso ha terminado", vbInformation
End Sub
y quiero que quede en una carpeta que esta en la siguiente ruta
C:\Users\Usuario\Documents\pruebas txt\
Los archivo deben quedar separados con un =, cada libro tiene dos columnas, una sola hoja.
Agradecida con tu ayuda!
En cuanto al formato, estoy un poco confundida, porque no se cual es el adecuado para este caso.
Sube a la red 2 archivos. El archivo de excel y el archivo de texto con el formato que quieres. Para que yo pueda ver el archivo de excel original y el resultado en el archivo texto que tú deseas.
Utiliza google drive para compartir archivos. Comparte el archivo con la opción a "Cualquier persona que tenga el vínculo". Copia el vínculo de cada archivo y lo pegas aquí.
Sería mejor que en esa misma macro guarde el archivo como excel y al mismo tiempo guarde el archivo como txt. Pero necesito saber cómo quieres el archivo txt.
Sube los 2 archivos a la red y los reviso.
Hola
Gracias por continuar ayudándome
Te adjunto el enlace
https://drive.google.com/drive/folders/1A_BmD3uTpwHzw9QPRmXT2fhWFJYV3xap?usp=sharing
El archivo de excel tiene 2 hojas. Habías comentado que solamente tenía una hoja.
El archivo txt no es un archivo txt, es un archivo en word.
Los datos de archivo de excel no coinciden con los datos que vienen en el archivo de wrod.
Puedes subir otros 2 archivos, pero que sean coincidentes.
Necesito ver realmente cómo está el archivo de excel. Con una hoja y con los datos originales.
Necesito ver cómo quieres el archivo txt, pero un archivo txt no un archivo de word.
Te ayudo un poco.
Ya ejecuté la macro y resulta un archivo de excel así:

Y así quieres el archivo txt:

Nota: Observa como mis ejemplos tienen relación, los datos del archivo de excel son los mismos datos que el archivo txt. Así es como se debe presentar un ejemplo.
Me confirmas si es así como quieres el resultado.
Te paso la Macro2 actualizada para crear el archivo txt y también el archivo xls.
Copia todo el código en un módulo y ejecuta la macro Macro2.
Sub Macro2()
'Por.Dante Amor
Dim sh1 As Worksheet, sh2 As Worksheet
Dim Ruta As String, Archivo As String
Dim l2 As Workbook
Dim i As Long
'
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'
Set sh1 = Sheets("Hoja1")
Set sh2 = Sheets("Hoja2")
Ruta = "C:\Users\Usuario\Documents\Pruebas\"
'
For i = 2 To sh1.Range("A" & Rows.Count).End(3).Row
Set l2 = Workbooks.Add
With l2.Sheets(1)
.Cells.NumberFormat = "@"
.Range("A1:A61").Value = Application.Transpose(sh2.Range("A1:BI1").Value)
.Range("B1:B61").Value = Application.Transpose(sh2.Range("A2:BI2").Value)
.Range("B4:B11").Value = Application.Transpose(sh1.Range("A" & i & ":H" & i).Value)
.Range("B13:B14").Value = Application.Transpose(sh1.Range("I" & i & ":J" & i).Value)
.Range("B19").Value = Application.Transpose(sh1.Range("K" & i & ":K" & i).Value)
.Range("B28:B61").Value = Application.Transpose(sh1.Range("L" & i & ":AS" & i).Value)
.Range("B1:B70").HorizontalAlignment = xlLeft
'
Archivo = "20211030" & "_" & .Range("B32").Value
'
Call CreaTxt(l2, Ruta, Archivo)
'
l2.SaveAs Ruta & Archivo & ".xls", xlNormal
l2.Close False
End With
Next
Application.ScreenUpdating = True
MsgBox "El proceso ha terminado", vbInformation
End Sub
'
Sub CreaTxt(l2 As Workbook, Ruta As String, Archivo As String)
'Por.Dante Amor
Dim nFileNum As Long, j As Long
'
With l2.Sheets(1)
nFileNum = FreeFile
Open Ruta & Archivo & ".txt" For Output As #nFileNum
For j = 1 To .Range("A" & Rows.Count).End(3).Row
Print #nFileNum, .Range("A" & j) & "=" & .Range("B" & j)
Next
Close #nFileNum
End With
End Sub
¡Gracias!
De verdad mil gracias por tu ayuda. Eres super buenísimo con el Excel!
Bendiciones!!!!
Una ultima molestia, si una celda queda en blanco, como en es el caso de FechaRetiro, existe alguna forma que me permita eliminar esa fila sin que se corran las demás, teniendo en cuenta que una parte del nombre es de una celda ya especifica(TrabNumDoc), que es la celda (B32). Tenia una macro que la elimina pero me corre hacia arriba una fila, obviamente, no se si exista algo que la elimine sin subir las celdas.
De nuevo mil gracias por la ayuda
No entiendo.
Quieres eliminar la fila 5 o la fila 32.
Para estos casos es cuando debes poner 2 imágenes una mostrando cómo están los datos y en otra imagen mostrando el resultado que tú deseas.
[No olvides valorar.
Entonces solamente quieres borrar los datos de la fila 5, quedaría (te faltó la imagen)
Ayúdame a ayudarte, pon los datos completos.
Algo como esto:

Prueba lo siguiente:
Sub Macro2()
'Por.Dante Amor
Dim sh1 As Worksheet, sh2 As Worksheet
Dim Ruta As String, Archivo As String
Dim l2 As Workbook
Dim i As Long, k As Long
'
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'
Set sh1 = Sheets("Hoja1")
Set sh2 = Sheets("Hoja2")
Ruta = "C:\Users\Usuario\Documents\Pruebas\"
Ruta = "C:\trabajo\entrada\"
'
For i = 2 To sh1.Range("A" & Rows.Count).End(3).Row
Set l2 = Workbooks.Add
With l2.Sheets(1)
.Cells.NumberFormat = "@"
.Range("A1:A61").Value = Application.Transpose(sh2.Range("A1:BI1").Value)
.Range("B1:B61").Value = Application.Transpose(sh2.Range("A2:BI2").Value)
.Range("B4:B11").Value = Application.Transpose(sh1.Range("A" & i & ":H" & i).Value)
.Range("B13:B14").Value = Application.Transpose(sh1.Range("I" & i & ":J" & i).Value)
.Range("B19").Value = Application.Transpose(sh1.Range("K" & i & ":K" & i).Value)
.Range("B28:B61").Value = Application.Transpose(sh1.Range("L" & i & ":AS" & i).Value)
.Range("B1:B70").HorizontalAlignment = xlLeft
'
'Eliminar datos en blanco
For k = 1 To .Range("A" & Rows.Count).End(3).Row
If .Range("B" & k).Value = "" Then .Range("A" & k).Value = ""
Next
'
Archivo = "20211030" & "_" & .Range("B32").Value
'
Call CreaTxt(l2, Ruta, Archivo)
'
l2.SaveAs Ruta & Archivo & ".xls", xlNormal
l2.Close False
End With
Next
Application.ScreenUpdating = True
MsgBox "El proceso ha terminado", vbInformation
End Sub
'
Sub CreaTxt(l2 As Workbook, Ruta As String, Archivo As String)
'Por.Dante Amor
Dim nFileNum As Long, j As Long
'
With l2.Sheets(1)
nFileNum = FreeFile
Open Ruta & Archivo & ".txt" For Output As #nFileNum
For j = 1 To .Range("A" & Rows.Count).End(3).Row
Print #nFileNum, .Range("A" & j) & "=" & .Range("B" & j)
Next
Close #nFileNum
End With
End Sub[No olvides valorar las respuestas.
Gracias
en el txt queda el =
CodEncoding=UTF-8
TipoXML=102
Novedad=false
FechaIngreso=2021-08-02
=
FechLiquiIni=2021-10-01
y debe quedar
CodEncoding=UTF-8
TipoXML=102
Novedad=false
FechaIngreso=2021-08-02
FechLiquiIni=2021-10-01
¿En serio?
Vas a calificar mi respuesta con "Buena".

En fin, voy a poner la macro completa con lo último que pediste, que no estaba en tu petición original. Porque me gusta entregar las respuestas completas.
Sub Macro2()
'Por.Dante Amor
Dim sh1 As Worksheet, sh2 As Worksheet
Dim Ruta As String, Archivo As String
Dim l2 As Workbook
Dim i As Long, k As Long
'
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'
Set sh1 = Sheets("Hoja1")
Set sh2 = Sheets("Hoja2")
Ruta = "C:\Users\Usuario\Documents\Pruebas\"
'
For i = 2 To sh1.Range("A" & Rows.Count).End(3).Row
Set l2 = Workbooks.Add
With l2.Sheets(1)
.Cells.NumberFormat = "@"
.Range("A1:A61").Value = Application.Transpose(sh2.Range("A1:BI1").Value)
.Range("B1:B61").Value = Application.Transpose(sh2.Range("A2:BI2").Value)
.Range("B4:B11").Value = Application.Transpose(sh1.Range("A" & i & ":H" & i).Value)
.Range("B13:B14").Value = Application.Transpose(sh1.Range("I" & i & ":J" & i).Value)
.Range("B19").Value = Application.Transpose(sh1.Range("K" & i & ":K" & i).Value)
.Range("B28:B61").Value = Application.Transpose(sh1.Range("L" & i & ":AS" & i).Value)
.Range("B1:B70").HorizontalAlignment = xlLeft
'
Archivo = "20211030" & "_" & .Range("B32").Value
'
Call CreaTxt(l2, Ruta, Archivo)
'
l2.SaveAs Ruta & Archivo & ".xls", xlNormal
l2.Close False
End With
Next
Application.ScreenUpdating = True
MsgBox "El proceso ha terminado", vbInformation
End Sub
'
Sub CreaTxt(l2 As Workbook, Ruta As String, Archivo As String)
'Por.Dante Amor
Dim nFileNum As Long, j As Long
'
With l2.Sheets(1)
nFileNum = FreeFile
Open Ruta & Archivo & ".txt" For Output As #nFileNum
For j = 1 To .Range("A" & Rows.Count).End(3).Row
If .Range("B" & j).Value = "" Then
.Range("A" & j).Value = ""
Print #nFileNum,
Else
Print #nFileNum, .Range("A" & j) & "=" & .Range("B" & j)
End If
Next
Close #nFileNum
End With
End SubSi en el archivo txt no quieres la fila vacía, entonces borra esta línea:
Print #nFileNum,
Ni te molestes en corregir la valoración. Ya no te voy a brindar mi ayuda.
- Compartir respuesta