Att hitta andra instanser av Excel i ett makro

April 4

Om du kör ett VBA-program inifrån en viss instans av Excel kan du skapa andra instanser av Excel, öppna och ändra arbetsböcker i de nyskapade instanser, och sedan stänga dessa instanser. Dock kanske du undrar hur du kan avgöra, inom ett makro, om andra instanser av Excel är redan igång, och i så fall ta kontroll över dessa instanser.

Det finns några sätt du kan gå om att göra detta. Om du bara vill veta hur många instanser av Excel körs, kan du använda ett makro som använder Windows API. Följande funktion implementerar detta tillvägagångssätt:

Offentlig Declare Function GetDesktopWindow Lib "User32" () As Long
Offentlig Förkunnen Funktion FindWindowEx Lib "User32" Alias ​​_
"FindWindowExA" (ByVal hWnd1 As Long, ByVal
hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

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

"Få ett handtag till skrivbordet
hWndDesk = GetDesktopWindow

Göra
"Få nästa Excel-fönstret
hWndXL = FindWindowEx (GetDesktopWindow, hWndXL, _
"XLMAIN", vbNullString)

"Om vi ​​fick en, öka räkningen
Om hWndXL> 0 Then
ExcelInstances = ExcelInstances + 1
End If

"Loop tills vi har hittat dem alla
Loop Tills hWndXL = 0
End Function

Denna kod har utvecklats av Excel MVP Stephen Bullen. Det uppenbarligen inte kommer att ge dig tillgång till de enskilda fall av Excel; det bara returnerar en räkning av antalet instanser öppna. Om du vill utveckla kod för att använda instanser, då du inte behöver förlita sig på Windows API. Du kan istället använda kod som följande för att avgöra om en instans av Excel är öppet:

Dim xlApp Såsom Excel.Application
Ställ xlApp = GetObject ("Excel.Application")

Om en instans är igång kan du komma åt den med xlApp objektet. Om en instans inte körs får du en körningsfel. Den GetObject funktionen blir den första instansen av Excel som hade lastats. För att komma till andra, kan du stänga det ena och sedan försöka GetObject igen för att få nästa, etc.

Om du vill ställa in xlApp till en viss instans av Excel, kan du göra det om du känner till namnet på en öppen arbetsbok i det fallet:

Dim xlApp Såsom Excel.Application
Ställ xlApp = GetObject ("ExampleBook"). Ansökan

ExcelTips är din källa för kostnadseffektiv Microsoft Excel utbildning. Detta tips (9451) gäller för Microsoft Excel 97, 2000, 2002, och 2003. Du kan hitta en version av detta tips för menyfliksområdet i Excel (Excel 2007 och senare) här: Hitta andra instanser av Excel i ett makro.