我正在从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
创建一个范围(或几个),您在填写数据,而不是调用'ObjSht.Cells()'很多倍。 – Gustav