【问题标题】:Getting vba to wait before proceeding让 vba 在继续之前等待
【发布时间】:2017-09-12 14:13:06
【问题描述】:

我需要更新 4 个不同的工作簿,它们都从Bloomberg 收集数据。我尝试构建一个新的工作簿,它将自动打开它们,然后工作簿中的代码将被激活,因为只要工作簿打开,代码就会被激活。但是,我的宏同时打开所有工作簿,并且当它们同时打开时更新花费的时间太长。我尝试使用命令“doevents”和“Application.Wait (Now + TimeValue("0:03:30"))”,但是它们不起作用。我希望他们当时打开一个,然后让特定工作簿中的计算结束,然后再打开下一个工作簿。

这是我的代码:

    Sub UpdateWorkbooks()

    'Quick Financial Longer Series
     Workbooks.Open ("G:\FONDS\Quick financials_Longer Series.xlsb")
     Application.Wait (Now + TimeValue("0:03:30"))

    'Quick Financial
     Workbooks.Open ("G:\FONDS\Quick Financial\Auto\Quick financials.xlsb")
     Application.Wait (Now + TimeValue("0:03:30"))

    'Quick Intra Corr (SX5E)
     Workbooks.Open ("G:\FONDS\Quick Financial\Auto\Quick Intra Corr(SX5E).xlsb")
     Application.Wait (Now + TimeValue("0:03:30"))

    'SPX Sector Correlation
     Workbooks.Open ("G:\FONDS\SPX Sector Correlation.xlsb")
     Application.Wait (Now + TimeValue("0:03:30"))


     Workbooks("UpdateWorkbooks.xlsb").Close savechanges:=True


     End Sub

【问题讨论】:

  • @danieltakeshi 不重复。这专门询问如何使excel打开工作簿,在所述打开的工作簿上执行代码,然后恢复代码。 TimeWait 就是 OP 迄今为止所尝试的。
  • 与其让工作簿通过其工作簿打开事件调用代码,不如通过主工作簿显式调用代码。这样,运行时将自动等待被调用进程完成后再继续。
  • 所以我应该从我的“更新工作簿”模块中调用工作簿的不同代码,而不是让 vba 打开它们?
  • VBA 在单线程上运行,因此Open 将仅从目标工作簿返回一次Workbook_Open()。如果您想加快更新速度,请使用 shell:Shell "excel /e ""C:\files\workbook.xlsm""" 或 CreateObject("WScript.Shell") 在单独的实例中打开每个工作簿。

标签: vba excel


【解决方案1】:

application.calculationstate 在这里可能会有所帮助。将其包装在一个函数中,您甚至可以返回状态,并使用 do until。不确定无限循环的可能性,因此建议也添加一个重试计数器。

 Select Case Application.CalculationState
    Case 0: strCalculationState = "Calculating"
    Case 1: strCalculationState = "Done"
    Case 2: strCalculationState = "Pending"
 End Select

【讨论】:

  • 这会使新工作簿在 vba 执行过程中执行 On Workbook_Open 事件吗?
  • 我不确定该代码的含义,请您解释一下。我认为可以让 vba 打开工作簿,让工作簿中的代码运行,并在计算完成后继续下一个。
  • 最好在调用它的循环中添加DoEvents。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多