Bueno Analía, un par de días después escribo sobre el tema que me solicitaras en este post.
Quería lograr un código un poco mas compacto, pero esto me generaba problemas entre las distintas versiones de Excel, así que unifiqué criterios y escribí algo que funciona sin importar la versión.
La situación planteada era la siguiente: en un libro que posee aprox 40 hojas, nuestra macro se debe encargar de ir hoja x hoja y guardarla con formato TXT, ya que Analía debe realizar esta tarea a mano, lo que le produce una gran pérdida de tiempo.
La imagen de arriba muestra una tabla común y corriente, cuyo formato se repite en todas las hojas del libro. Igualmente, y como cada hoja se guardará en un archivo independiente, cada una de las tablas podría tener un formato distinto, aunque desde ya visualicemos problemas a la hora de consolidar esos archivos.
Resta solicitar al usuario que, de alguna forma, identifique las hojas a migrar. En mi ejemplo, a cada hoja que quiero llevar al archivo de texto le antepongo las letras txt:
Si quisiéramos lograr que cada campo quede separado por comas ( , ), debemos modificar la siguiente línea:
por esta otra:
En nuestro Explorador se verá:
Resta solicitar al usuario que, de alguna forma, identifique las hojas a migrar. En mi ejemplo, a cada hoja que quiero llevar al archivo de texto le antepongo las letras txt:
El código es sencillo. Recorro una x una las hojas, copio sus celdas, abro un nuevo libro y allí las pego, guardando luego ese nuevo libro con el formato TXT. Estimo que esos archivos serán llevados a una base de datos, por cuanto para evitar inconvenientes a futuro le borro el encabezado a cada tabla, eliminando la fila completa. La rutina se encuentra bien documentada, explicando cada línea de código.
Sub MigrarHojasA_TXT() 'declaro las variables de uso local Dim Ruta As String Dim Hoja As Worksheet Dim ConfiguraHojas, Cont As Integer 'los libros que se guardan como TXT deben poseer 'solo una hoja. Guardo la configuración de cuantas 'hojas incorpora Excel en un nuevo libro ConfiguraHojas = Application.SheetsInNewWorkbook 'defino la ruta en donde guardaré los TXT Ruta = "c:\blog\" 'trabajo un poco sobre Excel: 'le ordeno que ponga una sola hoja en cada nuevo 'libro que abra Application.SheetsInNewWorkbook = 1 'quito el refresco de pantalla, para que la macro 'corra mas rápido. Application.ScreenUpdating = False 'anulo los mensajes de alerta. Application.DisplayAlerts = False 'pongo un controlador de errores, por las dudas On Error GoTo salida: 'con el For recorro todos los objetos Sheet de 'la colección Sheets del libro For Each Hoja In ActiveWorkbook.Sheets 'solo migro aquellas hojas cuyo nombre empiecen 'con "txt" If Left(Hoja.Name, 3) = "txt" Then 'copio todas las celdas Hoja.Cells.Copy 'agrego un libro Application.Workbooks.Add 'pego los datos en la hoja ActiveSheet.Paste 'borro el encabezado de la tabla: Range("a1").EntireRow.Delete 'guardo el nuevo libro como TXT. el archivo llevará el 'nombre de la hoja ActiveWorkbook.SaveAs "c:\blog\" & Hoja.Name & ".txt", xlText 'cierro sin guardar cambios ActiveWorkbook.Close xlDoNotSaveChanges 'una variable contador, para avisar al final cuantas 'hojas migré Cont = Cont + 1 End If Next Hoja 'aqui pongo la etiqueta del controlador de errores: salida: 'habilito los mensajes de alerta Application.DisplayAlerts = True 'habilito el refresco de pantalla Application.ScreenUpdating = True 'vuelvo a poner la antigua configuración sobre la 'cantidad de hojas con la cual Excel abre un nuevo 'libro Application.SheetsInNewWorkbook = ConfiguraHojas 'destruyo a Hoja, para liberar recursos Set Hoja = Nothing 'aviso: MsgBox "se migragron a TXT " & Cont & " planillas de cálculo" End Sub
así se ve una hoja de Excel migrada a TXT mediante macros.
Si quisiéramos lograr que cada campo quede separado por comas ( , ), debemos modificar la siguiente línea:
ActiveWorkbook.SaveAs "c:\blog\" & Hoja.Name & ".txt", xlText
por esta otra:
ActiveWorkbook.SaveAs "c:\blog\" & Hoja.Name & .csv, xlCSV
En nuestro Explorador se verá:
Resta aclarar que el Sub anterior sobreescribirá cualquier archivo con el mismo nombre dentro del directorio especificado. Si quisieramos evitar esto tenemos a la función DIR() para saber si ya existe ese archivo.
Prueben este código:
que les arrojará lo siguiente:
O bien:
Prueben este código:
Function ExisteArchivo(Ruta As String) If Dir(Ruta) = "" Then MsgBox "el archivo no existe en la ruta: " _ & vbCrLf & Ruta Else MsgBox "el archivo ya existe en la ruta: " _ & vbCrLf & Ruta End If End Function Sub UnSubCualquiera() ExisteArchivo ("c:\blog\txt_Hoja1.txt") End Sub
que les arrojará lo siguiente:
Suerte Analía, espero que te sirva mi ejemplo y cualquier duda me avisas.
Les dejo el link al archivo.
Les dejo el link al archivo.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios
Publicar un comentario