none
Instancia Global en VB.NET RRS feed

  • Pregunta

  • Buenas tardes, soy algo nuevo en el mundo de VB.NET y quisiera saber como mantener una instancia que se carga al iniciar el formulario mientras dure el todo el programa abierto. Mi programa manipula hojas de excel, y para acelerarlo, al momento de abrir el programa lo primero que hace es realizar los llamados respectivos a Excel y su libro en especifico:

    Imports Microsoft.Office.Interop

        Dim oExcel As Excel.Application
        Dim oBook As Excel.Workbook
        Dim oBooks As Excel.Workbooks

            'Inicia Excel y el libro de trabajo
            oExcel = CreateObject("Excel.Application")
            oExcel.Visible = False
            oBooks = oExcel.Workbooks
            oBook = oBooks.Open("C:\Users\Users\Desktop\Libro.xlsm")

    A continuación, dentro de otro form (contenido dentro del form padre), hay un botón, el cual al dar click, hace el llamado a la macro:

                'Llamar macro
                oExcel.Run("Macro1")

    El problema es aquí, donde me arroja el error: System.NullReferenceException: 'Referencia a objeto no establecida como instancia de un objeto.'

    oExcel = Nothing

    ¿Que podría hacer para que la instancia inicial de abrir el libro de trabajo se mantenga y no se cierre al momento de cambiar form? Ya que de lo contrario cada vez que presione un botón estaría obligado de hacer el llamado a Excel y su libro de trabajo, retrasando el proceso.

    Gracias por su tiempo y ayuda.


    • Editado Jho_Perez viernes, 22 de noviembre de 2019 3:16
    viernes, 22 de noviembre de 2019 3:15

Respuestas

  • La forma de mantener una "instancia global" es no usar una instancia, sino una clase estática que no necesita instanciarse (ni se puede instanciar). Esto se hace declarando la clase como compartida (Public Shared Class). O si quieres, puedes usar un Module, que el compilador de VB.NET trata igual que un Shared Class.

    Si declaras dentro de esa clase o module tu variable "oExcel", será visible desde todo el programa y se tratará como una única instancia. Una vez que inicialices la variable, todos los formularios la "verán" inicializada.

    También puedes declarar la variable como Shared dentro de cualquier otra clase, incluido un formulario. Esto también la hace "global y única". Para acceder a ella desde otro sitio, accedes con NombreDeLaClase.NombreDeLaVariable, sin que se requiera una instancia de la clase.

    EDITADO: ... pero no te acostumbres a usar variables estaticas. Es muy facil abusar de ellas porque son muy sencillas de usar, y a la larga los programas se vuelven dificiles de mantener, y se complican las pruebas unitarias y la inyeccion de dependencias. Asi que restringe su uso, y emplea la minima cantidad posible de estas variables y solo para casos muy concretos y muy controlados; no "salpiques" todo tu programa de variables estaticas.

    viernes, 22 de noviembre de 2019 13:38