Непонятное поведение Excel+GetObject
От: Fktrc  
Дата: 24.01.05 13:33
Оценка: -1
Окружение: Windows 2000sp4, WSH 5.6, Excel 2003.
Ситуация: Имеется следующий JS-скрипт:
var Excel; 
var WSH = new ActiveXObject("WScript.Shell"); 

while(!Excel){ 
   try { 
      // пытаемся подключиться к запущенному экземпляру Excel 
      Excel = GetObject("", "Excel.Application"); 
   } catch(a) { 
      WScript.Sleep(1000); 
   } 
} 
WScript.Echo("Excel closing..."); 
Excel.Application.Quit();
Вроде все правильно — в бесконечном цикле ожидаем запуска Excel. Если к нему удалось подключиться, выходим из цикла, выдаем сообщение "Excel closing..." и после его закрытия закрываем Excel. Результаты же запуска скрипта озадачивают не на шутку!

Первый вариант запуска: Сначала запускаем Excel. Затем запускаем скрипт. Он отрабатывает, как и должен — подключается к Excel, выдает сообщение и закрывает Excel.

Второй вариант, ради которого, собсно, и затевался сыр-бор: сначала запускаем скрипт. Он, как и положено, крутится в цикле, периодически пробуя подключиться к Excel. Запускаем Excel. Ждем... (Excel запущен и активен!) еще ждем... и еще ждем... . Нифига. Но стоит переключиться из окна Excel на любое другое окно (да хоть мышкой по панели задач щелкнуть), как тут же выскакиваем окошко "Excel closing...".
То есть такое впечатление, как будто сразу после запуска Excel его OLE сервер неактивен или не создан. Но как только окно Excel теряет фокус, то OLE сервер тут же создается, либо активизируется, позволяя подключиться к себе...

На похожую проблему кроме меня наткнулся еще один человек — привожу его скрипт:
Dim Excel 
set WshShell = WScript.CreateObject("WScript.Shell") 
KL = True 
do while KL 
  if WshShell.AppActivate("Microsoft Excel") then 
    WScript.Echo ("Ёксель запущен") 
    set Excel = GetObject(, "Excel.Application") 
    WScript.Echo(Excel.ActiveWorkBook.Name) 
    Excel.Application.Quit() 
    KL = false 
  end if 
  WScript.Sleep 1000 
loop
Запускаем скрипт, затем запускаем Excel. Все работает, но стоит закомментировать строчку "WScript.Echo ("Ёксель запущен")" и повторить эксперимент, как скрипт после запуска Excel свалится на функции GetObject, мотивируя, что

Невозможно создание объекта контейнером ActiveX: GetObject' 
Код:   800A01AD 
Источник:    Ошибка выполнения Microsoft VBScript


То есть тут скорее всего та же ботва, что и у меня — сразу после запуска Excel толком непригоден к использованию. Надо после его запуска переключиться с него на другое приложение — тогда заработает.

Казалось бы, бред полный. Но факты — упрямая вещь. Кто поопытнее меня, разъясните, в чем замес. А то я уже просто не знаю что и думать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.