在任务管理器中结束从 VBA 代码创建的实例
To end the instance created from VBA code in Task manager
我写了一个 VBA(Access) 代码来将数据从 Access 数据库导出到 Excel 工作表。在代码的末尾,我关闭了所有对象、记录集、工作表,分别 'nothing' 是 set.After 第一个 运行,我检查任务管理器,我看到 Excel 仍然存在于其中。导出后,如果我关闭 Access 数据库,任务管理器中的实例将结束。这是正常的吗?或者我必须编辑我的代码吗?
缺点:当数据库仍处于打开状态时,我无法 运行 第二次执行代码。
下面是我的代码
Public Sub Expdata()
Dim rst As DAO.Recordset
Dim xlWBk As Object, Apxl As Object
Dim wsMetaData As Worksheet
Dim wsPlanning As Worksheet
Dim PathEx As String
Dim i As Long
Dim Tempsheetname As String
Dim blnEXCEL As Boolean
blnEXCEL = False
On Error Resume Next
Set Apxl = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Set Apxl = CreateObject("Excel.Application")
blnEXCEL = True
End If
Err.Clear
On Error GoTo 0
PathEx = Forms("Export").Text14 'path comes from the directory given in form
'Set Apxl = CreateObject("Excel.Application")
Set xlWBk = Apxl.Workbooks.Open(PathEx)
Tempsheetname = "Metadatasheet"
Worksheets.Add.Name = Tempsheetname
Set wsMetaData = xlWBk.Worksheets("Metadatasheet")
Set wsPlanning = xlWBk.Worksheets("PlanningData")
Apxl.Visible = True 'uncomment for debug to see excel file
Set rst = CurrentDb.OpenRecordset("LatestSNR")
For i = 1 To rst.Fields.Count
wsMetaData.Cells(1, i).Value = rst.Fields(i - 1).Name
Next i
rst.MoveFirst
wsMetaData.Range("A2").CopyFromRecordset rst
'calls Exp_Refresh module
Call Exp_Refresh.RfData(xlWBk)
Set xlWBk = Apxl.Workbooks.Open(PathEx)
xlWBk.Sheets("Metadatasheet").Select
DoCmd.SetWarnings False
xlWBk.Application.DisplayAlerts = False
xlWBk.Sheets("Metadatasheet").Delete
DoCmd.SetWarnings True
xlWBk.Application.DisplayAlerts = True
'Close all the objects and recordsets
rst.Close
Set rst = Nothing
xlWBk.Close SaveChanges:=True
Set xlWBk = Nothing
Set wsMetaData = Nothing
Set wsPlanning = Nothing
If blnEXCEL = True Then Apxl.Quit
Set Apxl = Nothing
MsgBox "Export Successful !!!"
End Sub
它Excel没有关闭?然后在工作簿上创建对象,而不是 ExcelApp.
此外,如果 excel 设置为可见,则 COM 规则表示如果用户可以看到它,则不要关闭它。
经过一番研究..我找到了错误点
Tempsheetname = "Metadatasheet"
Worksheets.Add.Name = Tempsheetname
此时它已经失去了对对象的引用。所以如果 "Access app has ANY reference to an Excel resource, Excel won't close".
我所要做的就是;
Tempsheetname = "Metadatasheet"
xlWBk.Worksheets.Add.Name = Tempsheetname
我写了一个 VBA(Access) 代码来将数据从 Access 数据库导出到 Excel 工作表。在代码的末尾,我关闭了所有对象、记录集、工作表,分别 'nothing' 是 set.After 第一个 运行,我检查任务管理器,我看到 Excel 仍然存在于其中。导出后,如果我关闭 Access 数据库,任务管理器中的实例将结束。这是正常的吗?或者我必须编辑我的代码吗?
缺点:当数据库仍处于打开状态时,我无法 运行 第二次执行代码。 下面是我的代码
Public Sub Expdata()
Dim rst As DAO.Recordset
Dim xlWBk As Object, Apxl As Object
Dim wsMetaData As Worksheet
Dim wsPlanning As Worksheet
Dim PathEx As String
Dim i As Long
Dim Tempsheetname As String
Dim blnEXCEL As Boolean
blnEXCEL = False
On Error Resume Next
Set Apxl = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Set Apxl = CreateObject("Excel.Application")
blnEXCEL = True
End If
Err.Clear
On Error GoTo 0
PathEx = Forms("Export").Text14 'path comes from the directory given in form
'Set Apxl = CreateObject("Excel.Application")
Set xlWBk = Apxl.Workbooks.Open(PathEx)
Tempsheetname = "Metadatasheet"
Worksheets.Add.Name = Tempsheetname
Set wsMetaData = xlWBk.Worksheets("Metadatasheet")
Set wsPlanning = xlWBk.Worksheets("PlanningData")
Apxl.Visible = True 'uncomment for debug to see excel file
Set rst = CurrentDb.OpenRecordset("LatestSNR")
For i = 1 To rst.Fields.Count
wsMetaData.Cells(1, i).Value = rst.Fields(i - 1).Name
Next i
rst.MoveFirst
wsMetaData.Range("A2").CopyFromRecordset rst
'calls Exp_Refresh module
Call Exp_Refresh.RfData(xlWBk)
Set xlWBk = Apxl.Workbooks.Open(PathEx)
xlWBk.Sheets("Metadatasheet").Select
DoCmd.SetWarnings False
xlWBk.Application.DisplayAlerts = False
xlWBk.Sheets("Metadatasheet").Delete
DoCmd.SetWarnings True
xlWBk.Application.DisplayAlerts = True
'Close all the objects and recordsets
rst.Close
Set rst = Nothing
xlWBk.Close SaveChanges:=True
Set xlWBk = Nothing
Set wsMetaData = Nothing
Set wsPlanning = Nothing
If blnEXCEL = True Then Apxl.Quit
Set Apxl = Nothing
MsgBox "Export Successful !!!"
End Sub
它Excel没有关闭?然后在工作簿上创建对象,而不是 ExcelApp.
此外,如果 excel 设置为可见,则 COM 规则表示如果用户可以看到它,则不要关闭它。
经过一番研究..我找到了错误点
Tempsheetname = "Metadatasheet"
Worksheets.Add.Name = Tempsheetname
此时它已经失去了对对象的引用。所以如果 "Access app has ANY reference to an Excel resource, Excel won't close".
我所要做的就是;
Tempsheetname = "Metadatasheet"
xlWBk.Worksheets.Add.Name = Tempsheetname