Jump to content

Detectar cambio de hoja en formulario


Recommended Posts

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

Link to comment
Share on other sites

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)

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 👍

Link to comment
Share on other sites

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...

Link to comment
Share on other sites

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) 😉

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

  • Crear macros Excel

  • Posts

    • Buenas tardes, expertos solicito una ayuda para concatenar dos columnas una de ellas es en cuanto a la fechas, lo que pasa es que la macro que tengo concatena muy bien, solo tengo un inconveniente con las fechas dicha columna (I) estas formateadas por ejemplo asi: Feb-20 pero al concatenar el resultado asi: O-2AA6220/09/2021, pero asi no quiero, me gustaria concatenar que salga asi: A-234RV44032 los 5 ultimos digitos son de la fecha, bueno asi me gustaria que quede, la macro que estoy usando es: Sub Concatenar() uFila = Range("H" & Cells.Rows.Count).End(xlUp).Row pFila = 1 For fila = pFila + 1 To uFila     Range("O" & fila) = Range("H" & fila) & Range("I" & fila) Next fila End Sub Por favor si me podria dar una ayuda estare muy agradecido. Adjunto el archivo Consolidado.xlsm
    • Con la grabadora Pero son demasiadas filas. Sub Macro1() Range("C3:I7").Select Selection.Copy Range("C12").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.Copy Range("C21").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub Hace tiempo que no entro en el foro y no veo la opcion de subir libro. Un Saludo.
    • Desconozco si por falta de aportación de datos, no me pueden ayudar  o es que no se puede desarrollar esta macro. Gracias.
    • Antoni muchas gracias, eso lo que esperaba. Consegui también estas lineas codigo. Sub Rellenar() Dim uf, fila As Integer uf = Sheets("Consolidar").Range("A" & Rows.Count).End(xlUp).Row fila = 2 While fila <= uf If Sheets("Consolidar").Cells(fila, 2) = Empty Then    Sheets("Consolidar").Cells(fila, 2) = "DIGITAL" End If fila = fila + 1 Wend End Sub
    • Range("B2:B" & ActiveSheet.UsedRange.Rows.Count) = "DIGITAL"  
  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Privacy Policy