Excel守护程序实例:Access VBA

Excel守护程序实例:Access VBA,excel,ms-access,vba,Excel,Ms Access,Vba,这个问题现在占用了我很多时间。每次我从access运行代码启动excel读取文件位置,然后在该文件位置打开excel,进行更改并关闭。我发现这留下了一个孤立的excel流程。我尝试了所有的参考方法和在互联网上提出的可能的解决方案,但没有任何帮助。我的代码如下。任何帮助或建议都将非常有用: Public Sub productdetailprinter() Dim i As Double Dim dbs As DAO.Database Dim recSet As Recordset Dim wb

这个问题现在占用了我很多时间。每次我从access运行代码启动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
Public子产品detailprinter()
我是双人的
Dim数据库作为DAO.Database
Dim recSet作为记录集
将wb设置为工作簿
将ws设置为工作表
将表名设置为字符串
可重选为记录集
模糊fld为刀场
将k变为整数
作为整数的Dim r
整数格式
Dim wrksht As工作表
将wrkbk设置为工作簿
将文件位置设置为字符串
Dim-xl作为Excel.Application
Set xl=CreateObject(“Excel.Application”)
xl.Visible=True
设置dbs=CurrentDb
Set recSet=dbs.OpenRecordset(“tbl\u formList”)
设置wrkbk=xl.Workbooks.Open(“”)
设置wrksht=wrkbk.Worksheets(“数据库链接”)
filelocation=wrksht.Range(“C5”).值
好的,结束
xl.退出
设置wrksht=Nothing
设置wrkbk=Nothing
设置xl=无
Set xl=CreateObject(“Excel.Application”)
xl.Visible=True
xl.Workbooks.Application.DisplayAlerts=False
xl.Workbooks.Application.AskToUpdateLinks=False
设置wb=xl.Workbooks.Open(filelocation&“\product\u detail.xlsx”)
设置ws=wb.工作表(“详细信息”)
xl.Workbooks.Application.AskToUpdateLinks=True
xl.Workbooks.Application.DisplayAlerts=True
ws.Range(“B3”,Range(“B3”)。End(xlDown))。选择
xl.Selection.Clear
ws.Range(“C3”,Range(“C3”).End(xlDown))。选择
xl.Selection.Clear
ws.Range(“D3”,Range(“D3”)。End(xlDown))。选择
xl.Selection.Clear
i=ws.Columns(“B”).End(xlDown).Row
i=i+1
直到recSet.EOF为止
“代码行
recSet.MoveNext
环
ws.Save
wb.关闭
xl.退出
设置xl=无
设置ws=Nothing
设置wb=Nothing
可纠正,关闭
记录,关闭
端接头

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

' 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

感谢您提出的解决方案。在这上面花了4个小时之后。。我意识到vba对我引用范围的方式不满意

ws.Range(“B3”,Range(“B3”)。End(xlDown))。选择 应引用为 ws.Range(ws.Range(“B3”)、ws.Range(“B3”).End(xlDown))。选择

它很有魅力。。Excel实例死亡,不再出现错误。 希望这能节省一些人的时间


谢谢你

有很多好处,应该是专业程序员的第二天性。没有必要退出Excel并创建另一个实例。你可以继续使用它。通常,将ws和wb设置为nothing会在处理off xl之前发生。由于您的Excel实例是可见的,您应该能够知道它何时关闭。感谢Gustav,我将代码更改为按相反顺序关闭。它仍然会在最后留下excel实例。我还注意到,每次我在调试模式下运行代码时,它都能正常运行,但当我运行时,它在设置rng=wrksht.Range(“C5”)时失败。。您对此也有什么建议吗?正如@MikeC所指出的,您还应该注意只打开一次Excel。请参阅已编辑的答案和简化的示例。当设置rng=wrksht.Range(“C5”)失败时,您会收到什么错误消息?
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