En excel 2007 macro para duplicar un formulario

Necesito crear una macro para duplicar un formulario y renombrar el nombre del formulario duplicado, y en un botón de comando en el código modificar una palabra.

1 Respuesta

Respuesta
1

Lo que pides es bastante complicado implica saber programar en VBE y directamente no se puede copiar se tiene que usar exportar el formulario, renombrar el original, importar el formulario, renombrarlo y devolver al formulario original su nombre ademas tal vez en el proceso se pierdan propiedades del formulario original, esta es la macro que hace lo que mencione, solo tienes que cambiar la ruta y las palabras hola por las de tu preferencia, en la variable nombre se guardara el nombre original del formulario, respecto a lo otro no entiendo que es lo que ocupas.

Sub COPIAR_FORMULARIO()
Set LISTA = ThisWorkbook.VBProject.VBComponents
For Each Control In LISTA
If Not Control Is Nothing Then
    If UCase(Control.DESIGNERID) = "FORMS.FORM" Then
        NOMBRE = Control.Name
        Exit For
    End If
End If
Next
ThisWorkbook.VBProject.VBComponents(NOMBRE).Export ("C:\CODIGO\" & NOMBRE & ".FRM")
Control.Name = "HOLA"
ThisWorkbook.VBProject.VBComponents.Import ("C:\CODIGO\" & NOMBRE & ".FRM")
ThisWorkbook.VBProject.VBComponents(NOMBRE).Name = "HOLA2"
ThisWorkbook.VBProject.VBComponents("HOLA").Name = NOMBRE
set lista=nothing
End Sub

Olvide mencionar que tienes que tener activado este componente en tus referencias sino la macro puede dar problemas

agradecido por la macro, pero tengo un problema con "herramientas" y "referencias", porque lo tengo en gris inactivo, y no se como activarlo para activar la casilla de "microsoft visual basic for applications Extensibility 5. ". S.O.S.

El problema de las referencias ya lo he resuelto, pero al hacer correr el código que me indicas no se porque se va a otro formulario; me explico:

Tengo un formulario ARTNUEVO, y dentro del formulario un comandButon4 que al ejecutarlo quiero que duplique este mismo formulario, ¿podrías explicarme un poco el código para ver de resolverlo. En especial LISTA Y Control in lista y Control.designerid= FORMS.FORM

Gracias anticipadas

Alfredo

Lo que quieres hacer no se puede, no puedes exportar un formulario que esta activo, aquí propiamente no estas copiando como tal sino engañando a Excel para duplicar el formulario usando una exportación y una importación y en ambos casos el formulario necesita estar cerrado e incluso te va a poner por lo menos tres mensajes de error entre ellos uno de memoria insuficiente, recuerda que estas programando sobre el explorador de VBA, si vas a hacer pruebas hazlo sobre una copia usar este tipo de programación es muy delicado te puede dañar el archivo.

ENTENDIDO, PERFECTO, estoy en un libro de prueba por si acaso, la pregunta es si me puedes explicar el código "desde set lista hasta next", porque no veo donde pone el nombre del formulario a copiar y del formulario nuevo, perdona mi ignorancia.

Atentamente:

Alfredo

set lista carga las propiedades de los componentes del panel explorador de VBA, en el estan los objetos modulos, modulos de clase, formularios y las hojas de Excel, el ciclo for each recorre los objetos y los guarda en una variable llamada control con la cual compara con la propiedad designerid si esta resulta ser un formato ("forms.form") entonces con la propiedad control.name obtiene el nombre original del formulario y lo guarda en una variable llamada nombre, como en este caso es solo un formulario en cuanto lo encuentra se sale del ciclo for, y de hay con la variable nombre hace la exportacion hacia una ruta que tu definas, y con el control.name le cambia el nombre al formulario original esto se tiene que hacer porque al momento de importarlo lo hara con el nombre original del formulario y como no puede haber 2 formularios con el mismo nombre te marcara error y detendra la macro, ya que la macro hace la importacion entonces con esta instruccion 

ThisWorkbook.VBProject.VBComponents(NOMBRE).Name = "HOLA2"

Hace el cambio de hombre del formulario importado por hola2 y esta instruccion le devuelve el nombre original al primer formulario

ThisWorkbook.VBProject.VBComponents("HOLA").Name = NOMBRE

en hola2 tu das el nombre que quieras, en hola, igual en el 

Control.Name = "HOLA"

Aqui cambias el hola por el nombre que tu quieras con la condicion que tambien lo cambies en el hola que aparece entre parentisis, como dije el nombre original tu no lo buscas la macro lo busca por ti, tu solo defines los nombres que iran en vez de hola, hola2 y la ruta que asignes tiene que acabar con nombre & ".FRM" para que pueda guardarla como formato

ya lo entendí, el problema que tengo es que hya 20 formularios, y escoge el primero que pilla en la "lista" no?, puedo especificar el nombre del formulario que quiero duplicar en esa "lista" o poner como variable control el nombre del formulario que quiero duplicar?

gracias por tu explicacion ha sido magnifica par mis pocos conocimientos.

quedo a la espera de ver como poner el formulario concreto que quiero duplicar.

Atentamente:Alfredo

No abríamos ahorrado tanto rollo si desde el principio hubieras aclarado que tu proyecto tenia más de un formulario, te pongo un ejemplo supongamos que tengo 50 formularios y quiero copiar el 15 que se llama userform15, lo que hago es que añado un condicional if cada nombre del formulario lo va a comparar con el que quieres copiar cuando ambos resulten iguales entonces dará por terminado el ciclo for each y usara ese nombre en las siguientes líneas del programa

If UCase(Control.DESIGNERID) = "FORMS.FORM" Then
        NOMBRE = Control.Name
     if nombre="userform15" then Exit For
 End If

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas