簡體   English   中英

如何從 MS Access VBA 中刪除我的孤立 MS Excel 進程?

[英]How do I get rid of my orphan MS Excel process from MS Access VBA?

我正在將 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的活動引用,這可以防止 Excel 退出。

我建議按以下順序進行:

'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


補充說明:

打開記錄集后,您永遠不會rs.EOF為 False 而rs.BOF為 True 的情況。 所以沒有必要測試rs.BOF

將循環更改為Do WhileIf Not (rs.EOF And rs.BOF) Then變得多余:

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

您必須非常具體地處理 Excel 對象,以相反的順序打開和關閉它們。 這是一個有效的骨架:

 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 用於 WorkSheet。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM