para - ¿Cómo puede un Complemento de Excel responder a eventos en cualquier hoja de trabajo?
cuales son los complementos de excel (2)
No use la palabra clave New en la declaración de dim. Le está diciendo que haga una instancia de la clase cuando sea necesaria, pero luego nunca vuelve a consultarla, por lo que nunca será necesaria. En lugar:
Public MySheetHandler As SheetChangeHandler
Sub Auto_Open
Set MySheetHandler = New SheetChangeHandler
End Sub
Esa línea en Auto_Open (que se ejecuta al inicio) creará una instancia de la clase.
Nuestros libros de trabajo son SpreadsheetML generados por el servidor , que no pueden incluir ningún código VBA. La creación de archivos nativos de Excel o archivos XML de Excel 2007 tampoco es una opción, lamentablemente.
Por lo tanto, tengo un complemento de Excel (VBA, no XLL) que cada uno de nuestros usuarios instala para agregar algunas UDF adicionales, etc., que nuestros libros de trabajo necesitan.
Esto funciona muy bien, pero ahora necesito tener una macro que deba ejecutarse cada vez que el usuario cambie el texto en cualquier celda, independientemente del libro de trabajo que esté utilizando activamente en ese momento.
Hasta ahora, he creado un nuevo módulo de Clase (SheetChangeHandler) en mi Add-In, con el siguiente código:
Option Explicit
Private WithEvents App As Application
Private Sub Class_Initialize()
Set App = Application
End Sub
Private Sub App_SheetChange(ByVal Sh As Object, ByVal Source As Range)
Debug.Print "Changed"
On Error GoTo Finish
App.EnableEvents = False
DoWorkOnChangedStuff Sh, Source
Finish:
App.EnableEvents = True
End Sub
En mi Add-In, he agregado una línea para crear una instancia de la nueva clase:
Public MySheetHandler As New SheetChangeHandler
Según tengo entendido, esto debería hacer que Excel envíe los eventos del Complemento de cambio de hoja para todos los libros abiertos, sin que esos libros de trabajo necesiten contener ningún código de macro.
Pero no está funcionando ... no hay líneas de depuración, y mi código DoWorkOnChangedStuff no se está llamando cuando cambio una celda en cualquier hoja de trabajo.
¿Algunas ideas?
Obtuve información de: http://www.bettersolutions.com/vba/events/creating-application-level.htm y probé la solución de Dick Kusleika pero no conseguí que el módulo de clase funcionara. Después de 2 días de búsqueda en la web y antes de rendirme, probé esto y trabajé para mi. Teniendo en cuenta: "los libros de trabajo son SpreadsheetML generados por el servidor, que no pueden incluir ningún código VBA", también mis requisitos.
Escribí esto en mi módulo de clase llamado "ApplicationEventClass":
Option Explicit
Public WithEvents ExcelAppEvents As Application
Private Sub Class_Initialize()
Set ApplicationClass.ExcelAppEvents = Application
End Sub
Private Sub ExcelAppEvents_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Target.Font.ColorIndex = 5
End Sub
Y esto en mi módulo llamado "Module1":
Option Explicit
Public ApplicationClass As New ApplicationEventClass
Sub ConnectEventHandler()
On Error Resume Next
Set ApplicationClass.ExcelAppEvents = Application
End Sub
¡Eso es! Espero que esto funcione para ti también. Obviamente, solo cambie el color del texto a azul en cualquier hoja de trabajo.