2017-02-04 80 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