2016-02-09 7 views
0

Я использую следующий код в MS Access 2010 для печати HTML-файла (локального).Подождите, пока ExecWB закончит

Он будет работать только в том случае, если я удалю комментарий по строке msgbox («wait»). Откроется диалоговое окно печати, и я смогу распечатать документ. Если я не использую msgbox, скрипт выполняется так быстро, что функция заканчивается (с результатом True как результат), прежде чем ExecWB изменит начало диалога печати. Также без диалогового окна печати документ не отправляется на принтер.

Есть ли способ проверить, был ли ExecWB полностью выполнен. Я попытался проверить значение objIE.busy в цикле, но это тоже не работает.

Public Function PrintHTML(filePath As String, Optional visibleBrowser As Boolean = False) As Boolean 
'------------------------------------------------------------------------------- 
' Procedure : PrintHTML 
' DateTime : 12/31/2007 12:53 PM 12:53 
' Author : Aaron Bush 
' Purpose : To print a html file. 
' Input(s) : filePath - The path to the file you wish to print. 
' Output(s) : True - No error encountered. 
'    False - Error found. 
' Remarks : Free for public use. 
'    Requires reference to Microsoft Internet Controls. to set a 
'    reference, go to Tool, References, and select 
'    "Microsoft Internet Controls". If library is not present then 
'    click "browse" and browse to C:\Windows\System32\shdocvw.dll. 
'------------------------------------------------------------------------------- 
Dim objIE As SHDocVw.InternetExplorer 
On Error GoTo Err_Hnd 
'Instantiate a instance of Internet Explorer: 
Set objIE = New SHDocVw.InternetExplorer 
'Set visibility: 
objIE.Visible = visibleBrowser 
'Load specified file: 
objIE.Navigate filePath 
'Wait for file to load: 
Do Until objIE.ReadyState = READYSTATE_COMPLETE 
Loop 
'Print: 

objIE.ExecWB 6, 1, 0, 0 

'MsgBox ("wait") 
'Flag as error free: 
PrintHTML = True 
Exit_Proc: 
On Error Resume Next 
'Close browser: 
objIE.Quit 
Exit Function 
Err_Hnd: 
VBA.MsgBox "Error " & VBA.Err.Number & " in procedure PrintHTML of Module" & m_strModuleName_c & vbNewLine & VBA.Err.Description, vbMsgBoxSetForeground Or vbSystemModal, "Error - " & m_strModuleName_c & ".PrintHTML" 
Resume Exit_Proc 
End Function 

ответ

1

Попробуйте DoEvents

objIE.ExecWB 6, 1, 0, 0 
While objIE.Busy 
    DoEvents 
Wend 

Это проходит контроль выполнения обратно в процессор и позволяет любые возможные системные задачи иметь место (например, очереди печати) перед возобновлением выполнения кода.

+0

Кто-нибудь нашел эквивалентное выражение для PowerShell, которое работает? 'Пока ($ ie.Busy) {Start-Sleep 1}', похоже, не помогает. – tresf

+0

@QZПоддержка, которое должно работать, но, возможно, проверить свойство '.ReadyState' вместо' .Busy'. –

+0

Не повезло с этим ... 'While (ie.Busy -or $ ie.ReadyState -ne 4) {Start-Sleep 1}'. Отладка COM-объекта не появляется. ExecWB правильно помещает либо свойство (Windows 10, IE11 \) – tresf

Смежные вопросы