【发布时间】: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以提高效率。