Поиск других экземпляров Excel в макросе (Microsoft Excel)
Если вы запускаете программу VBA из определенного экземпляра Excel, вы можете создавать другие экземпляры 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
Этот код был разработан Стивеном Булленом, MVP по Excel, и его можно найти на этом сайте:
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), я подготовил специальную страницу, содержащую полезную информацию.
link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера]
.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (9452) относится к Microsoft Excel 2007, 2010 и 2013. Вы можете найти версию этого совета для более старого интерфейса меню Excel здесь:
link: / excel-Finding_Other_Instances_of_Excel_in_a_Macro [Поиск других экземпляров Excel в макросе]
.