等到 Excel 使用 VBA 完成填充彭博数据

Wait until Excel finishes populating Bloomberg data using VBA

我有一个 Excel sheet 约 300,000 BDH 公式来下载证券价格。

我要

  1. 打开文件并获取所有价格
  2. 将它们粘贴为值
  3. 保存并关闭文件。

但是,我不知道 Excel 何时完成填充 Bloomberg 数据,因此很难确定执行 2) 和 3) 的时间。

我写了VBA,但不确定是否有效:

Module1

Sub CheckFormulas()
If Application.CalculationState = xlDone Then
    With Worksheets("Sheet1").UsedRange
    .Value = .Value
End With
Else
    Application.OnTime Now + TimeValue("00:30:00"), "CheckFormulas"

ActiveWorkbook.Close Savechanges:=True
End If
End Sub

在'ThisWorkbook'

Private Sub Run()
Call CheckFormulas
End Sub

所以它理论上应该的工作方式是:

  1. 我打开文件
  2. 代码每 30 分钟检查一次是否完成了所有 BDH 公式
  3. 如果完成,则粘贴为值,保存并关闭 4) 如果没有,30 分钟后再次检查。

我想知道这是否是实现我的目标的最佳方式,并且想知道 Application.CalculationState 是否兼容或适用于彭博公式 BDH?

在我们的生产环境中,我们使用一个单元格来检查其公式中是否有带有 "Req" 的单元格:

=SUM(IFERROR(FIND("Req", _range_to_check_with_formulas_ ),0))

在 VBA Sub 中,我们使用 WHILE 循环测试单元格值:

while cell_to_test.value <> 0
    Application.Calculate
    Application.RTD.RefreshData
    DoEvents
Wend

Call _sub_to_do_some_stuff_

基于@stexcec 的回答,因为我不想在工作表中添加测试单元格,所以我使用 VBA 根据值搜索 "requesting"。以下函数用于在包含 Bloomberg 公式的 Range 中查找 "requesting"

Function IsFinished(ws As Worksheet) As Boolean

Dim i, j, LastRow, LastCol As Integer
Dim r, c As Range

LastRow = ws.Range("A1").End(xlDown).Row
LastCol = ws.Range("A1").End(xlToRight).Column

Set r = ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol))
Set c = r.Find("Requesting", LookIn:=xlValues)
If c Is Nothing Then
    IsFinished = True
Else
    IsFinished = False
End If

End Function

然后,类似于@stexcec 的回答,以下代码用于等待所有单元格刷新:

' Wait until updated
Do While True
    Application.Calculate
    Application.RTD.RefreshData
    DoEvents
    If IsFinished(Application.ActiveSheet) Then
        Exit Do
    End If
Loop