Crear archivo heredando macro VBA

Mediante una macro VBA (Excel) abrí un nuevo archivo y le inserte los datos que necesitaba, pero necesito que el nuevo archivo (informe) tenga dentro una macro para que el usuario de destino pueda ejecutarla.

Para complicarla un poco más (no porque quiera), tengo informes que la macro seria ingresándola en un modulo de el nuevo archivo (informe), pero también tengo otros informes que necesito que la macro este dentro de la hoja (ya que es una macro que del tipo Worksheet_Change).

Resumiendo:

Caso A: crear nuevo archivo e importarle un modulo.

Caso B: crear nuevo archivo y asignarle una macro del tipo Worksheet_Change a una hoja con nombre especifico.

1 Respuesta

Respuesta
3

H o l a:

Yo lo vería desde otro punto de vista, y creo que más práctico.

Primero crea un archivo con las macros (módulos y eventos de hoja) que necesites.

En ese archivo solamente tendrás una hoja.

Ese archivo será nuestro archivo tipo o nuestro archivo modelo.

Entonces en otro libro pon la siguiente macro:

Sub CopiarArchivo()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set l1 = ThisWorkbook                       'Este libro contiene esta macro
    Set l2 = Workbooks("TipoConMacros.xlsm")    'archivo tipo con macros
    ruta = l1.Path & "\"
    nomb = "Nuevo libro.xlsm"                   'nombre de archivo nuevo
    l2.SaveCopyAs ruta & nomb
    Set l3 = Workbooks.Open(ruta & nomb)
    '
    '
    'En esta parte le insertas los datos que necesitas al nuevo libro
    'y en la hoja que necesites, por ejemplo:
    l3.Sheets("Hoja1").Range("D5") = Date
    '
    '
    L3. Save
    L3. Close
    Application.ScreenUpdating = True
    MsgBox "Archivo copiado"
End Sub

Lo que hace la macro es copiar el archivo TipoConMacros.xlsm con el nombre de archivo que tu quieras.

El siguiente paso, es pasarle los datos que necesitas al nuevo libro (esta parte, según tus comentarios, ya la tienes).

Por último se guarda el nuevo libro, al guardarse se guarda con todas las macros ya sea que estén en un módulo o en una hoja.


Nota: el libro "TipoConMacros.xlsm", deberá estar abierto.


Prueba esta alternativa, se me hace más práctica que entrar al proyecto y copiar macro por macro, o módulo por módulo.


':)
S a l u d o s . D a n t e A m o r
':) Si es lo que necesitas. Recuerda valorar la respuesta. G r a c i a s.

Hola Dante, ¿cómo estas? Por lo que veo es utilizar un archivo como plantilla y allí cargarle los datos normales, esa alternativa la tuve presente pero me complica ya que las personas que van a recibir el archivo suelen realizar manipulaciones a los archivos "base" por lo cual generaban errores de todo tipo, ya tuve varios informes que los manejaba así y no me resulto muy productivo. Así eres tan amable,¿podrás indicarme como copiar la macro al archivo nuevo?

Gracias de antemano.

H o l a:

Estoy bien, gracias por preguntar. ¿Y tu cómo estás?

Te anexo un enlace para copiar un módulo: "Copy A Module From One Project To Another"

http://www.cpearson.com/excel/vbe.aspx 

Sigue las instrucciones que aparecen en el apartado de "Introduction".


También te anexo un código para crear una macro en el evento: Worksheet_SelectionChange, de la "hoja1", del libro "LibroDestino.xlsm"

Sub CrearEvento()
'Act.Por.Dante Amor
    Dim VBAEditor As VBIDE.VBE
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim CodePan As VBIDE.CodeModule
    Dim St As String
    libro = "LibroDestino.xlsm"  'Archivo Destino, previamente guardado como excel habilitado para macros
    hoja = "Hoja1"               'Hoja donde va a quedar la macro
    Application.Workbooks(libro).VBProject.References.AddFromGuid _
        GUID:="{0002E157-0000-0000-C000-000000000046}", _
        Major:=5, Minor:=3
    Set VBAEditor = Application.VBE
    Set VBProj = Application.Workbooks(libro).VBProject
    Set VBComp = VBProj.VBComponents(hoja)
    Set CodeMod = Application.Workbooks(libro).VBProject.VBComponents(hoja).CodeModule
    '
    'En esta parte van las instrucciones de la macro
        strN = strN & "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbCr
        strN = strN & "Target.Interior.ColorIndex = 4" & vbCr
        strN = strN & "End Sub" & vbCr
        CodeMod. AddFromString strN
    '
    Workbooks(libro). Save
End Sub

Regresando al libro "plantilla", la idea es que la plantilla sea controlada por una persona, esa plantilla deberá estar protegida para que no se pueda modificar, también deberán estar protegidas las macros; esa plantilla es la que se copiará a un nuevo libro, el nuevo libro se actualizará con los datos que necesitas y el nuevo libro se entregará al usuario destino. Por ninguna causa el usuario destino deberá tener acceso a la libro "plantilla", por seguridad y porque la plantilla es la base para generar los nuevos libros.


Bueno, ahí te dejo las alternativas para tu objetivo.


':)
'S aludos. D a n t e   A m o r . R ecuerda valorar la respuesta. G racias
':)

Hola Dante, muy bien, gracias por preguntar. Te comento que en el código que me pasaste me sale "No se ha definido el tipo definido por el usuario" y me marca la siguiente línea:

Dim VBAEditor As VBIDE.VBE

¿A qué se debería? Por otro lado, muchas gracias por la otra página, aunque también me tira el mismo error que con tu código, pero tiene mucha información interesante.

En la página que te puse hay unas instrucciones.

Sigue las instrucciones que aparecen en el apartado de "Introduction".

Gracias Dante, el ingres lo llevo medio mal, de todas formas conseguí una traducción más o menos fiable para poder ver lo que dice la página y mientras esperaba tu respuesta me di cuenta de lo de la introducción era bastante importante. Mil gracias por tu ayuda, adjunto un enlace para los que deseen ver la info de esa página y (como yo) les cueste el ingles, tengan en un documento Word una traducción accesible.

Muchísimas gracias Dante como siempre.

http://www.mediafire.com/view/171x9d7iqen0d4c/Interactuar_con_VBA_project.doc

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas