如果您从Excel的特定实例中运行VBA程序,则可以创建Excel的其他实例,在新创建的实例中打开和修改工作簿,然后关闭这些实例。但是,您可能想知道如何在宏中确定Excel的其他实例是否已在运行,如果可以,则控制这些实例。

有几种方法可以执行此操作。如果仅想知道正在运行多少个Excel实例,则可以使用利用Windows API的宏。以下函数实现了此方法:

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

该代码由Excel MVP Stephen Bullen开发,可以在以下站点找到:

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

显然,这将不允许您访问Excel的各个实例。它仅返回打开的实例数的计数。如果要开发使用实例的代码,则无需依赖Windows API。您可以改为使用以下代码来确定Excel实例是否处于打开状态:

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

如果实例正在运行,则可以使用xlApp对象访问它。如果实例未在运行,您将收到运行时错误。 GetObject函数获取已加载的Excel的第一个实例。要获得其他人的帮助,您可以关闭该对象,然后再次尝试GetObject以获取下一个对象,依此类推。

如果要将xlApp设置为特定的Excel实例,则可以在该实例中知道打开的工作簿的名称的情况下进行设置:

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

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(9452)适用于Microsoft Excel 2007、2010和2013。您可以在以下版本的Excel旧菜单界面中找到本技巧的版本:

链接:/ excel-Finding_Other_Instances_of_Excel_in_a_Macro [在宏中查找Excel的其他实例]。