Excel守护程序实例:访问VBA

时间:2016-04-11 18:18:05

标签: vba excel-vba access-vba excel

这个问题现在耗费了我很多时间。每次我运行代码从访问启动excel读取文件位置,然后打开该文件位置上的Excel,进行更改并关闭。我看到这留下了一个孤儿excel进程。我已经尝试了所有的参考方式和互联网上建议的可能的解决方案,但没有任何帮助。我的代码如下。任何帮助或建议都会很棒:

Public Sub productdetailprinter()

Dim i As Double
Dim dbs As DAO.Database
Dim recSet As Recordset
Dim wb As Workbook
Dim ws As Worksheet
Dim tableName As String
Dim recTable As Recordset
Dim fld As DAO.Field
Dim k As Integer
Dim r As Integer
Dim intformat As Integer
Dim wrksht As Worksheet
Dim wrkbk As Workbook
Dim filelocation As String
Dim xl As Excel.Application


Set xl = CreateObject("Excel.Application")
xl.Visible = True

Set dbs = CurrentDb
Set recSet = dbs.OpenRecordset("tbl_formList")
Set wrkbk = xl.Workbooks.Open("<location>")
Set wrksht = wrkbk.Worksheets("databaselinks")
filelocation = wrksht.Range("C5").Value

wrkbk.Close
xl.Quit
Set wrksht = Nothing
Set wrkbk = Nothing
Set xl = Nothing
Set xl = CreateObject("Excel.Application")
xl.Visible = True
xl.Workbooks.Application.DisplayAlerts = False
xl.Workbooks.Application.AskToUpdateLinks = False
Set wb = xl.Workbooks.Open(filelocation & "\product_detail.xlsx")
Set ws = wb.Worksheets("details")
xl.Workbooks.Application.AskToUpdateLinks = True
xl.Workbooks.Application.DisplayAlerts = True

ws.Range("B3", Range("B3").End(xlDown)).Select
xl.Selection.Clear
ws.Range("C3", Range("C3").End(xlDown)).Select
xl.Selection.Clear
ws.Range("D3", Range("D3").End(xlDown)).Select
xl.Selection.Clear

i = ws.Columns("B").End(xlDown).Row
i = i + 1
Do Until recSet.EOF

'code lines

recSet.MoveNext
Loop

ws.Save
wb.Close
xl.Quit
Set xl = Nothing
Set ws = Nothing
Set wb = Nothing
recTable.Close
recSet.Close

End Sub

2 个答案:

答案 0 :(得分:0)

您必须以完全相反的顺序关闭对象:

' Also:
Dim rng As Excel.Range

Set xl = CreateObject("Excel.Application")
xl.Visible = True

Set wrkbk = xl.Workbooks.Open("<location>")
Set wrksht = wrkbk.Worksheets("databaselinks")
Set rng = wrksht.Range("C5")
filelocation = rng.Value

Set rng = Nothing
Set wrksht = Nothing
wrkbk.Close
Set wrkbk = Nothing
xl.Quit
Set xl = Nothing

这是经过测试并适用于我:

Public Sub EditWorkSheet()

    Dim xls     As Excel.Application
    Dim wkb     As Excel.Workbook
    Dim wks     As Excel.Worksheet
    Dim rng     As Excel.Range

    Dim Column  As Integer

    Set xls = New Excel.Application
    Set wkb = xls.Workbooks.Open("c:\test\test.xlsx")
    Set wks = wkb.Worksheets(1)

    Set rng = wks.Range("C5")
    rng.Value = 4

    wkb.Close True, "c:\test\test1.xlsx"

    Set rng = Nothing
    Set wks = Nothing
    Set wkb = Nothing

    xls.Quit

    Set xls = Nothing

End Sub

答案 1 :(得分:0)

感谢您提出的解决方案。花了4个小时之后......我意识到vba并不满足于我引用范围的方式。

ws.Range(&#34; B3&#34;,范围(&#34; B3&#34;)。结束(xlDown))。选择 应该被引用为 ws.Range(&#34; B3&#34;),ws.Range(&#34; B3&#34;)。End(xlDown))。选择

它就像一个魅力.. Excel实例死了,没有更多的错误。 希望这可以节省一些时间。

谢谢