等到 Excel 使用 VBA 完成填充彭博数据
Wait until Excel finishes populating Bloomberg data using VBA
我有一个 Excel sheet 约 300,000 BDH 公式来下载证券价格。
我要
- 打开文件并获取所有价格
- 将它们粘贴为值
- 保存并关闭文件。
但是,我不知道 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
所以它理论上应该的工作方式是:
- 我打开文件
- 代码每 30 分钟检查一次是否完成了所有 BDH 公式
- 如果完成,则粘贴为值,保存并关闭 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
我有一个 Excel sheet 约 300,000 BDH 公式来下载证券价格。
我要
- 打开文件并获取所有价格
- 将它们粘贴为值
- 保存并关闭文件。
但是,我不知道 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
所以它理论上应该的工作方式是:
- 我打开文件
- 代码每 30 分钟检查一次是否完成了所有 BDH 公式
- 如果完成,则粘贴为值,保存并关闭 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