![](/img/trans.png)
[英]MS Access VBA How to I supress the “Do you want to save changes” dialog for excel row deletes?
[英]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 While
, If 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.