【问题标题】:How to manage MS Excel application processes in MS Access VBA如何在 MS Access VBA 中管理 MS Excel 应用程序进程
【发布时间】:2018-01-22 00:22:59
【问题描述】:

我的以下代码会导致恶意 excel 进程干扰后续执行。我想知道我做错了什么导致这个打开。

但是,如果我设置 xl.visible = true 则当应用程序关闭时进程将被终止。

我认为这个问题应该围绕

Set wb = xl.Workbooks.Add(templatePath)

应用程序运行后,如果我打开创建的文件之一,它也会打开模板工作簿。这似乎是挂起的过程。

Public Function CreateAYRs()

'This process is known to leave a hanging excel process open after execution.

'database objects
Dim rsHeader As DAO.Recordset
Dim rsDetail As DAO.Recordset
Dim db As DAO.Database
'Excel objects
Dim xl As Excel.Application
Dim wb As Workbook
Dim ws As Worksheet
Dim templatewb As Workbook
'paths
Dim templatePath As String
Dim outboxPath As String

On Err GoTo ErrHandler

templatePath = "\\ahmtroy03\sppcsharedfiles\6290 Procurement Operations\Systems\Applications\AYR\AYR Form.xlsx"
outboxPath = "\\ahmtroy03\sppcsharedfiles\6290 Procurement Operations\_Public\Data\AYR\Sent\"

Set db = CurrentDb()

Set rsHeader = db.OpenRecordset("SELECT * FROM qryAYRtoSendHeader")

If Not rsHeader.BOF And Not rsHeader.EOF Then
    'there is a PO, create the parent application
    Set xl = New Excel.Application
    'xl.Visible = True

    rsHeader.MoveFirst
    While (Not rsHeader.EOF)
        'There will be a new workbook for each PO
        Set wb = xl.Workbooks.Add(templatePath)
        'Get all the lines
        Set rsDetail = db.OpenRecordset("SELECT [Due Date],[Model],[Part Number],[Part Desc] FROM qryAYRtoSendDetail WHERE [VC] In('" & rsHeader![VC] & "')")
        If Not rsDetail.BOF And Not rsDetail.EOF Then
            'Move the data to the spreadsheet
            wb.Sheets(2).Range("A2").CopyFromRecordset rsDetail
        End If
        'cleanup
        rsDetail.Close
        Set rsDetail = Nothing

        'Save the form, supress overwrite warnings
        wb.Application.DisplayAlerts = False
        wb.SaveAs outboxPath & "AHM AYR " & rsHeader![VC] & " - " & Format(Date, "mm-dd-yy"), FileFormat:=51
        wb.Application.DisplayAlerts = True

        'email the form

        wb.Close False
        Set wb = Nothing
        'move to the next PO
        rsHeader.MoveNext
    Wend
xl.Quit
Set xl = Nothing
End If
'cleanup
rsHeader.Close
Set rsHeader = Nothing
Set db = Nothing

Exit Function
ErrHandler:
MsgBox Err.Description

End Function

【问题讨论】:

  • 你有任何错误处理吗?在您清理 xl 对象之前,它可能会引发错误,这将使进程保持运行。添加处理并清理该块中的对象,并查看执行后进程是否继续。
  • 运行您的代码。我没有看到残留的 Excel 进程。我确实把它变成了一个 Sub 而不是 Function 但我怀疑这会有所作为
  • 我激活了 Windows 资源管理器预览窗格。如果我在资源管理器中查看工作簿,则会创建 Excel 进程并且它不会消失,即使我删除了工作簿,直到我关闭资源管理器窗口。但是,这并不妨碍程序运行。
  • 为什么在循环的每次迭代中都关闭和打开工作簿。既然您显然一直在使用同一个工作簿,为什么不在循环后关闭它呢?您声明但未使用的 Excel 变量(ws、templateb)有什么用?您是否编辑了此处发布的代码?如果是,问题可能出在您编辑的内容上吗?
  • 他正在为rsHeader@CindyMeister 的每一行创建一个新工作簿。 - 但另一个问题是相关的:问题中发布的代码是否真的显示了有问题的行为?检查minimal reproducible example的Verifiable部分。

标签: excel ms-access vba


【解决方案1】:

提供了很多非常有帮助和创造性的建议,但解决方案实际上是离谱的。

我做了更多研究,发现某处表明问题可能是由于 Excel COM 插件造成的。我禁用了所有加载项(其中一个是公司发行的),并且挂起的 excel 进程问题完全停止了。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2011-12-12
    • 1970-01-01
    • 2018-03-24
    • 2015-10-27
    相关资源
    最近更新 更多