Come trovare altre istanze di Excel in una macro

Se esegui un programma VBA da una particolare istanza di Excel, puoi creare altre istanze di Excel, aprire e modificare cartelle di lavoro nelle istanze appena create e quindi chiudere tali istanze. Tuttavia, potresti chiederti come determinare, all’interno di una macro, se altre istanze di Excel sono già in esecuzione e, in tal caso, assumerne il controllo.

Ci sono alcuni modi in cui puoi farlo. Se vuoi semplicemente sapere quante istanze di Excel sono in esecuzione, puoi utilizzare una macro che utilizza le API di Windows. La seguente funzione implementa questo approccio:

 

#If VBA7 Then
Public Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long
Public Declare PtrSafe Function FindWindowEx Lib "user32" Alias _
    "FindWindowExA" (ByVal hWnd1 As Long, ByVal _
    hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
#Else
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function FindWindowEx Lib "user32" Alias _
    "FindWindowExA" (ByVal hWnd1 As Long, ByVal _
    hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
#End If
    

Function ExcelInstances() As Long
    Dim hWndDesk As Long
    Dim hWndXL As Long

    'Ottiene un handle per il desktop
    hWndDesk = GetDesktopWindow

    Do
        'Ottiene la successiva finestra di Excel
        hWndXL = FindWindowEx(GetDesktopWindow, hWndXL, _
          "XLMAIN", vbNullString)

        'Se ne trova una, incrementa il conteggio
        If hWndXL > 0 Then
            ExcelInstances = ExcelInstances + 1
        End If

        'Ripeti finché non li avrà trovati tutti
    Loop Until hWndXL = 0
End Function

 

Questo, ovviamente, non ti consentirà di accedere alle singole istanze di Excel; restituisce solo un conteggio del numero di istanze aperte. Se desideri sviluppare codice per utilizzare le istanze, non è necessario fare affidamento sulle API di Windows. È invece possibile utilizzare codice come il seguente per determinare se un’istanza di Excel è aperta:

 

Dim xlApp As Excel.Application
Set xlApp = GetObject(, "Excel.Application")

 

 

Se un’istanza è in esecuzione, puoi accedervi utilizzando l’oggetto xlApp. Se un’istanza non è in esecuzione, verrà visualizzato un errore di runtime. La funzione GetObject ottiene la prima istanza di Excel caricata. Per arrivare alle altre, puoi chiuderla e provare di nuovo GetObject per ottenere quella successiva, ecc.

Se desideri impostare xlApp su una particolare istanza di Excel, puoi farlo se conosci il nome di una cartella di lavoro aperta in quell’istanza:

 

Dim xlApp As Excel.Application
Set xlApp = GetObject("CartellaEsempio.xlsx").Application

 

 

 

Tags: , , , , , ,

Ti è stato utile?