es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo se instancia una variable de complemento de Excel VBA

En la ventana de referencias, puedes buscar y establecer una referencia a un complemento personalizado. Para efectos de discusión, digamos que se llama MyAddIn.xlam. He cambiado el nombre del proyecto a MyAddIn y se encuentra en la ruta estándar de complementos. Entonces, he logrado hacer eso y luego he definido una variable global asociada de la siguiente manera en un libro de Excel diferente:

Private m_MyAddIn As MyAddIn.thisworkbook

¿Cómo y cuándo instancio la variable que he definido? Sería simple si pudiera convertir el elemento de la colección Application.AddIns asociado a mi complemento específico, pero esa no es una opción.

Dentro del código de MyAddIn, he intentado definir una propiedad pública llamada ParentWorkbook que simplemente devuelve ThisWorkbook. También he intentado hacer lo mismo en una clase pública definida en MyAddIn. Pero no logro entender cómo instanciar la variable.

Esto es lo que estoy intentando hacer:
1. MyAddIn genera un evento personalizado llamado MyEvent cada vez que se abre un libro o se crea una nueva hoja.
2. Uno o más xlsb personalizados, MyCustom1.xlsb y MyCustom2.xlsb, manejarán el evento.
3. Debido a que los xlsb están buscando un evento, necesito poder definir una variable WithEvents MyAddIn en los xlsb para poder manejarlos.
4. Por ejemplo, un xlsb de tabla dinámica podría realizar algunas acciones personalizadas basadas en eventos de tabla dinámica. Todos estos podrían configurarse en el xlsb una vez que recibiera notificaciones de que se abrió un nuevo archivo. Podría verificar si una tabla dinámica está presente y omitir todas las demás, etc.

¿Por qué estoy intentando hacerlo de esta manera?
1. Estoy tratando de evitar mucho ruido. Si cada xlsb usa el objeto de la aplicación para verificar los archivos abiertos, etc., todos se ejecutarán cada vez que se abra un archivo en Excel.
2. Mi idea es que solo MyAddIn verifique ese evento y luego genere los eventos personalizados según corresponda para los xlsb.

Espero que esto ayude.

Gracias por cualquier idea y/o sugerencia.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para instanciar la variable, puedes utilizar la declaración Set para asignar la variable al objeto ThisWorkbook del complemento AddIn. Puedes hacer esto en el evento Workbook_Open del libro donde se define la variable, o en un módulo separado que inicializa la variable.

    Por ejemplo:

    Private Sub Workbook_Open()
        Set m_MyAddIn = Application.AddIns("MyAddIn").Object.ThisWorkbook
    End Sub
    

    Alternativamente, puedes definir una función pública en el complemento AddIn que devuelva el objeto ThisWorkbook, y llamar a esa función desde el libro donde se define la variable. Por ejemplo:

    En MyAddIn:

    Public Function GetThisWorkbook() As Workbook
        Set GetThisWorkbook = ThisWorkbook
    End Function
    

    En el libro donde se define la variable:

    Private Sub Workbook_Open()
        Set m_MyAddIn = Application.Run("MyAddIn.xlam!GetThisWorkbook")
    End Sub
    

    Una vez que hayas instanciado la variable, puedes usarla para manejar los eventos personalizados lanzados por MyAddIn. Para declarar la variable WithEvents en tus xlsbs personalizados, puedes agregar el siguiente código a un módulo:

    Private WithEvents m_MyAddIn As MyAddIn.ThisWorkbook
    
    Private Sub Workbook_Open()
        Set m_MyAddIn = Workbooks("MyAddIn").ThisWorkbook
    End Sub
    
    Private Sub m_MyAddIn_MyEvent()
        'Manejar el evento aquí
    End Sub
    

    Este código declara una variable WithEvents para el objeto MyAddIn, lo inicializa en el evento Workbook_Open y maneja el evento personalizado MyEvent en el controlador de eventos m_MyAddIn_MyEvent.

    Utilizando este enfoque, puedes evitar la verificación repetitiva de los libros abiertos y tener un mayor control sobre el manejo de eventos en tus xlsbs personalizados.

Comments are closed.