关闭前的vba工作簿跳过打开命令

关闭前的vba工作簿跳过打开命令,vba,excel,Vba,Excel,我有三本作业本,一本家长书,一本图书馆书和一本日志 父图书打开一个库,然后关闭该库。巧合的是,该库在工作簿中有一个关于打开和关闭前事件的规定,以便在打开或关闭日志时写入日志 我的问题是,当从父图书以编程方式打开库时,将跳过关闭前打开日志图书的代码。我没有得到任何错误,它只是简单地计算行,并没有产生任何结果 代码: 从我的母书中,我运行以下行: ... Workbooks(parts_library_name).Close savechanges:=True ... Workbooks.

我有三本作业本,一本家长书,一本图书馆书和一本日志

父图书打开一个库,然后关闭该库。巧合的是,该库在工作簿中有一个关于打开和关闭前事件的规定,以便在打开或关闭日志时写入日志

我的问题是,当从父图书以编程方式打开库时,将跳过关闭前打开日志图书的代码。我没有得到任何错误,它只是简单地计算行,并没有产生任何结果

代码:

从我的母书中,我运行以下行:

...
Workbooks(parts_library_name).Close savechanges:=True
...
    Workbooks.Open "somepath\usage_library.xlsx"
在图书中运行此代码的:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set libwkb = ThisWorkbook
'last call to backup usage sheet
backup_exit_size
'exit
End Sub

Sub backup_exit_size()
Dim bypass_close_usage_library As Boolean

Application.DisplayAlerts = False
file_size_at_close = FileLen(ThisWorkbook.Path & "\" & ThisWorkbook.Name)
For Each Workbook In Workbooks
    If Workbook.Name = "usage_library.xlsx" Then bypass_close_usage_library = True
Next
Application.ScreenUpdating = False
If bypass_close_usage_library = False Then
    Workbooks.Open "somepath\usage_library.xlsx"
End If
Workbooks("usage_library.xlsx").Worksheets("usage").Cells(next_row_usage_library, 3) = file_size_at_close
Workbooks("usage_library.xlsx").Close savechanges:=True
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
问题是当它到达这一行时:

...
Workbooks(parts_library_name).Close savechanges:=True
...
    Workbooks.Open "somepath\usage_library.xlsx"
编译器只是跳过命令

然而,只有当我看到另一本书中的beforeClose事件时,情况才会如此。如果从自身关闭日志,宏将正常运行并打开日志

我试过用母书上的一句话,比如

With library.xlsx
 .RunAutoMacros xlAutoClose 
 .Close 
End With
但如果得到相同的结果,它会计算出这条线,然后跳过它


想法?

我看到了同样的行为。我甚至尝试将
与事件一起使用

作为一种解决方法,您可以在Excel的新实例中打开新工作簿:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Dim xlapp As New Excel.Application
    Dim wb As Workbook
    Set wb = xlapp.Workbooks.Open("\\...\test.xlsb")
    xlapp.Visible = True 'This line just proves that it works and can be removed'
    'do stuff
    xlapp.Quit
    Set wb = Nothing
    Set xlapp = Nothing

End Sub

以下是我目前的解决方案:

...
Application.Run (parts_library_name & "!backup_exit_size")
Workbooks(parts_library_name).Close savechanges:=True
...

这是可行的,但可能并不理想。

我已经确定这是应用程序固有的问题。ScreenUpdate=false。如果在工作簿打开命令之前关闭此选项,则效果很好

两个工作簿是否在同一目录中?如果没有,则提供文件的完整路径。编译器跳过该命令可能是因为变量“bypass\u close\u usage\u library”为false。“usage_library”文件是否已打开?是,它们都在同一目录中。重要的是要注意,当直接从关闭工作簿调用backup_exit_size()时,子系统运行良好;按原样打开和关闭日志文件。boo为true,它会计算行,但不会产生任何结果。感谢您的建议,我不想使用其他实例,因为我必须在关闭表和日志文件之间传递变量。在运行关闭例程之前,我通过使用application.run调用宏找到了一个解决方案。您能解释一下为什么这样做,而不仅仅是说明它是这样做的吗?支持你的说法,我只能猜测。另一个有效的方法是调用保存工作簿,然后使用application.quit行而不是close。