2016-03-14 66 views
3

我有三本工作簿,一本父母书,一本图书书和一本日志。vba工作簿关闭跳过打开命令之前

父书打开一个图书馆,然后关闭图书馆。巧合的是,图书馆在工作簿中提供了关于打开或关闭时打开和关闭事件时写入日志的规定。

我的问题是,当从父书籍以编程方式打开该库时,会在关闭之前打开日志的代码被跳过。我没有得到任何错误,只是简单地评估了这条线,并没有产生任何结果。

CODE:

从我父母的书,我跑这条线:

... 
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 library.xlsx 
.RunAutoMacros xlAutoClose 
.Close 
End With 

,但有相同的结果,则计算行,然后跳过它。

想法?

+0

都是同一目录中的工作簿?如果不是,则提供文件的完整路径。 – Sorceri

+0

编译器正在跳过该命令,可能是因为您的变量“bypass_close_usage_library”为false。 “usage_library”文件是否已经打开? – OpiesDad

+0

是的,他们都在同一个目录中。重要的是要注意,当从关闭工作簿直接调用backup_exit_size()时,子运行正常;应该打开并关闭日志文件。 – user4467707

回答

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 
+0

感谢您的建议,我不想使用另一个实例,因为我必须在关闭工作表和日志文件之间传递变量。我在运行close例程之前,通过调用带有application.run的宏来找到解决方案。 – user4467707

0

这里是我的解决方案截至目前:

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

这个工作,但可能不理想。

0

我发现这个问题是与application.screenupdating = false固有的。如果在工作簿打开命令之前将其关闭,它就可以正常工作。

+0

你能解释一下为什么会这样,而不是仅仅说明它的作用?备份你的声明。 – yanman1234

+0

我只能猜测。另一个可行的方法是调用工作簿,然后使用application.quit行而不是close。 – Boovember

相关问题