Macros Excel: Mover varias hojas a otro libro.

Del foro. Quisiera hacerles una consulta y tal vez me puedan ayudar. La consulta es la siguiente:

Tengo un libro habilitado para macros cuya extensión es xlsm. El libro se llama "Horas" el cual contiene hojas con los nombres de los meses de ese año. Es decir que hoja1= "ENERO 2016", hoja2="FEBRERO 2016", ............hoja12= "DICIEMBRE 2016".

El libro es sobre el total de horas trabajadas en el mes y tengo una macro echa la cual cada vez que empieza un nuevo mes, me crea una hoja con el mes siguiente lista para ser rellenada y asi sucesivamente mes a mes.

Lo que yo quiero hacer es que cuando se llegue a fin de año, o sea DICIEMBRE 2016, se cree la hoja del mes y año siguiente respectivamente (ENERO 2017) y las otras hojas las mueva a un nuevo libro y ese nuevo libro se llame Año "xxxx", donde xxxx representa al año de los meses; en este caso 2016. Y en el libro de donde se mueven esas hojas (manteniendo siempre las macros en ambos libros) me quede solamente la hoja del mes del año entrante.

1 respuesta

Respuesta
1

. 25.11.16 VBAExportar hoja a libro nuevo

Hola, Fabio

Te comparto la siguiente rutina de VBA que hace lo que pedías.

Accedé al Editor de VBA (Atajo: Alt + F11), allí insertá un módulo (Insertar-Módulo) y pegá el siguiente código:

Sub ExportAño()
'---- Variables modificables ----
'=== FAVIO, modificá estos datos de acuerdo a tu proyecto:
    Carpeta = "C:\AñosCerrados" 'Directorio donde grabar el archivo
    IniArch = "Año " 'texto inicial del archivo nuevo
'---- fin Variables
'
'---- inicio de rutina:
'
Dim Allevar() As String
Carpeta = Carpeta & IIf(Right(Carpeta, 1) = "\", "", "\")
IngrIni:
ElAño = InputBox(" Ingresar AÑO a exportar" & Chr(10) & "(Vacío o Cancelar para salir sin filtrar)", "AÑO A EXPORTAR")
If ElAño = "" Then
    Exit Sub
Else
    If IsNumeric(ElAño) And Len(ElAño) = 4 Then
        For Each LaHoja In Sheets
            If InStr(1, LaHoja.Name, ElAño) > 0 Then
                ReDim Preserve Allevar(Elemento)
                Allevar(Elemento) = LaHoja.Name
                Elemento = Elemento + 1
            End If
        Next
    If Elemento > 0 Then
        Sheets(Allevar()).Move
        ActiveWorkbook.SaveAs Carpeta & IniArch & ElAño & ".xlsx"
        ActiveWorkbook.Close xlNo
        ElMensaje = "Se gravó el archivo : " & IniArch & ElAño & Chr(10) & "en la carpeta: " & Carpeta
        ElTitulo = " AÑO " & ElAño & " EXPORTADO"
        TipoMens = vbInformation
        MsgBox ElMensaje, TipoMens, ElTitulo
    End If
    Else
        ElMensaje = "Lo ingresado: " & ElAño & " no es un año válido." & Chr(10) & "Reingreselo, por favor"
        ElTitulo = "NO ES AÑO"
        TipoMens = vbCritical
        MsgBox ElMensaje, TipoMens, ElTitulo
        GoTo IngrIni
    End If
End If
End Sub

Vas a ver que, al principio del código, hay unas variables para que lo adaptés a tu archivo.

Fijate si es lo que buscabas -y, en tal caso, agradeceré que califiqués mi contribución- o escribí de nuevo aquí, si necesitás más apoyo con esto.

Un abrazo!

Fernando

(Buenos Aires, Argentina)

.

Perdón por tardar en responder... Es justo lo que buscaba... mil gracias... tema solucionado...

.

Muy bien, Fabio!

Me alegro de haberte ayudado.

Un abrazo

Fer

Te hago dos consultas:

La primera es como hago si quiero que la macro me mueva dirwctamente las hojas correspondiente a la del año que termina sin tener que escribir el año que quiero copiar; es decir termina este año y empieza el que sigue y automáticamente mueva las hojas del año que finaliza y deja splo la del año entrante.

Y la segunda es como hago para que cuando mueva las hojas también sean copiadas las macro en los botones. Desde ya mil gracias y si es que se puede hacer. Saludos

.

Hola, Fabio

La siguiente variante asume que el año a considerar es el anterior al que esté en curso al momento de ejecutar la rutina. Adicionalmente llevará al nuevo archivo el módulo que le indiques con las macros que tuviere en él. Tendrás que indicarle una carpeta temporaria donde grabar el módulo que luego borrará:

Sub ExportAño()
'---- Variables modificables ----
'=== FAVIO, modificá estos datos de acuerdo a tu proyecto:
    Carpeta = "C:\AñosCerrados" 'Directorio donde grabar el archivo
    CarpTemp = "C:\prueba" 'carpeta temporaria donde grabar el modulo a exportar
    IniArch = "Año " 'texto inicial del archivo nuevo
    ElModulo = "Modulo2"
'---- fin Variables
'
'---- inicio de rutina:
'  
Dim Allevar() As String
Carpeta = Carpeta & IIf(Right(Carpeta, 1) = "\", "", "\")
CarpTemp = CarpTemp & IIf(Right(CarpTemp, 1) = "\", "", "\")
TempMod = CarpTemp & ElModulo & ".bas"
ActiveWorkbook.VBProject.VBComponents(ElModulo).Export TempMod
'identificación de hojas a llevar  
    ElAño = Year(Date) - 1
        For Each LaHoja In Sheets
            If InStr(1, LaHoja.Name, ElAño) > 0 Then
                ReDim Preserve Allevar(Elemento)
                Allevar(Elemento) = LaHoja.Name
                Elemento = Elemento + 1
            End If
        Next
'generación de archivo AÑO anterior + agrega módulo con macros  
    If Elemento > 0 Then
        Sheets(Allevar()).Move
        ActiveWorkbook.VBProject.VBComponents.Import TempMod
        ActiveWorkbook.SaveAs Carpeta & IniArch & ElAño & ".xlsm", xlOpenXMLWorkbookMacroEnabled
        ActiveWorkbook.Close xlNo
        ElMensaje = "Se gravó el archivo (y sus rutinas de VBA): " & IniArch & ElAño & Chr(10) & "en la carpeta: " & Carpeta
        ElTitulo = " AÑO " & ElAño & " EXPORTADO"
        TipoMens = vbInformation
        MsgBox ElMensaje, TipoMens, ElTitulo
    End If
Kill TempMod
End Sub

Entonces, esta macro se ejecuta sin consultar qué año llevar.

Espero que sea lo que buscabas.

Un abrazo
Fer

.

Hola Fer. Probé el código y me sale este error

Sub Exportar()
'---- Variables modificables ----
'=== FAVIO, modificá estos datos de acuerdo a tu proyecto:
Carpeta = "C:\Users\PAOLA\Documents\Horas Hunter" 'Directorio donde grabar el archivo
CarpTemp = "C:\Users\PAOLA\Documents\Horas Hunter\temporal" 'carpeta temporaria donde grabar el modulo a exportar
IniArch = "Año " 'texto inicial del archivo nuevo
ElModulo = "Modulo2"
'---- fin Variables
'
'---- inicio de rutina:
'
Dim Allevar() As String
Carpeta = Carpeta & IIf(Right(Carpeta, 1) = "\", "", "\")
CarpTemp = CarpTemp & IIf(Right(CarpTemp, 1) = "\", "", "\")
TempMod = CarpTemp & ElModulo & ".bas"
ActiveWorkbook.VBProject.VBComponents(ElModulo).Export TempMod 
'identificación de hojas a llevar
ElAño = Year(Date) - 1
For Each LaHoja In Sheets
If InStr(1, LaHoja.Name, ElAño) > 0 Then
ReDim Preserve Allevar(Elemento)
Allevar(Elemento) = LaHoja.Name
Elemento = Elemento + 1
End If
Next
'generación de archivo AÑO anterior + agrega módulo con macros
If Elemento > 0 Then
Sheets(Allevar()).Move
ActiveWorkbook.VBProject.VBComponents.Import TempMod
ActiveWorkbook.SaveAs Carpeta & IniArch & ElAño & ".xlsm", xlOpenXMLWorkbookMacroEnabled
ActiveWorkbook.Close xlNo
ElMensaje = "Se gravó el archivo (y sus rutinas de VBA): " & IniArch & ElAño & Chr(10) & "en la carpeta: " & Carpeta
ElTitulo = " AÑO " & ElAño & " EXPORTADO"
TipoMens = vbInformation
MsgBox ElMensaje, TipoMens, ElTitulo
End If
Kill TempMod
End Sub

El error ko puse en negrita e italica- sale el cartel de intervalo fuera de indice

.

Buenas, Flavio

Si confirmas que ambas carpetas (C:\Users\PAOLA\Documents\Horas Hunter y "C:\Users\PAOLA\Documents\Horas Hunter\temporal) existen y que el módulo a exportar se llama, efectivamente, Modulo2 (y no Módulo2), o el que fuera, te queda revisar, en ese equipo, si tienes habilitado el acceso al modelo de objetos por VBA.

Ve al menú de opciones de MS Excel (pestaña Archivo) y haz click en Centro de Confianza y luego en el botón a la derecha de Configuración del Centro de Confianza.

Allí busca Configuración de Macros y tilda la opción "Confiar en el acc..." si no lo estuviera. Luego Aceptar hasta volver a la planilla. Cierra el archivo y vuelve a abrirlo antes de ejecutar la rutina.

Creo que con todo esto debería funcionar. Al menos, con esa misma rutina lo hizo en mi máquina.

Saludos

Fer

.

Hola Fernando ahí lo probé y me anduvo lo que pasaba era que no tenía hojas del año en curso por eso me tiraba error.... Mil gracias por tu ayuda. Un abrazo

.

Muy bien.

Me alegro de que anduviera.

Por eso prefería la primera opción, para tener control del año que se quiere exportar.

A veces, tanta automatización mata. (Preguntale a John Connor, sino ;)

Abrazo

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas