Задача состоит в следующем надо получить список
открытых документов (с полным путем до документа),
с которыми работает Excel.
Когда запущено одно приложение Excel, я получаю
этот список следующим образом:
Set EXL = GetObject(, "Excel.Application")
For i = 1 To EXL.Application.Workbooks.Count
MsgBox EXL.Application.Workbooks(i).FullName
Next
но когда я запускаю второе приложение Excel, таким способом
можно лишь получить список документов от того приложения,
которое было запущено первым. А как быть со вторым приложением?
Пожалуйста, помогите.
Помогите с Excel.
Модератор: Naeel Maqsudov
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
вот здесь (кстати, это статья об одной из проблем с GetObject + MSExcel)
http://support.microsoft.com/default.as ... -us;155201
нашел косвенное упоминание о том, что COM-объекты регистрируются в некой ROT (running object table). Там даже есть пример, как "заставить" Excel 7 зарегистрироваться там и стать видимым для GetObject...
Однако дальнейшие поиски в этом направлении не увенчались успехом.
Попробуйте в соседней конференции по WinAPI задать вопрос о том, как получить интерфейсы нескольких экзкмпляров запущенных COM-серверов.
http://support.microsoft.com/default.as ... -us;155201
нашел косвенное упоминание о том, что COM-объекты регистрируются в некой ROT (running object table). Там даже есть пример, как "заставить" Excel 7 зарегистрироваться там и стать видимым для GetObject...
Однако дальнейшие поиски в этом направлении не увенчались успехом.

Попробуйте в соседней конференции по WinAPI задать вопрос о том, как получить интерфейсы нескольких экзкмпляров запущенных COM-серверов.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
O! Нашел.
Я был на правильном пути!
ROT содержит список всех запущенных COM-серверов.
http://msdn.microsoft.com/library/defau ... z_8go5.asp
Сначала надо вызвать GetRunningObjectTable она вернет интерфейс IRunningObjectTable.
Далее нам нужен метод
IRunningObjectTable::EnumRunning
Единственный ее аргумент - это callback-функция. Пока не понятно как средствами VBA все это поюзать... Но это как раз то что надо.
GetObject на самом деле наверное тоже делает EnumRunning, но только она выходит после первого успеха, а нам надо будет просканировать все до конца.
Я был на правильном пути!
ROT содержит список всех запущенных COM-серверов.
http://msdn.microsoft.com/library/defau ... z_8go5.asp
Сначала надо вызвать GetRunningObjectTable она вернет интерфейс IRunningObjectTable.
Далее нам нужен метод
IRunningObjectTable::EnumRunning
Единственный ее аргумент - это callback-функция. Пока не понятно как средствами VBA все это поюзать... Но это как раз то что надо.
GetObject на самом деле наверное тоже делает EnumRunning, но только она выходит после первого успеха, а нам надо будет просканировать все до конца.