【发布时间】:2017-11-01 03:24:50
【问题描述】:
我有一个包含宏的工作簿,该宏从我们的 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 秒后打开工作簿?感谢您的时间和帮助。
【问题讨论】:
-
它不会解决您遇到的问题,但请确保当
ThisWorkbook关闭时,您的Application不会关闭。如果是这样,您的Application.OnTime将不会运行,因为主机进程 (Application) 已完成。