Продолжу рассуждения на эту тему.
Один процесс EXCEL.EXE может деражть открытими несколько файлов
Код:
create(App);
App.Visible := true;
App.Workbooks.add;
App.Workbooks.add;
App.Workbooks.add;
sleep(3000);
App.Visible := false;
App.Visible := true
При выполнении этого скрипта, можно заметить, что порядок созданных книг поменялся.
Как с этим бороться я не смог найти.
По этому выход использовать create(App,TRUE); и засорять память процессами EXCEL.EXE
При этом может возникнуть ситуация когда пытаемся открыть файл, который занят невидимым процессом.
От сюда вывод, невидимые EXCEL.EXE - ЗЛО
Кстати:
Приведу листинг функции, которая опеределяет, можно ли работать с инстансом Экселя.
Т.е. не находится ли пользователь в редактировании ячейки.
Код:
WshShellG - Automation: 'Windows Script Host Object Model'.WshShell
ExcelAvailable() : Boolean
// Если Эксель недоступен, то выполнение скрипта "вылетает" по таймауту в 10 секунд
FileName := ENVIRON('AppData')+'\CheckExcel.vbs';
IF NOT EXISTS(FileName) THEN BEGIN
F.WRITEMODE(TRUE);
F.TEXTMODE(TRUE);
F.CREATE(FileName);
F.WRITE('On Error Resume Next');
F.WRITE('set XL = getObject (,"Excel.Application")');
F.WRITE('if err.number = 0 then');
F.WRITE(' err.Clear');
F.WRITE(' if XL.visible then');
F.WRITE(' if err.number = 0 then');
F.WRITE(' end if');
F.WRITE(' end if');
F.WRITE('end if');
F.CLOSE;
END;
IF ISCLEAR(WshShellG) THEN
CREATE(WshShellG);
ShellCmdG := 'Wscript.exe /B "'+FileName+'"';
i := 1;
bWait := TRUE;
t := TIME;
WshShellG.Run(ShellCmdG,i,bWait);
EXIT ((TIME-t) < 1000)