Please Note: This article is written for users of the following Microsoft Excel versions: 97, 2000, 2002, and 2003. If you are using a later version (Excel 2007 or later), this tip may not work for you. For a version of this tip written specifically for later versions of Excel, click here: Finding Other Instances of Excel in a Macro.
by Allen Wyatt
(last updated November 29, 2019)
If you run a VBA program from within a particular instance of Excel, you can create other instances of Excel, open and modify workbooks in the newly created instances, and then close those instances. However, you may wonder how you can determine, within a macro, if other instances of Excel are already running, and, if so, take control of those instances.
There are a few ways you can go about doing this. If you simply want to know how many instances of Excel are running, you can use a macro that makes use of the Windows API. The following function implements this approach:
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
This code was developed by Excel MVP Stephen Bullen. It obviously won't allow you access to the individual instances of Excel; it only returns a count of the number of instances open. If you want to develop code to use the instances, then you don't need to rely upon the Windows API. You can, instead, use code such as the following to determine if an instance of Excel is open:
Dim xlApp As Excel.Application Set xlApp = GetObject(, "Excel.Application")
If an instance is running you can access it using the xlApp object. If an instance is not running you will get a run-time error. The GetObject function gets the first instance of Excel that had been loaded. To get to others, you can close that one and then try GetObject again to get the next one, etc.
If you want to set the xlApp to a particular instance of Excel, you can do so if you know the name of an open workbook in that instance:
Dim xlApp As Excel.Application Set xlApp = GetObject("ExampleBook").Application
ExcelTips is your source for cost-effective Microsoft Excel training. This tip (9451) applies to Microsoft Excel 97, 2000, 2002, and 2003. You can find a version of this tip for the ribbon interface of Excel (Excel 2007 and later) here: Finding Other Instances of Excel in a Macro.
Comprehensive VBA Guide Visual Basic for Applications (VBA) is the language used for writing macros in all Office programs. This complete guide shows both professionals and novices how to master VBA in order to customize the entire Office suite for their needs. Check out Mastering VBA for Office 2010 today!
Do you want to display a particular range of columns within the Excel window? Here's a couple ways you can accomplish the ...Discover More
Want to create your own add-in? Excel makes it easy to do. Here are all the steps you need.Discover More
Do you want a way to reverse names within a cell, making them "last, first" instead of "first last?" Here's a handy macro ...Discover More
FREE SERVICE: Get tips like this every week in ExcelTips, a free productivity newsletter. Enter your address and click "Subscribe."
Got a version of Excel that uses the menu interface (Excel 97, Excel 2000, Excel 2002, or Excel 2003)? This site is for you! If you use a later version of Excel, visit our ExcelTips site focusing on the ribbon interface.