Hola! Estoy trabajando con una base de datos, que debe ser filtrada por Área Funcional y en base a eso, copiar y pegar en un nuevo libro, la informacion separada en hojas distintas, tal como esta en la base original. Luego debe guardar el archivo con el nombre del Área y continuar asi hasta que se terminen.
En mi base tengo 5 Hojas:
-Listado: donde he colocado el listado de areas, de donde se alimenta el bucle.
-Ejecución
-Consumido Real
-Comprometido OC
-Comprometido ERM
Las ultimas 4 hojas son las que contienen la informacion a filtrar y copiar en libro nuevo, separadas en la misma cantidad de hojas. Es decir, que para cada nueva Área Funcional, la macro deberá crear un libro, copiar la hoja Ejecucion y pegarla, copiar la hoja Consumido Real y pegarla, etc. Luego debe guardar el archivo y cerrarlo. Volver a la base y realizar nuevamente el procedimiento.
El comando que he escrito para la primer hoja es el siguiente:
Do While SelectAf <> ""
Sheets("Ejecución").Select
ActiveSheet.ListObjects("Ejecución").Range.AutoFilter Field:=1, Criteria1:=SelectAf
Range("Ejecución[[#Headers],[Área Funcional]]").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
Como debo hacer para que vuelva al archivo base, filtre la hoja "Consumido Real" y la pegue en ese archivo que he creado? En el caso de que primero deba guardar el archivo, como le indico que vaya a ese archivo? Ya que el mismo irá cambiando de acuerdo al Área Funcional que este filtrando.
Actualmente, la macro la hice de prueba para una sola hoja, y luego de copiar y pegar, realiza el siguiente comando:
ActiveWorkbook.SaveAs Filename:="C:\Practico\" & SelectAf & ".xlsx", FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close
Espero puedan ayudarme! Ya que son muchas Áreas Funcionales y perdemos mucho tiempo filtrando manualmente.
Agradecida desde ya.
Puedes crear variables para referirte a objetos, por ejemplo una hoja o un libro, esto simplifica bastante poder moverte de un libro a otro, o de una hoja de un libro a otra hoja de otro libro, que es lo que necesitas.
por ejemplo, puedes definir una variable para el libro principal donde tienes todos los datos
Dim miLibroPrincipal as WorkBook
para asignarle valor, cuando tengas ese libro activo, al principio
Set miLibroPrincipal=ActiveWorkBook
Cada vez que quieras volver a tu libro principal sólo tienes que utilizar esta variable
por ejemplo, para activar el libro principal:
miLibroPrincipal.Activate
Puedes crear otra variable de libro para el libro donde vas a pegar la información
Dim miLibroSecundario as WorkBook
en este caso, debes asignarle valor cuando creas ese nuevo libro con Workbooks.add de la siguiente manera:
Set miLibroSecundario = WorkBooks.Add
puedes hacer cualquier cosa con este libro, por ejemplo
miLibroSecundario.SaveAs....
miLibroSecundario.Activate
y si quieres volver al principal, pues
miLibroPrincipal.Activate
y luego vuelves al secundario
miLibroSecundario.Activate
...
------
Ya sé Excel, pero necesito más.
Muchisimas gracias por la explicacion! Definir de este modo el libro que tiene la informacion Base y los libros que se irán creando me permite realizar todas las acciones que necesito.
Espero pueda escribirlo y funcione correctamente.
Saludos!
A continuacion pego comandos que he escrito para realizar todas las acciones. Tengo un error, esta en Negrita y Subrayado. No se como debo escribirlo. Supongo que es porque "LibroSecundario" no esta guardado con ese nombre, o algo asi. Ya que por ej, mi base con los datos tuve que llamarla con ese nombre para que no me diera error.
Agradezco la ayuda!
Sub AF()
Dim SelectAf As String
Dim NroFila As Single
Dim Base As Workbook
Dim LibroSecundario As Workbook
Range("A2").Select
SelectAf = ActiveCell.Value
Application.ScreenUpdating = False
Do While SelectAf <> ""
Sheets("Ejecución").Select
ActiveSheet.ListObjects("Ejecución").Range.AutoFilter Field:=1, Criteria1:=SelectAf
Range("Ejecución[[#Headers],[Área Funcional]]").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Workbooks.Add
Set LibroSecundario = Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
Workbooks("Base").Activate
Sheets("Consumido Real").Select
ActiveSheet.ListObjects("ConsumidoReal").Range.AutoFilter Field:=1, Criteria1:=SelectAf
Range("ConsumidoReal[[#Headers],[Área Funcional]]").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Workbooks("LibroSecundario").Activate
Sheets.Add After:=ActiveSheet
ActiveSheet.Paste
Application.CutCopyMode = False
Workbooks("Base").Activate
Sheets("Comprometido OC").Select
ActiveSheet.ListObjects("ComprometidoOC").Range.AutoFilter Field:=1, Criteria1:=SelectAf
Range("ComprometidoOC[[#Headers],[Área Funcional]]").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Workbooks("LibroSecundario").Activate
Sheets.Add After:=ActiveSheet
ActiveSheet.Paste
Application.CutCopyMode = False
Workbooks("Base").Activate
Sheets("Comprometido ERM").Select
ActiveSheet.ListObjects("ComprometidoERM").Range.AutoFilter Field:=1, Criteria1:=SelectAf
Range("ComprometidoERM[[#Headers],[Área Funcional]]").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Workbooks("LibroSecundario").Activate
Sheets.Add After:=ActiveSheet
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Hoja1").Select
Sheets("Hoja1").Name = "Ejecución"
Sheets("Hoja2").Select
Sheets("Hoja2").Name = "Consumido Real"
Sheets("Hoja3").Select
Sheets("Hoja3").Name = "Comprometido OC"
Sheets("Hoja4").Select
Sheets("Hoja4").Name = "Comprometido ERM"
ActiveWorkbook.SaveAs Filename:="C:\Practico\" & SelectAf & ".xlsx", FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close
Workbooks("Base").Activate
Sheets("LISTADO").Select
Range("A2").Select
NroFila = NroFila + 1
SelectAf = ActiveCell.Offset(NroFila, 0).Value
Loop
MsgBox ("Macro Finalizada")
End Sub
LibroSecundario es una variable que representa el libro, no es el nombre del libro
para activarlo se hace así
LibroSecundario.Activate
------
Ya sé Excel, pero necesito más.
Muchas gracias por todo! He logrado que funcione correctamente todo.
Sin su ayuda no hubiera podido!