簡體   English   中英

等到 Excel 完成使用 VBA 填充彭博數據

[英]Wait until Excel finishes populating Bloomberg data using VBA

我有一個包含 ~300,000 BDH 公式的 Excel 表格來下載證券價格。

我想要

  1. 打開文件並獲取所有價格
  2. 將它們粘貼為值
  3. 保存並關閉文件。

但是,我不知道 Excel 何時完成填充彭博數據,因此很難確定執行 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

在“本工作簿”中

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 LOOP 測試單元格值:

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

Call _sub_to_do_some_stuff_

基於@stexcec 的回答,因為我不想在工作表中添加測試單元格,所以我使用 VBA 根據值搜索"requesting" 以下函數用於在包含彭博公式的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM