我想知道在VBA代码中是否有办法强制使用bloomberg函数(在电子表格中)更新其值(任何BDH函数)
定位开发人员面临类似问题/拥有彭博终端
我尝试了什么 -
Application.RTD.RefreshData
Application.RTD.throttleInterval = 0
Application.CalculateFull
BDH功能不会重新加载。
我现在可以刷新它们的唯一方法是:单击BloomBerg加载项功能区上的“刷新工作簿”按钮。
由于Bloomberg加载项在VBE中被锁定,我无法找到必要的代码。 我错过了任何彭博参考吗?任何彭博专家/用户都能指出我正确的方向吗?谢谢。
答案 0 :(得分:6)
我在xla中搜索了关键字“refresh”,在记事本中打开它。找到了以下目标:
RefreshAllWorkbooks
blpmain.xla!RefreshAllStaticData
blpmain.xla!'RefreshWorkbookFundamentalsData
blp.xla!IsBlpRefreshAvailable
我一个接一个地试了一下, 前两个作品通过调用:
Application.run "RefreshAllWorkbooks"
Application.run "RefreshAllStaticData"
但不要单独调用它们(我想这是因为我可以使用Application.run以某种方式调用受保护的PUBLIC过程)
RefreshAllWorkbooks
或
RefreshAllStaticData
感谢所有帮助
答案 1 :(得分:1)
我从来没有设法做你要求的。我发现获取最新数据的唯一可靠方法是直接从VBA调用API BLP_DATA_CTRLLib.BlpData
,等待答案,并将结果放入工作表。
关于打开受密码保护的VBA代码,google或stackoverflow搜索应该会给你答案。
答案 2 :(得分:1)
我发现改变BDH公式中的某些内容会导致刷新。查找并替换=
符号即可。
Public Sub Recalc()
Dim ws As Worksheet, FormulaCells As Range, c As Range
Application.Calculation = xlCalculationManual
For Each ws In ThisWorkbook.Worksheets
On Error Resume Next
ws.Activate
Set FormulaCells = ws.UsedRange.SpecialCells(xlCellTypeFormulas).Cells
If Err = 0 Then
For Each c In FormulaCells
c.Formula = Replace(c.Formula, "=", "=")
Next 'c
Else
Err.Clear
End If
Next 'ws
Application.Calculation = xlCalculationAutomatic
End Sub
答案 3 :(得分:0)
这对我有用:
WS.Select
WS.Range("A5").Select 'the cell that contains the BDH function
Application.Run "RefreshCurrentSelection"
答案 4 :(得分:0)
我最近从 bbg chat 收到了这个答案。我想这就是我们都在寻找的......
bbg 帮助台:通常我们不会在帮助台上提供有关 VBA 的帮助,但我找到了以下内容。 您可以使用以下 VBA 命令来刷新 BDx() 公式:
Refresh based on default option setting: Application.Run "RefreshData"
Refresh current selection: Application.Run "RefreshCurrentSelection"
Refresh current worksheet: Application.Run "RefreshEntireWorksheet"
Refresh current workbook: Application.Run "RefreshEntireWorkbook"
Refresh all workbooks: Application.Run "RefreshAllWorkbooks"
注意:使用 VBA 宏刷新彭博公式时, 当触发刷新的宏正在运行时,公式无法完成请求数据。 您必须使用 Application.OnTime() 安排第二个函数在触发刷新的子例程退出后运行。 以下代码片段演示了用于刷新所有工作簿的 VBA 代码,然后在调用 processSheet 子例程之前延迟 10 秒:
Sub refreshSheet()
Application.Run "RefreshEntireWorksheet"
Application.OnTime (Now + TimeValue("00:00:10")), "processSheet"
End Sub
Sub processSheet()
' perform processing here
End Sub