當自動化與Excel等MS-Office應用程序,我經常得到確定,只提示說Microsoft Excel is waiting for another application to complete an OLE action.
如何應對「的Microsoft Excel正在等待另一個應用程序以完成OLE操作」
這隻自動化時發生冗長的任務。
如何以適當的方式處理此問題?最近
兩個例子(我偵察的代碼是不那麼重要):
創建從Excel的ACCDB-數據庫與
Access.Application
,並通過運行大量數據的相當複雜的SQL查詢填充它。Public Function createDB(pathDB As String, pathSQL As String) As String Dim dbs As DAO.Database Dim sql As String Dim statement As Variant, file As Variant Dim sErr As String, iErr As Integer With New Access.Application With .DBEngine.CreateDatabase(pathDB, dbLangGeneral) For Each file In Split(pathSQL, ";") sql = fetchSQL(file) For Each statement In Split(sql, ";" & vbNewLine) If Len(statement) < 5 Then GoTo skpStatement Debug.Print statement On Error Resume Next .Execute statement, dbFailOnError With Err If .Number <> 0 Then iErr = iErr + 1 sErr = sErr & vbCrLf & "Error " & .Number & " | " & Replace(.Description, vbCrLf, vbNullString) .Clear End If End With On Error GoTo 0 skpStatement: Next statement Next file End With .Quit acQuitSaveAll End With dTime = Now() - starttime ' Returnwert If sErr = vbNullString Then sErr = "Keine Fehler" createDB = "Zeit: " & Now & " | Dauer: " & Format(dTime, "hh:mm:ss") & " | Anzahl Fehler: " & iErr & vbCrLf & sErr ' Log With ThisWorkbook '... .Saved = True .Save End With End Function
創建郵件從Excel合併在
Word.Application
,使用現有的和相當大.docm
-templates和動態SQL查詢,返回receipentsSet rst = GetRecordset(ThisWorkbook.Sheets("Parameter").Range("A1:S100")) With New Word.Application .Visible = False While Not rst.EOF If rst!Verarbeiten And Not IsNull(rst!Verarbeiten) Then Debug.Print rst!Sql .Documents.Open rst!inpath & Application.PathSeparator & rst!infile stroutfile = fCheckPath(rst!outpath, True) & Application.PathSeparator & rst!outfile .Run "quelle_aendern", rst!DataSource, rst!Sql .Run MacroName:="TemplateProject.AutoExec.SeriendruckInDokument" Application.DisplayAlerts = False .ActiveDocument.ExportAsFixedFormat _ OutputFileName:=stroutfile _ , ExportFormat:=wdExportFormatPDF _ , OpenAfterExport:=False _ , OptimizeFor:=wdExportOptimizeForPrint _ , Range:=wdExportAllDocument _ , From:=1, To:=1 _ , Item:=wdExportDocumentContent _ , IncludeDocProps:=False _ , KeepIRM:=True _ , CreateBookmarks:=wdExportCreateNoBookmarks _ , DocStructureTags:=False _ , BitmapMissingFonts:=True _ , UseISO19005_1:=False Application.DisplayAlerts = True For Each doc In .Documents With doc .Saved = True .Close SaveChanges:=wdDoNotSaveChanges End With Next doc End If rst.MoveNext Wend .Quit End With
筆記:
- 當運行as小規模(例如,當查詢較少的記錄或使用不那麼複雜的模板時),這兩種代碼都可以順利運行。
- 在這兩種情況下,當我通過所有重新出現的提示輸入
OK
時,代碼最終會以期望的結果結束。 因此,我想我沒有遇到錯誤(也不會觸發錯誤處理程序),而是像超時一樣。
正如其他來源所建議的,我把我的代碼包裹到Application.DisplayAlerts = False
。然而,這似乎是一個可怕的想法,因爲實際上可能存在我需要提醒的情況。
https://groups.google.com/forum/?hl=en#!msg/microsoft.public.excel.programming/ct8NRT-o7rs/jawi42S8Ci0J – Tehscript
我們需要更多的上下文。這兩種方法如何相關?郵件合併是否連接到正在構建的數據庫?你在哪裏叫這兩個例程?目前尚不清楚爲什麼每次都需要建立一個完整的數據庫。 – Parfait
最後,似乎你已經安裝了MS Access,考慮使用它來調用其他Office應用程序,因爲它可以有更好的對象模型和應用程序/自動化環境。 – Parfait