Saltar al contenido

Detectar cambio de hoja en formulario


Recommended Posts

publicado

Recurro a ustedes con la siguiente duda.

Estoy haciendo un complemento, pero tengo un problema.

Necesito que el formulario activo detecte el cambio de hoja, para que se ejecute una macro.

Existe alguna forma de realizar esto ¿?  

Gracias de antemano

publicado
Hace 14 horas, MauriciodeAbreu dijo:

Existe alguna forma de realizar esto ¿?  

¿Y porqué desde el formulario? Tienes esa opción en los eventos del libro

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

 

publicado

Hola Haplox.

Ciertamente se que cuento con esa opcion.

Pero lo que estoy haciendo es un complemento (un grupito de herramientas en el Ribbon para tenerlas a la mano), por tanto no se trabajara directamente sobre la hoja del complemento, sino, sobre otros libros que no tienen ni las macros ni el formulario.

Y al cambiar de hoja, necesito que unos dos o tres CheckBox actualicen su estado (true/false) dependiendo de ciertas condiciones.

Es por eso que me surge la duda.

Agradecido por tus comentarios

publicado

Buenas Antoni, me encantaría subirlo, pero estoy muy crudo, apenas estoy empezando a crear las macros que llevara el complemento (y me tope con esta dificultad), y para evitarme tener a la vista (mientras trabajo) tantos Modulos y formularios, pretendo colocar cada herramienta en archivo separados, para después unir todo en un solo archivo, hacer lo propio en XML y convertir el archivo en Add-in.

Pero básicamente es un formulario (no tiene nada especial), y al cambiar de hoja, me gustaría que evaluara nuevamente si hay o no objetos ocultos en la hoja activa (primer CheckBox).

Ya que cuando inicia el formulario hace la evaluación por hoja y libro (segundo CheckBox).

Es decir, la detección de cambio de hoja, detona la ejecución de la macro que actualiza los dos CheckBox

Trate de ver si el TextBox me tomaba el nombre de la hoja activa en tiempo de ejecución (al ir cambiando de hoja), probé con ActiveSheet.Name, pero como era de esperarse no funcionó.

Busque en la red, y encontré el método "Form.Refresh", pero segun entiendo solo aplica para Access, mas allá de esto no encuentro informacion relevante que me ayude a avanzar.

La otra alternativa (poco elegante y practica) era un ComboBox que cargue las hojas del libro activo, pero no tiene gran sentido y pierde un poco la gracia, pero si no consigo como hacerlo, tendrá que ser así, y tendré que colocar como modal el formulario, lo cual tampoco me hace gracia.

Creo que lo importante seria conseguir que reconozca el cambio de hoja, pero estoy muy tierno en VBA :-/.

Subo un formulario X, ya que realmente me encuentro tratando de hacer que haga lo que quiero y no he hecho mas nada.

Si alguien tiene alguna idea de como lograrlo se lo agradecería mucho.

Saludos. 

 

Prueba1.xlsm

publicado
Hace 25 minutos , MauriciodeAbreu dijo:

La otra alternativa (poco elegante y practica) era un ComboBox que cargue las hojas del libro activo, pero no tiene gran sentido y pierde un poco la gracia, pero si no consigo como hacerlo, tendrá que ser así, y tendré que colocar como modal el formulario, lo cual tampoco me hace gracia.

Creo que lo importante seria conseguir que reconozca el cambio de hoja, pero estoy muy tierno en VBA

si quieres que sea el usuario quien dispare eventos al cambiar la hoja en cualquier libro, prueba desde módulos "de clase" con eventos a nivel de la aplicación

lee, relee y vuelve a leer estos procedimientos:

Events And Event Procedures In VBA

publicado
Hace 17 minutos , Héctor Miguel dijo:

si quieres que sea el usuario quien dispare eventos al cambiar la hoja en cualquier libro, prueba desde módulos "de clase" con eventos a nivel de la aplicación

lee, relee y vuelve a leer estos procedimientos:

Events And Event Procedures In VBA

Buenas Héctor, muchas gracias, leeré, y releeré y si me quedan dudas lo leeré de nuevo, y cualquier duda pregunto ?

publicado

Hola Héctor, he estado leyendo la traducción del enlace que me has dado. Y para ser franco, de entrada me pareció complejo.

Después de una rato de lectura, realice una búsqueda sobre el tema en español. como para tener mas clara la cosa, porque estaba medio enredado.

Y me tope con esta pagina, que sin mucha vuelta pone un ejemplo, el cual "aclaro"..., de alguna manera mi duda.

OJO con el ejemplo, que yo de entrada no me di cuenta de que hay un error en el código.

En donde ponen el código del modulo (estándar), colocaron Cass1 y es Clase1, un pequeño pero crucial detalle.

En fin, después de hacer unas pruebas con el ejemplo en cuestión (que por cierto, es interesante), realice los cambios necesarios para lograr el objetivo.

En el Modulo estándar se debe colocar:

Option Explicit

Dim ObjectHoja As New Clase1

      Sub RefrescarFormulario()
          Set ObjectHoja.RefreshForm = Application
      End Sub

En el modulo de clase se coloca:

Option Explicit
       Public WithEvents RefreshForm As Application

Private Sub RefreshForm_SheetActivate(ByVal Sh As Object)
    UserForm1.TextBox1 = ActiveSheet.Name
End Sub

Y en UserForm_Initialize, se coloca el nombre de la macro (modulo estándar), en este caso la macro que se llama "RefrescarFormulario" o Call RefrescarFormulario

Y eso es todo.

Aclaración: Si cambian el nombre de modulo de clase, recuerden hacer lo mismo en el modulo estándar.

Muchísimas gracias Héctor, no tienes idea como lo agradezco, podemos marcar el tema como  solucionado,

Saludos...

publicado
Hace 4 horas, MauriciodeAbreu dijo:

OJO con el ejemplo, que yo de entrada no me di cuenta de que hay un error en el código

el "error" que mencionas asoma por las traducciones "automáticas", si lees el artículo en inglés no existe tal discrepancia, por eso mismo prefiero leer los artículos "originales"

al fin de cuentas, todos los que he visto en español (en algún momento) han "tocado base" en el origen de los mismos (en inglés) ?

publicado
Hace 12 horas, Héctor Miguel dijo:

el "error" que mencionas asoma por las traducciones "automáticas", si lees el artículo en inglés no existe tal discrepancia, por eso mismo prefiero leer los artículos "originales"

Buenas Héctor, Tienes razón, no había tomado en cuenta la traducción automática... ?

Y en efecto es mejor apoyarse en el documento en ingles  ?, o digamos no traducido.

Nuevamente gracias.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.