更新工作表后刷新BDH。彭博。 VBA

时间:2016-01-29 10:50:29

标签: excel vba bloomberg

我看到这里有一些旧的东西,但我希望有人找到了新的解决方案。

使用我的例程,我更新3个工作簿中的日期,以便BDH命令获得最新价格,然后我将这3个工作簿中的结果复制到单独的摘要工作簿中。然而,显而易见的是,BDH功能即使在那里暂停后也不会刷新/更新。

在复制粘贴到结果表之前,有关刷新或重新请求BDH命令的最新发现是什么?

===========

Twenty.Worksheets("Portfolio_2016").Activate
[K3].Value = TradeDay
[L3].Value = PrevTradeDay

'Japan.Worksheets("Portfolio_2016").Activate
'[K3].Value = TradeDay
'[L3].Value = PrevTradeDay

'AAR.Worksheets("Portfolio_2016").Activate
'[K3].Value = TradeDay
'[L3].Value = PrevTradeDay

Call RefreshStaticLinks

End Sub

Public Sub RefreshStaticLinks()

Call Twenty.Worksheets("Portfolio_2016").Range("K7:Q26").Select
Call Application.Run("RefreshCurrentSelection")
Call Application.OnTime(Now + TimeValue("00:00:01"), "ProcessData")

End Sub

Private Sub ProcessData()

Dim c As Range

For Each c In Selection.Cells
    If c.Value = "#N/A Requesting Data..." Then
        Call Application.OnTime(Now + TimeValue("00:00:01"), "ProcessData")
        Exit Sub
    End If
Next c

Call CopyPaste

End Sub

1 个答案:

答案 0 :(得分:4)

您需要使用Application.OnTime来实现此目的。当宏暂停时,Bloomberg公式不会更新。彭博的WAPI常见问题解答部分有一些例子。以下是从那里您可以找到示例电子表格。

[下载示例!在这里下载一个有效的Excel VBA示例] 任何BDx()函数系列返回的数据都是异步方式。因此,如果您的Excel VBA应用程序[宏]依赖于返回的Bloomberg数据,我们建议您将以下逻辑合并到VBA代码中,这将基本上暂停您的应用程序,同时在Excel单元格中填充数据:

Option Explicit
Private Const MAXROWS = 25

Sub fillFormula()

Range("B2:B" & MAXROWS).Clear
Range("B2").Formula = "=BDP($A2,B$1)"
Range("B2").AutoFill Range("B2:B" & MAXROWS), xlFillDefault
checkStatus

End Sub

Sub checkStatus()

Dim i

For i = 2 To MAXROWS

' Check to make sure that the cells are NOT requesting data 
If "#N/A Requesting Data..." = Cells(i, 2) Then

Application.OnTime (Now + TimeValue("00:00:02")), "checkStatus"
Exit Sub

End If

Next i

MsgBox "We just finished getting the values"
' Add code here that would process the data now that it's updated

End Sub

以上代码可以添加到空白模块中,以下代码将添加到click事件处理程序中,例如,工作表上的按钮: fillFormula