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
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
- Compartir respuesta