【问题标题】:VBA Excel instance doesn't close when opened from MS Access - late binding still same error从 MS Access 打开时,VBA Excel 实例未关闭 - 后期绑定仍然相同的错误
【发布时间】:2021-02-03 10:58:32
【问题描述】:

这是我的原帖 VBA Excel instance doesn't close when opened from MS Access - late binding 它已被回答,我没有意识到当我接受答案时 xlsm 文件仍未关闭。

之所以会出现如此大的问题,是因为当有一个打开的 ghost .xlsm 文件时,下一个打开的 .xlsm 文件不会运行启动宏。所以,我所有的自动化都失败了,因为以前的 .xlsm 位于内存中。

所以,我安排了许多自动化运行。它们在运行 MS Access 程序的方式上都很相似,然后从 MS Access 程序打开 .xlsm,然后 MS Access 程序通过电子邮件发送结果。可以同时运行多个自动化,因此,有时当打开 .xlsm 时,可能会打开其他 excel 文件或其他 .xlsm 文件,或者根本没有。

发生的情况是,由于某种原因,使用下面的代码,.xlsm 文件没有完全关闭。它在任务栏中不可见,我知道它仍在某处打开的唯一原因是进入 VBA 项目窗口(请参见下面的屏幕截图)。

这是一个屏幕截图,显示了我的任务栏上的内容以及 VBA 项目中的内容。

而且,由于某种原因,当文件像这样出现幻影时,下一个 .xlsm 文件不会运行启动宏。如果我杀死 Excel,然后打开 .xlsm 文件,启动宏运行正常。

这是我正在使用的代码

这是从 MS Access 打开 excel 文件的内容

Set ExcelApp = CreateObject("Excel.Application")
Set ExcelWbk = ExcelApp.Workbooks.Open(CurPath & "CurrentProjects.xlsm", True)
ExcelApp.Visible = False
ExcelApp.Quit
Set ExcelWbk = Nothing
Set ExcelApp = Nothing

这是启动宏。这被放置在 THIS WORKBOOK 模块中。

Private Sub Workbook_Open()
    CreateReporting
End Sub

这是excel文件中的代码

Option Explicit

Public Sub CreateReporting()

    Dim MonthlyPath As String, CurPath As String, ProjectDate As String, FullName As String, CurLastRow As Long, CurRowNum As Long
    Dim i     As Range, CurCell As Variant, CurRange As Range
    Dim wbkM  As Workbook, wbkNewFile   As Workbook, wksReportDates As Worksheet, wksCopyFrom   As Worksheet, wksCopyTo   As Worksheet, wks3  As Worksheet
    Dim rngCopyFrom As Range, rngCopyTo As Range

    CurPath = ThisWorkbook.Path & "\"
    
    With ThisWorkbook.Sheets("QReportDates")
        MonthlyPath = .Range("A2").Value
        ProjectDate = .Range("B2").Value
    End With
    
    FullName = ProjectDate & " Current Projects.xlsx"

    Set wbkM = Workbooks("CurrentProjects.xlsm")
    Set wksReportDates = wbkM.Sheets("QReportDates")
 
    If Dir(MonthlyPath, vbDirectory) = "" Then
        MkDir (MonthlyPath)
    End If

    Set wbkNewFile = Workbooks.Add
    wbkNewFile.SaveAs MonthlyPath & FullName

    Set wbkNewFile = Workbooks(FullName)

    wbkM.Sheets("TEMPLATEReporting").Copy after:=wbkNewFile.Sheets(1)
    wbkNewFile.Sheets(2).Name = "Current Projects"

    With wbkNewFile
        .Sheets("Sheet1").Delete
    End With

    Set wksCopyFrom = wbkM.Sheets("QCurrentProjects")
    Set wksCopyTo = wbkNewFile.Sheets("Current Projects")
                                                           
    With wksCopyFrom
        CurLastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        Set rngCopyFrom = .Range("A2:K" & CurLastRow)
    End With
                         
    With wksCopyTo
        Set rngCopyTo = .Range("A2:K" & CurLastRow)
    End With
                        
    rngCopyTo.Value = rngCopyFrom.Value
    
    For Each i In wksCopyTo.Range("F2:F" & CurLastRow)
        With Worksheets(1)
            .Hyperlinks.Add Anchor:=Range("F" & i.Row), Address:=Range("F" & i.Row), TextToDisplay:=Range("C" & i.Row).Value
        End With
    Next
      
    wbkNewFile.Save
    wbkNewFile.Close
    Set wbkNewFile = Nothing
    Set wksCopyTo = Nothing
    Set rngCopyTo = Nothing
    Set wksCopyFrom = Nothing
    Set rngCopyFrom = Nothing
     
    wbkM.Worksheets("QReportDates").Delete
    wbkM.Worksheets("QCurrentProjects").Delete
    wbkM.Save
    wbkM.Close
    
    Set CurCell = Nothing: Set CurRange = Nothing: Set wbkM = Nothing: Set wbkNewFile = Nothing: Set wksReportDates = Nothing:  Set wksCopyFrom = Nothing: Set wksCopyTo = Nothing
End Sub

请注意,在这个版本中,我正在从 excel 中关闭 .xlsm 文件

wbkM.Close

但我也尝试从 MS Access 中关闭它并从 Excel 中删除 wbkM.Close。结果一样。

Set ExcelApp = CreateObject("Excel.Application")
Set ExcelWbk = ExcelApp.Workbooks.Open(CurPath & "CurrentProjects.xlsm", True)
ExcelApp.Visible = False 
ExcelWbk.Close 
ExcelApp.Quit    
Set ExcelWbk = Nothing
Set ExcelApp = Nothing

【问题讨论】:

  • 在 MS Access 代码中,您不会关闭 Excel 工作簿。另外,您不需要运行 Excel 宏。
  • 我不是在excel中关闭它吗?但是我尝试了两种方法,我尝试将您的线路留在 ms 访问中并从 excel 中删除 wbkm.close。相同的。在 THISWORKBOOK 中调用了宏,我没有发布那部分。但它工作正常,它会自动打开并运行,只是不会关闭并位于内存中。然后下一个宏不会自动运行。但是,如果我从任务管理器中杀死 excel 并打开该工作簿,宏会在启动时运行
  • 请在 Access/Excel 之间逐步编辑您的帖子。一开始什么是打开或关闭的?我假设 MS Access 是在 all Excel 工作簿和应用程序关闭的情况下打开的。
  • 完成,请看 :)
  • 实际上,底层工作簿因宏而挂起的原因之一是提示等待用户,例如警告工作簿将替换现有工作簿。为此,在宏内部尝试关闭DisplayAlerts 并结束重新打开它。甚至关闭ScreenUpdating 以提高效率。

标签: excel vba


【解决方案1】:

在@Parfait 的帮助下(或者说真的,他在 3 个线程中为我解决了这个问题),现在一切都很完美。贴出代码供参考

这是打开 xlsm 文件、运行宏然后关闭 xlsm 文件的内容

Set ExcelApp = CreateObject("Excel.Application")
Set ExcelWbk = ExcelApp.Workbooks.Open(CurPath & MainProjectName & ".xlsm", True)
ExcelApp.Visible = False
ExcelApp.Run "MainProcedure"
ExcelWbk.Close
ExcelApp.Quit
Set ExcelWbk = Nothing
Set ExcelApp = Nothing

使用此代码,我不再有 ghost xlsm 文件

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多