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

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 l’API di Windows. La seguente funzione implementa questo approccio:

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

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

'Get a handle to the desktop     hWndDesk = GetDesktopWindow

Do         'Get the next Excel window         hWndXL = FindWindowEx(GetDesktopWindow, hWndXL, _           "XLMAIN", vbNullString)



'If we got one, increment the count         If hWndXL > 0 Then             ExcelInstances = ExcelInstances + 1         End If

'Loop until we've found them all     Loop Until hWndXL = 0 End Function

Questo codice è stato sviluppato dall’MVP di Excel Stephen Bullen e può essere trovato su questo sito:

http://www.officekb.com/Uwe/Forum.aspx/excel-prog/55941

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 sull’API di Windows. Puoi, invece, 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 che era stata caricata. Per arrivare agli altri, puoi chiudere quello e poi provare di nuovo GetObject per ottenere quello successivo, ecc.

Se vuoi 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("ExampleBook.xlsx").Application

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

link: / excelribbon-ExcelTipsMacros [Fare clic qui per aprire quella pagina speciale in una nuova scheda del browser].

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (9452) si applica a Microsoft Excel 2007, 2010 e 2013. Puoi trovare una versione di questo suggerimento per l’interfaccia del menu precedente di Excel qui:

link: / excel-Finding_Other_Instances_of_Excel_in_a_Macro [Trovare altre istanze di Excel in una macro].