如何从MS Access VBA中删除我的孤儿MS Excel进程?

我正在将MS Access查询导出到模板,进行一些格式化,然后将模板另存为新名称。 当这一切都完成后,我有一个孤立的MS Excel进程,干扰时再次调用该函数。 我认为这是要么我是如何使用范围或最后我的清理问题。

此外,我是一个新手编码器,所以如果任何人有任何提示和技巧,我可以利用,使这个更好,我总是接受。

Andre的评论之后更新的代码在Rory的评论之后更新了代码

Public Function OpenOrders(strSupplier As String) 'Excel file variables Dim xlapp As Excel.Application Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Dim xlsLRow As Long Dim xlsLCol As Long 'Access variables Dim db As DAO.Database Dim rs As DAO.Recordset Dim strSQL As String 'Set up access objects strSQL = "SELECT * FROM qryOpenOrderReport WHERE [Supplier Cd] = '" & strSupplier & "';" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL) 'Set up excel connection Set xlapp = CreateObject("Excel.Application") Set wb = xlapp.Workbooks.Open(Application.CurrentProject.Path & "\Open Order Template.xlsx") Set ws = wb.Worksheets(1) xlapp.Visible = True 'Make sure the form is clear xlsLRow = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).row xlsLCol = ws.UsedRange.Columns(ws.UsedRange.Columns.Count).Column ws.Range("A2", ws.Cells(xlsLRow, xlsLCol)).ClearContents 'Copy recordset to worksheet ws.Cells(2, 1).CopyFromRecordset rs rs.Close 'Copy formats down and autofit xlsLRow = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).row xlsLCol = ws.UsedRange.Columns(ws.UsedRange.Columns.Count).Column xlapp.CutCopyMode = False ws.Range(ws.Cells(2, 1), ws.Cells(2, xlsLCol)).Copy ws.Range(ws.Cells(3, 1), ws.Cells(xlsLRow, xlsLCol)).PasteSpecial (xlPasteFormats) ws.UsedRange.Columns.AutoFit 'Clean up xlapp.DisplayAlerts = False Set ws = Nothing wb.SaveAs Application.CurrentProject.Path & "\Open Orders\" & strSupplier & ".xlsx" wb.Close True Set wb = Nothing xlapp.Quit Set xlapp = Nothing End Function 

所有Cells ws.Cells需要更改为ws.Cells 。 那是什么导致你的孤儿过程。

我的猜测是,您在清理时仍然对ws有一个主动引用,这可以防止Excel退出。

我build议按照这个顺序来做:

 'Clean up xlapp.DisplayAlerts = False Set ws = Nothing wb.Close True, strSupplier Set wb = Nothing xlapp.Quit Set xlapp = Nothing 

ws.Range("A2", "XFD1048576").ClearContents似乎有点激进:) – 你可以使用.UsedRange


附加说明:

打开一个logging集后,你永远不会处于rs.EOF为False的情况,但是rs.BOF为True。 所以没有必要testingrs.BOF

通过将循环更改为Do WhileIf Not (rs.EOF And rs.BOF) Then变得多余:

 Set rs = db.OpenRecordset(strSQL) Do While Not rs.EOF ' ... rs.MoveNext Loop 

您必须对Excel的对象非常具体,打开它们并以相反的顺序closures。 这是一个工程的骨架:

  Dim xls As Excel.Application Dim wkb As Excel.Workbook Dim wks As Excel.Worksheet Dim rng As Excel.Range Set xls = New Excel.Application Set wkb = xls.Workbooks.Open("c:\test\workbook1.xlsx") Set wks = wkb.Worksheets(1) Set rng = wks.<somerange> ' Cells or whatever. ' Do stuff. ' Clean up. Set rng = Nothing wks.Name = "My New Name" wkb.Close True Set wks = Nothing Set wkb = Nothing xls.Quit Set xls = Nothing 

不要使用wkb.Sheets作为工作表。