¿Cómo hacer que mi formulario se pueda ejecutar en cualquier hoja de mi libro?

Ojalá me puedas ayudar en esto, estaría muy agradecido.
Sucede que yo asigné control activex a una hoja en excel la cual me abre un formulario (Useform). La duda es si puedo hacer que esta "ventana" / formulario pueda ser vista en cualquier hoja de mi libro y ojalá si se pudiera usar desde fuera del Excel si es posible.

1

1 Respuesta

84.200 pts. Ingeniero Industrial, docente universitario de...

Suponiendo que tu formulario se llama UserForm1... deberías agregar este código a la hoja de código de ThisWorkBook

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
UserForm1.Show
End Sub

Desde fuera de Excel no lo veo posible, toda vez que si ya estas fuera de excel no podrías controlar que estas cambiando de hoja... (el otro programa ya no tendría hojas)

Funciona muy bien,pero esto mismo me genera un error al momento de ejecutar mis macros, ejemplo: en mi caso tengo un botón(en useForm) que hace que abra un archivo lo copie a mi Libro donde tengo el formulario y lo corrija (es una planilla desordenada el archivo abierto) y al momento de copiarlo me sale un error sobre el UseForm1.Show.
Pd: no es error de los macros que realize anteriormente, ya que sin agregar esos códigos en ThisWorkBook funciona bien

El código que te indica lo único que hace es mostrar el formulario... No le cambia nada asi que es lo mismo que si lo mostraras con ese código o crearas un botón ActiveX en cada hoja para abrirlo...

Los formularios no se crean para una hoja en particular... en el código corresponde a una colección diferente a la de las hojas... Si el formulario da error es porque algo del código no es correcto... y allí pueden ser muchas posibilidades...

Sin embargo me atrevería a empezar descartando una:

Si el formulario funciona bien en una hoja, quizás es que es en esa hoja que hay algún valor en particular pero esta referenciado como una referencia del tipo Range("C5").Value... y cuando vas a otra hoja, toma el valor de C5 de la otra hoja.... para corregir esto, si fuera el caso deberías introducir toda la jerarquía de objetos para hacer siempre referencia al dato adecuado.... Sheets("LaHojaEnLaQueSiFunciona"). Range("C5").value

Me comentas si encuentras algo o sino enviame el programa para analizarlo... si se puede

Este es el error que me aparece, sin agregar lo ultimo que me dijiste.
ERRO'400': El formulario ya está mostrado. No se puede mostrar en forma modal.


Al momento de buscar el archivo (otro libro), copiar su hoja a mi hoja principal (del libro donde ejecuto macros) y al corregirla ahí me lanza ese error.
PD: al momento de copiar lo copia en otra hoja de mi Libro principal. Me imagino que ahi ocurre el error al abrir el formulario automáticamente. Te podría mandar el programa que tengo, pero es muy largo, y no me va a dejar compilarlo acá para mandar la pregunta.
Pero si es necesario haré el intento de enviártelo, muchas gracia<span style="background-color: #bdeaa0;">s!!
</span>

¿Tu quieres que el formulario aparezca en las hojas y solo se pueda interactuar con el? (¿Es decir que sea "modal" e impida el acceso a la Hoja que se ve en ese momento?)

Para eso colocas la orden

UserForm1.Show

Si mas bien quieres que este visible pero tu puedas interactuar con la hoja de Excel y tener el formulario "flotando a un lado" la orden sería

UserForm1.Show False

Si estas en el segundo caso y has abierto tu formulario con el botón ActiveX bajo esta modalidad... al momento de ejecutar la nueva macro que te envié va a intentar abrir el formulario otra vez y por eso el error..

Para corregirlo yo cambiaría las lineas por:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

On Error Resume Next ' Si hay error porque no se puede abrir salta la instrucción

UserForm1.Show False ' Abre el formulario flotante

End Sub

Pruebas y me avisas...

Antes que todo gracias por ayudarme.
La verdad es que ya no me aparece el error y funciona bien las macros.
Lo único, eso si, es que al momento de cerrar el formulario, en la hoja en donde se copia por ejemplo, tendría que ir a la primera hoja para abrir de nuevo el formulario.
Entonces no se si este formulario se pueda Minimizar como una ventana,por ejemplo.

En cualquier caso estoy conforme por como quedó, asi que muchas gracias :)

El error debe haber ocurrido porque aun estabas abriendo el formulario con el control activeX que tenias... ahora que ya lo hace el código ya no ocurre...

El porque no funciona a veces es porque el código solo funciona cuando "cambias" a una hoja... pero si vas a otro archivo y regresas... en el archivo original no has "cambiado" de hoja..

Para que igual asi aparezca el formulario... agrega otro evento... que se "dispara" también cuando "activas" el libro...

Debajo de la macro.. agrega otra macro para ese evento

Private Sub Workbook_Activate()
On Error Resume Next ' Si hay error porque no se puede abrir salta la instrucción
UserForm1.Show False ' Abre el formulario flotante
End Sub

Deja entender, entonces ese mismo código que puse en el ThisWorkBook, tengo que ponerlo en otro módulo? o en la macro donde ejecuta esas 3 cosas que dije anteriormente?.Una aclaración esa macro que hace las 3 cosas,en realidad son 3 macros independientes. Las 3 se ejecutan al mismo tiempo porque le asigné un botón en el UserForm. Saludos!

En el modulo ThisWorkbook coloca esto (el resumen):

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
On Error Resume Next ' Si hay error porque no se puede abrir salta la instrucción
UserForm1.Show False ' Abre el formulario flotante
End Sub

Private Sub Workbook_Activate()
On Error Resume Next ' Si hay error porque no se puede abrir salta la instrucción
UserForm1.Show False ' Abre el formulario flotante
End Sub

debe bastar con eso...

Las macros del modulo ThisWorkbook se disparan por eventos... es decir porque algo ocurre en Excel... ya sea que tu lo realizas manualmente (cambiar de hoja) o que tu macro lo realice (ir a otra hoja para copiar la información, regresar, etc...)..

Podría ser que ya no necesites el código de mostrar formulario en tus otras macros.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas