Помогите с Excel.

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
stvden
Сообщения: 5
Зарегистрирован: 09 фев 2005, 22:13

Задача состоит в следующем надо получить список
открытых документов (с полным путем до документа),
с которыми работает Excel.
Когда запущено одно приложение Excel, я получаю
этот список следующим образом:
Set EXL = GetObject(, "Excel.Application")
For i = 1 To EXL.Application.Workbooks.Count
MsgBox EXL.Application.Workbooks(i).FullName
Next
но когда я запускаю второе приложение Excel, таким способом
можно лишь получить список документов от того приложения,
которое было запущено первым. А как быть со вторым приложением?
Пожалуйста, помогите.
Аватара пользователя
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-серверов.
Аватара пользователя
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, но только она выходит после первого успеха, а нам надо будет просканировать все до конца.
Ответить