VBA - 关闭“ThisWorkbook”,并在延迟

时间:2017-10-31 15:56:46

标签: excel vba excel-vba

我有一个包含宏的工作簿,该工作簿从我们的SharePoint服务器检查工作簿,更新它,然后应该重新检入。之后,它应该保持打开状态以供用户查看并可能执行其他更新。我遇到的主要问题是“.checkin”方法关闭了工作簿,在重新打开工作簿之前终止宏。我在这里找到了一个建议的解决方案:https://stackoverflow.com/a/22380886/8858822,但是我遇到了Application.OnTime如何操作的问题。

如果我尝试使用Application.Workbook.Open过程作为Application.OnTime方法的参数,如上面的链接所示,立即调用.Open过程,而不等待所需的延迟。在这种情况下,工作簿尚未签入和关闭,导致错误:

Sub TestSub()

Dim wb As Workbook
Set wb = ThisWorkbook
Dim FPath As String
FPath = wb.FullName    

Workbooks.CheckOut (FPath)

'''''''''''''''''''''''''
'execute workbook updates
'''''''''''''''''''''''''

Application.DisplayAlerts = False
On Error Resume Next
Application.OnTime Now + TimeValue("00:00:10"), Application.Workbooks.Open(FPath)

wb.CheckIn

Application.DisplayAlerts = True

End Sub

是否有理由立即执行Application.Workbooks.Open(FPath),而不是等待指定的10秒?如果我可以将执行延迟10秒,代码将正确执行。

我注意到如果不是直接打开文件,而是调用文件中的一个宏,它会等待所需的10秒钟。这允许首先检入和关闭文件,然后重新打开它并执行指定的宏。

Sub TestSub()

Dim wb As Workbook
Set wb = ThisWorkbook
Dim FPath As String
FPath = wb.FullName    

Workbooks.CheckOut (FPath)

'''''''''''''''''''''''''
'execute workbook updates
'''''''''''''''''''''''''

Application.DisplayAlerts = False
On Error Resume Next
Application.OnTime Now + TimeValue("00:00:10"), " ' file address & name '!OtherMacroName "

wb.CheckIn

Application.DisplayAlerts = True

End Sub

使用此代码,文件将被签入,关闭,然后在10秒后重新打开文件并运行宏。不幸的是,由于信任中心设置,我相信,我不能直接从我们的SharePoint服务器上保存的工作簿中调用宏,并且此代码会生成权限错误。如果我将文件重定位到我的个人或我们的网络驱动器,它执行没有错误。即使在执行以下操作后,我也无法解决SharePoint权限问题:https://stackoverflow.com/a/21175812/8858822

如果我能理解为什么Application.Workbooks.Open过程立即运行,而宏调用过程等待所需的10秒,当每个是Application.OnTime使用的参数时,我相信代码将按预期工作。如果有一种方法可以在10秒后在关闭的工作簿中调用宏,我认为必须有一些方法可以在10秒后打开工作簿?感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:0)

OnTime将子例程的名称作为其参数。您需要为OnTime创建一个新例程来调用(如果您需要的是重新打开的工作簿,则实际上不需要执行任何操作。)

答案 1 :(得分:0)

  

是否存在Application.Workbooks.Open(FPath)执行的原因   立即,而不是等待指定的10秒?如果我能   延迟执行10秒,代码将正确执行。

是。您链接的答案不正确。

Application.OnTime Now + TimeValue("00:00:10"), SecondArgument

SecondArgument是要调用的子程序的名称。

Application.Workbooks.Open(FPath)放入SecondArgument时,您正在执行的操作是打开工作簿,然后返回对工作簿的引用,就像您前往的那样:

Set wb = Application.Workbooks.Open(FPath)

换句话说,当你这样做时......

Application.OnTime Now + TimeValue("00:00:10"), Application.Workbooks.Open(FPath)

......你实际上是这样做的:

Set wb = Application.Workbooks.Open(FPath)
Application.OnTime Now + TimeValue("00:00:10"), wb

这样可以回答你的问题,但是要解决你的问题...

this link开始,出现了某种肮脏的解决方法,其中关键显然是在之前调用Application.OnTime方法关闭工作簿在您的案例中的工作簿中):

Sub CloseMe()
    Application.OnTime Now + TimeValue("00:00:02"), "OpenMe"
    ThisWorkbook.Close ' check in
End Sub

Sub OpenMe()
    ' literally does nothing
End Sub

所以Excel知道在2秒内运行OpenMe方法'时间,这是尝试运行实际重新打开工作簿的OpenMe方法的行为。

您可以通过使用两个工作簿来测试它:

E:\Documents\Book3.xlsm包含以下代码:

Sub TestMe()

    MsgBox "test"

End Sub

E:\Documents\Book2.xlsm包含以下代码:

Sub OpenAnotherWorkbook()

    Application.Run "'E:\Documents\Book3.xlsm'!TestMe"

End Sub

确保E:\Documents\Book3.xlsm当前已关闭,我们从OpenAnotherWorkbook开始E:\Documents\Book2.xlsm

它会打开E:\Documents\Book3.xlsm并运行TestMe