2017-02-04 84 views
0

我正在從Access 2010/Windows 7遷移到Access 2016/Windows 10.我從我的SQL Server數據庫將數據讀入Excel模板,保存完成的電子表格,然後郵件它通過CDO給各種各樣的收件人。這在Access 2010/Windows 7中運行良好。必須暫停Access 2016 VBA以避免Excel致命錯誤

但是在Access 2016/Windows 10中,我最初經常得到一個「Excel已停止工作」的消息;在保存電子表格之前,Access代碼在顯然隨機的地方停止了。如果我設置了一個斷點,並通過代碼一切正常工作。然後我發現,如果我將代碼暫停500毫秒(如下面的縮寫代碼所示),一切正常(但不會暫停100毫秒)。雖然它現在正在工作,但這不是一個非常令人滿意的解決方案;有更好的嗎?

Dim Temp_rs As New ADODB.Recordset 

Set ObjXL = New Excel.Application 
ObjXL.Visible = False 
Set ObjWkb = ObjXL.Workbooks.Open("\\xxx.xxx.xxx\xxxxa\xx\xxxxxxxx\xxxxx\xxxxxxxx\Template.xlsm") 
Set ObjSht = ObjWkb.Worksheets("Audit") 
ObjSht.Activate 
ObjSht.Unprotect ("xxxxxxxx") 

'Quite a lot of reading data from various recordsets 
mod_OpenMyRecordset Temp_rs, SomeRecordSet 
ObjSht.Cells(6, 4) = "Toezegging" & Str(Temp_rs!tzNummer_i) 
...etc etc etc 

Sleep (500) 'Wait for 0.5 second (necessary for Windows 10!) 

ObjSht.Cells(7, 1).Value = "    " & SomeValue 
ObjSht.Cells(8, 1).Value = "    " & SomeValue 
ObjSht.Cells(9, 1).Value = "    " & SomeValue 

ObjSht.PageSetup.RightFooter = "Pagina &P van &N" 
ObjSht.EnableSelection = xlUnlockedCells 
ObjWkb.Worksheets("Sheet1").Visible = True 
ObjSht.Visible = xlSheetVeryHidden 
ObjSht.Protect ("xxxxxxxx") 
MyPath = "\\xxx.xxx.xxx\xxxxa\xx\xxxxxxxx\xxxxx\xxxxxxxx\xxxxxxxxx" & Trim(ObjSht.Cells(9, 1).Value) & ".xlsm" 

ObjWkb.SaveAs MyPath 
ObjWkb.Close 

Set ObjSht = Nothing 
Set ObjWkb = Nothing 
ObjXL.Quit 
Set ObjXL = Nothing 

Dim objMessage As Object, objBodyPart As Object 
Set objMessage = CreateObject("CDO.Message") 
Set objBodyPart = objMessage.BodyPart 
objBodyPart.Charset = "UTF-8" 
Set MyObjMessage = CreateObject("CDO.Message") 
objMessage.addAttachment MyPath 
objMessage.From = SomeValue 
objMessage.Subject = SomeValue 
objMessage.To = SomeValue 
objMessage.Textbody = SomeValue 
objMessage.BCC = SomeValue 
With objMessage 
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = pubMailServer 
    .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
    .Configuration.Fields.Update 
    .Send 
End With 
+0

創建一個範圍(或幾個),您在填寫數據,而不是調用'ObjSht.Cells()'很多倍。 – Gustav

回答

0

試圖縮小問題的潛在來源: 1的代碼看起來不錯,顯然工作之前,因此不太可能是與代碼邏輯 2 - 我動了不少的問題數據進出Excel的所有時間,永遠不會有你的問題,所以我也懷疑它的大小或數據量你正在移動(糾正我,如果我錯了,它像500,000行×150選項卡......) 3-我發現創建其他MSO應用程序會導致致命/災難性錯誤;你是否有理由創建一個新的Excel應用程序而不是僅僅是一個新的工作簿?或者,您在訪問運行此,在這種情況下,沒關係...... 4-您的代碼:

ObjSht.Cells(6, 4) = "Toezegging" & Str(Temp_rs!tzNummer_i) 
...etc etc etc 

稍微關注,因爲你是直接通過一個什麼似乎是一個大量的寫入範圍之一數據......這是非常低效的,取決於它是如何寫入可能會耗盡系統內存並導致錯誤 - 您究竟在做什麼這部分代碼?

希望這有助於 TheSilkCode

+0

1.是的,在同一個應用程序中的其他地方我使用相同的邏輯來填充和發送其他電子表格,他們似乎工作正常 –

+0

2:實際上只有四個更多的單元格填充,雖然這涉及到相當多的SQL服務器操作。 3:在Access中是。 4:好,但總共只能填充約10個單元。 –

+0

@PeterBeresford,我看到 - 反饋很有幫助,但讓我有些惱怒!代碼分解最多的地方在哪裏?希望代碼中斷的分佈可能會給我們提供一個線索......我看到你現在已經在你沉重的SQL Servcer操縱之後立即停下來了,那是它最糟糕的地方?如果是這樣的話,那麼以前可能應該對此塊進行更深入的研究.. – TheSilkCode