|
|
#1 |
|
Участник
|
Если пользователь находясь в редактировании ячейки переключится в Navision и запустит выгрузку в Excel через Automation, то вероятнее всего возникнет ошибка.
Это можно обойти, используя CREATE(ExcelAppG, TRUE); вместо CREATE(objExcelAppG); Но тогда будут плодиться процессы EXCEL.EXE Создать Cudeunit скодом InitExcel[attachment=1122:InitExcel.txt] Код: OnRun() CREATE(ExcelAppG); IF ExcelAppG.Visible THEN; CreateApp(VAR ExcelAppP : Automation "'Microsoft Excel 12.0 Object Library'.Application") IF cuInitExcel.RUN THEN cuInitExcel.GetApp(ExcelAppP) ELSE CREATE(ExcelAppP,TRUE); GetApp(VAR ExcelAppP : Automation "'Microsoft Excel 12.0 Object Library'.Application") ExcelAppP := ExcelAppG; сипользовать cuInitExcel.CreateApp(objXL_L); Часто, в момент выгрузки, делаем ExcelAppG.Visible(FALSE). И при возникновении ошибки, Excel остается скрытым со всеми файлами. Чтоб его отобразить делаем ярлык на скрипт show excel.vbs с кодом. Код: On Error Resume Next set XL = getObject (,"Excel.Application") if err.number = 0 then XL.visible = true XL.ScreenUpdating = true end if Возможно это кому-то пригодится. |
|
|
|
|
#2 |
|
Участник
|
Продолжу рассуждения на эту тему.
Один процесс 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) |
|
|