【问题标题】:VBA - Close "ThisWorkbook", and re-open after DelayVBA - 关闭“ThisWorkbook”,并在延迟后重新打开
【发布时间】: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) 已完成。

标签: vba excel


【解决方案1】:

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

【讨论】:

  • 谢谢。我遇到了一个我认为与它是我们的 SharePoint 服务器上的文件有关的问题。它成功打开文件,但随后生成一条错误消息,指出宏无法运行,或者不存在,或者所有宏都被禁用。当文件保存在本地时没有问题。有没有打开工作簿的替代方法,或者至少抑制警告?正常的 Application.DisplayAlerts 方法似乎在 .OnTime 调用之前或在被调用的子例程中设置它都不起作用,因为 excel 在输入之前会返回错误。
【解决方案2】:

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 当前关闭,我们从E:\Documents\Book2.xlsm 运行OpenAnotherWorkbook

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多