【问题标题】:Close Excel process by Application.Quit通过 Application.Quit 关闭 Excel 进程
【发布时间】:2017-08-06 16:00:25
【问题描述】:

我在 Access 中运行 VBA 代码并更新现有的 Excel 文件。

我必须为每个销售人员创建 xls 文件,并通过从通过 ODBC 驱动程序连接到 Oracle 数据库的 Access accdb 文件中导出数据,将每月销售点的客户分组来更新单元格。

我们有大约 50 名销售人员,每个人都必须创建 2 个文件。如果我无法解决问题,我的电脑上将有 100 个 Excel 进程。即使我使用 VBA 成功运行了 accdb,它也可能在运行时被冻结。

问题:

  1. 无法通过我尝试的 Application.Quit 关闭 Excel 进程 通过 Excel.Application.Workbooks 对象打开一个 xls 文件,看起来 即使我使用了 xls 文件,它仍然被捕获。关闭 SaveChanges:=真
  2. 无法针对相同文件再次处理 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 进程。非常感谢。现在我没有问题了。我可以毫无问题地运行我们的销售代码。

标签: excel ms-access vba


【解决方案1】:

以下行有帮助,但任何其他打开的 xls 也将被关闭:

Shell "taskkill /F /IM EXCEL.EXE /T"

【讨论】:

    【解决方案2】:

    在释放引用后尝试放置objApp.Quit

    Set objSheet = Nothing
    Set objBooks = Nothing
    Set objApp = Nothing
    
    If Not objApp is Nothing Then objApp.Quit
    

    【讨论】:

    • 我知道这在 3 年前就已经得到了回答,但是当 objApp 在调用 Quit 时它已经是 Nothing 时它应该如何工作(将抛出 NullReferenceException)?
    • 好的,在前面放一个If Not objApp is Nothing Then 作为警卫。
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2019-01-24
    • 2011-10-21
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多