【发布时间】:2017-08-06 16:00:25
【问题描述】:
我在 Access 中运行 VBA 代码并更新现有的 Excel 文件。
我必须为每个销售人员创建 xls 文件,并通过从通过 ODBC 驱动程序连接到 Oracle 数据库的 Access accdb 文件中导出数据,将每月销售点的客户分组来更新单元格。
我们有大约 50 名销售人员,每个人都必须创建 2 个文件。如果我无法解决问题,我的电脑上将有 100 个 Excel 进程。即使我使用 VBA 成功运行了 accdb,它也可能在运行时被冻结。
问题:
- 无法通过我尝试的 Application.Quit 关闭 Excel 进程 通过 Excel.Application.Workbooks 对象打开一个 xls 文件,看起来 即使我使用了 xls 文件,它仍然被捕获。关闭 SaveChanges:=真
- 无法针对相同文件再次处理 VBA 代码 留下之前的excel文件操作流程,我确认了 在任务管理器上,我每次都必须手动终止进程。
我在互联网和 MSDN 网站上进行了谷歌搜索。我找不到任何好的解决方案。
Option Compare Database
Const TARGET_SHEET = "SalesObjectiveSheet"
Const FILE_CREATION_WORK_FOLDER As String = "Work"
Const DESTINATION_ROOTPATH As String = "C:\Users\Administrator\Desktop"
Const TARGET_SHEET2 As String = "SalesObjectivesSheet"
Const HEADING_LINE_POSITION As Integer = 3
Public objApp As Excel.Application
Public objBooks As Excel.Workbooks
Public objBook As Excel.Workbook
Public objSheets As Excel.Worksheets
Public objSheet As Excel.Worksheet
Public Sub test200()
Dim str As Boolean
On Error GoTo Err_Handler
strSalesName = "SalesName"
strSalesOffice = "Tokyo"
strTargetFolder = DESTINATION_ROOTPATH & "\" & FILE_CREATION_WORK_FOLDER
strTargetFileName = "SalesObjectiveSheet_201708.xlsx"
strTargetFullPath = strTargetFolder & "\" & strTargetFileName
Set objApp = CreateObject("Excel.Application")
Set objBook = objApp.Workbooks.Open(strTargetFullPath)
Set objSheet = objBook.Worksheets(TARGET_SHEET2)
If EditObjectSheetHeader(objSheet, objApp, objBook, _
objBooks, strSalesName, strSalesOffice, strTargetFileName) = False Then
GoTo Err_Handler
End If
Exit_Handler:
objApp.Quit
Set objSheet = Nothing
Set objBooks = Nothing
Set objApp = Nothing
Exit Sub
Err_Handler:
' SysCmd acSysCmdRemoveMeter
Resume Exit_Handler
End Sub
Function EditObjectSheetHeader(objSheet As Object, objApp As Object, objBook As Object, _
objBooks As Object, strSalesName, strSalesOffice, strTargetFileName) As Boolean
Dim strProcedureName As String
Dim strMonth As String
On Error GoTo Err_Handler
objSheet.Select
objSheet.Activate
strProcedureName = "EditObjectSheetHeader"
EditObjectSheetHeader = False
With objSheet.PageSetup
.CenterHeader = "&14 " & "Month Sales Objectives"
.RightHeader = "" & Chr(10) & "Sales Office:" & strSalesOffice & " Name:" & strSalesName
.CenterFooter = "&P/&N"
.PrintTitleRows = "$1:$" & HEADING_LINE_POSITION
.LeftHeader = ""
End With
Exit_Handler:
Workbooks(strTargetFileName).Close SaveChanges:=True
' Frozen after I run the VBA code once cause of previous & _
process use same file is existed it seems be.
' ActiveWorkbook.Close saveChanges:=True
' Frozen after I run the VBA code once cause of & _
previous process use same file is existed & _
(Object and With is not defined error)
' objBook.Close SaveChanges:=True
' Frozen after I run the VBA code once cause of & _
previous process use same file is existed & _
it seems be.
' ActiveWorkbook.Close SaveChanges:=True
' Error unknown.
' ThisWorkbook.Save
'Error 1004 unknown.
EditObjectSheetHeader = True
Exit Function
Err_Handler:
Select Case Err.Number
Case 9
Debug.Print strProcedureName, Err.Number, Err.Description
MsgBox Err.Description & " " & Err.Number, vbOKOnly, strProcedureName
Case 70
Debug.Print strProcedureName, Err.Number, Err.Description
MsgBox Err.Description & " " & Err.Number, vbOKOnly, strProcedureName
Resume
Case Else
Debug.Print strProcedureName, Err.Number, Err.Description
MsgBox Err.Description & " " & Err.Number, vbExclamation, strProcedureName
End Select
End Function
【问题讨论】:
-
完成后需要释放所有变量引用
objBook As Excel.Workbook所以Set objBook = Nothing。 -
@meaden 亲爱的 Meaden,它成功了!非常感谢。我很乐意解决这个问题。
-
酷,我在下面正式回答。请问你能接受吗?
-
您也应该将
Workbooks更改为objApp.Workbooks。 -
@YowE3K 现在完美修复了。我厌倦了一次又一次地运行代码。我运行了以前的代码,但即使它成功运行一次,它也离开了进程。我运行了几次代码,现在我在任务管理器中找不到 excel 进程。非常感谢。现在我没有问题了。我可以毫无问题地运行我们的销售代码。