有多个Excel实例启动,我怎么能得到所有的应用程序对象?

基本上,我想使用类似于GetObject(,"Excel.Application")来取回我创build的应用程序。

我调用了几次CreateObject("Excel.Application")来创build新的Excel实例。 后来以某种方式VBA项目得到重置,由于debugging和编码。 应用程序对象variables丢失了。 但是excel仍然在后台运行。 一种内存泄漏的情况。

我只是想重新join他们。 要么重新使用(首选这种方式)或closures它们。

列出正在运行的Excel实例:

 #If VBA7 Then Private Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" ( _ ByVal hwnd As LongPtr, ByVal dwId As Long, riid As Any, ppvObject As Object) As Long Private Declare PtrSafe Function FindWindowExA Lib "user32" ( _ ByVal hwndParent As LongPtr, ByVal hwndChildAfter As LongPtr, _ ByVal lpszClass As String, ByVal lpszWindow As String) As LongPtr #Else Private Declare Function AccessibleObjectFromWindow Lib "oleacc" ( _ ByVal hwnd As Long, ByVal dwId As Long, riid As Any, ppvObject As Object) As Long Private Declare Function FindWindowExA Lib "user32" ( _ ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, ByVal lpszWindow As String) As Long #End If Sub Test() Dim xl As Application For Each xl In GetExcelInstances() Debug.Print "Handle: " & xl.ActiveWorkbook.FullName Next End Sub Public Function GetExcelInstances() As Collection Dim guid&(0 To 3), acc As Object, hwnd, hwnd2, hwnd3 guid(0) = &H20400 guid(1) = &H0 guid(2) = &HC0 guid(3) = &H46000000 Set GetExcelInstances = New Collection Do hwnd = FindWindowExA(0, hwnd, "XLMAIN", vbNullString) If hwnd = 0 Then Exit Do hwnd2 = FindWindowExA(hwnd, 0, "XLDESK", vbNullString) hwnd3 = FindWindowExA(hwnd2, 0, "EXCEL7", vbNullString) If AccessibleObjectFromWindow(hwnd3, &HFFFFFFF0, guid(0), acc) = 0 Then GetExcelInstances.Add acc.Application End If Loop End Function 

创build一个对象数组,并将新创build的Excel.Application存储在数组中。 这样,你可以在需要的时候引用它们。 我们举一个简单的例子:

在一个模块中:

 Dim ExcelApp(2) As Object Sub Test() Set ExcelApp(1) = CreateObject("Excel.Application") ExcelApp(1).Visible = True Set ExcelApp(2) = CreateObject("Excel.Application") ExcelApp(2).Visible = True End Sub Sub AnotherTest() ExcelApp(1).Quit ExcelApp(2).Quit End Sub 

运行Test()macros,您应该看到两个Excel应用程序popup。 然后运行AnotherTest(),Excel应用程序将退出。 完成后,您甚至可以将arrays设置为“无”。

您可以使用http://www.ozgrid.com/forum/showthread.php?t=182853上发布的脚本来处理运行的Excel应用程序。 这应该让你想去的地方。

这可以完成你想要的。 确定是否打开Excel的一个实例:

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

如果一个实例正在运行,您可以使用xlApp对象来访问它。 如果一个实例没有运行,你会得到一个运行时错误(你可能需要/想要一个error handling程序)。 GetObject函数获取已加载的Excel的第一个实例。 你可以用它来完成你的工作,然后去找别人,你可以closures它,然后再次尝试GetObject来获得下一个,等等。所以你将会达到你的第二个首选目标(从http ://excelribbon.tips.net/T009452_Finding_Other_Instances_of_Excel_in_a_Macro.html )。

为了达到您的首选目标,我认为https://stackoverflow.com/a/3303016/2707864向您展示了如何。