14.01.2010, 15:40 | #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 Возможно это кому-то пригодится. |
|
09.02.2010, 10:12 | #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) |
|