Suchen anderer Excel-Instanzen in einem Makro (Microsoft Excel)
Wenn Sie ein VBA-Programm in einer bestimmten Excel-Instanz ausführen, können Sie andere Excel-Instanzen erstellen, Arbeitsmappen in den neu erstellten Instanzen öffnen und ändern und diese Instanzen dann schließen. Möglicherweise fragen Sie sich jedoch, wie Sie innerhalb eines Makros feststellen können, ob bereits andere Excel-Instanzen ausgeführt werden, und in diesem Fall die Kontrolle über diese Instanzen übernehmen können.
Es gibt einige Möglichkeiten, wie Sie dies tun können. Wenn Sie nur wissen möchten, wie viele Instanzen von Excel ausgeführt werden, können Sie ein Makro verwenden, das die Windows-API verwendet. Die folgende Funktion implementiert diesen Ansatz:
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
Dieser Code wurde von Excel MVP Stephen Bullen entwickelt. Sie können offensichtlich nicht auf die einzelnen Instanzen von Excel zugreifen. Es wird nur die Anzahl der geöffneten Instanzen zurückgegeben. Wenn Sie Code für die Verwendung der Instanzen entwickeln möchten, müssen Sie sich nicht auf die Windows-API verlassen. Sie können stattdessen Code wie den folgenden verwenden, um festzustellen, ob eine Instanz von Excel geöffnet ist:
Dim xlApp As Excel.Application Set xlApp = GetObject(, "Excel.Application")
Wenn eine Instanz ausgeführt wird, können Sie mit dem xlApp-Objekt darauf zugreifen. Wenn eine Instanz nicht ausgeführt wird, wird ein Laufzeitfehler angezeigt. Die GetObject-Funktion ruft die erste Instanz von Excel ab, die geladen wurde. Um zu anderen zu gelangen, können Sie dieses schließen und dann GetObject erneut versuchen, um das nächste usw. zu erhalten.
Wenn Sie die xlApp auf eine bestimmte Instanz von Excel festlegen möchten, können Sie dies tun, wenn Sie den Namen einer geöffneten Arbeitsmappe in dieser Instanz kennen:
Dim xlApp As Excel.Application Set xlApp = GetObject("ExampleBook").Application
_Hinweis: _
Wenn Sie wissen möchten, wie die auf dieser Seite (oder auf einer anderen Seite der ExcelTips-Websites) beschriebenen Makros verwendet werden, habe ich eine spezielle Seite vorbereitet, die hilfreiche Informationen enthält.
ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.
Dieser Tipp (9451) gilt für Microsoft Excel 97, 2000, 2002 und 2003. Eine Version dieses Tipps für die Multifunktionsleistenschnittstelle von Excel (Excel 2007 und höher) finden Sie hier: