2017-04-15 29 views
-1

我有一個UFT的Web自動化框架,我必須更新自定義的Excel報告。在編輯部分代碼的報告中,我遇到了一個與excel process/vba對象有關的奇怪問題。我將這段代碼存儲在一個函數內部的函數庫(.qfl)中,並且它被多次調用。問題是,有時UFT執行凍結,我看到一個正在運行的EXCEL.exe進程。在手動終止進程之前,屏幕上幾小時內沒有任何事情發生。UFT:Excel過程保持運行並凍結執行

On error resume next 
Dim objExcel, objWorkbook, objWorkSheet 
Set objExcel = createobject("excel.application") 
objExcel.DisplayAlerts = False 
Set objWorkbook = objExcel.Workbooks.Open("SheetLocation") 
Set objWorkSheet = objWorkbook.WorkSheets("SheetName") 
intStepRow = objWorkSheet.Cells.Find("WC_01").Row 
objWorkSheet.Cells(intStepRow, 7).Value = "SomeValue" 
objWorkSheet.Cells(intStepRow, 8).Value = "SomeValue" 
objExcel.ActiveWorkbook.Save 
objExcel.ActiveWorkbook.Close True 
objExcel.Quit()  
Set objWorkSheet = Nothing 
Set objWorkbook = Nothing 
Set objExcel = Nothing  
On error goto 0 

我試着把一個代碼放在函數的末尾來殺死進程,但沒有運氣。我也嘗試將excel.Visible.Display設置爲true以查看確切地出現錯誤的地方,但我什麼也沒看到。我也嘗試刪除錯誤處理,但同樣,沒有運氣。

編輯:

啓用日誌記錄的每一行之後,我發現以下行凍結執行提前

Set objWorkbook = objExcel.Workbooks.Open("SheetLocation") 

感謝您的時間和建議:)

+0

您可能必須在'Find'一步發生的錯誤的情況。如果您正在搜索的值不存在,那麼接下來的兩個步驟將暫停代碼。你有沒有嘗試單步執行代碼?並且肯定會刪除「On Error Resume Next」,因爲它只是爲了隱藏您遇到的任何錯誤。 – Dave

+0

是的,我嘗試刪除錯誤恢復下一步,但沒有運氣。 'Find'方法將始終獲得表單中存在的值。代碼暫停是隨機的。它可以發生任何價值。 – yudi2312

+1

插入日誌記錄步驟,跟蹤每行代碼並記錄它是否成功。這樣,當下一次停下來時,你會得到具體細節。這將告訴你哪一步出了問題,你將能夠專注於實際問題。目前你不知道你需要解決什麼問題。 – Dave

回答

-1

或者我找到有趣的是,你可以嘗試使用objExcel.quit()後,你設置wroksheet,工作簿,excel =什麼都沒有。 例如

Set objWorkSheet = Nothing Set objWorkbook = Nothing Set objExcel = Nothing objExcel.Quit()

+0

,'objExcel.Quit()'不會引起任何問題。 objExcel.Workbooks.Open有問題。但我也會嘗試一下你的方法。 – yudi2312

+0

是的。 Workbook.Open將創建該問題,因爲您可能創建多個Excel實例,但無法訪問相同的工作簿。所以如果你之前的這個工作流程沒有終止,那麼當你再次訪問它時肯定會產生一個問題。 這就是我認爲,如果你處理Excel的終止,它可能會解決問題的原因。 – Pranav

+0

我想在'objExcel.Quit()'之後殺死excel進程會有幫助。但沒關係,我會試試這種方式。 – yudi2312