VBA工作簿在关闭前跳过打开命令

3
我有三本工作簿,一个父簿,一个库簿和一个日志簿。
父簿打开一个库,然后关闭该库。巧合的是,库簿中有一个功能,当它被打开或关闭时,在打开和关闭之前向日志簿写入内容。
我的问题是,当从父簿以编程方式打开库时,关闭前打开日志簿的代码被跳过。我没有收到任何错误提示,只是简单地计算了该行并没有产生任何结果。
代码:
从我的父簿中,我运行以下代码:
...
Workbooks(parts_library_name).Close savechanges:=True
...

这个代码在图书馆书中运行:

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.Open "somepath\usage_library.xlsx"

编译器会简单地跳过该命令。

但是,如果我到达来自另一本书的beforeClose事件,情况就不同了。如果我从书本本身关闭它,宏将正常运行并成功打开日志书。

我尝试了一个来自父书本的with语句,例如

With library.xlsx
 .RunAutoMacros xlAutoClose 
 .Close 
End With

但是如果有相同的结果,它会评估该行然后跳过它。

您有什么想法?


这两个工作簿是否在同一个目录下?如果不是,请提供文件的完整路径。 - Sorceri
编译器跳过该命令,可能是因为您的变量“bypass_close_usage_library”为false。 “usage_library”文件已经打开了吗? - OpiesDad
是的,它们都在同一个目录中。需要注意的是,当直接从关闭工作簿调用backup_exit_size()时,子程序可以正常运行;它会像应该做的那样打开和关闭日志文件。 - user4467707
布尔值为真,它评估了该行但没有产生结果。 - user4467707
3个回答

1
我看到了相同的行为。我甚至尝试使用 WithEvents
作为一种解决方法,您可以在新的 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调用宏来找到了解决方案。 - user4467707

0

这是我目前的解决方案:

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

这个方法可以工作,但可能不是最理想的。


0

我已经确定问题在于应用程序.screenupdating = false。如果您在工作簿打开命令之前关闭它,它就可以正常工作。


你能解释一下为什么这个代码可行吗?而不是简单地说它可以运行。请提供支持您观点的证据。 - yanman1234
我只能猜测。另一种可行的方法是调用工作簿进行保存,然后使用application.quit行而不是close。 - Boovember

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接