我有一个包含宏的工作簿,该工作簿从我们的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秒后打开工作簿?感谢您的时间和帮助。
答案 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
。