在Excel VBA宏完成之前,Bloomberg数据不会填充

Dia*_*ini 10 excel vba excel-2007 excel-vba bloomberg

我在具有Bloomberg许可证的PC上的空白Excel 2007工作簿中运行宏.宏将Bloomberg函数插入到sheet1中,以获取收益率曲线数据.一些附加功能的结果取决于完成和正确显示Bberg数据的第一个功能.当我单步执行程序时,它只显示'#N/A请求数据..".而不是查询的结果,无论我走得多慢.由于某些函数依赖于填充的字符串和数字字段结果,因此程序会在该代码处遇到运行时错误.当我停止调试 - 完全结束运行程序 - 然后出现应该填充的所有Bberg值.我希望在程序仍在运行时显示这些值.

我尝试使用DoEvents和Application.OnTime()的组合将控制权返回给操作系统,并使程序等待很长时间进行数据更新,但都没有工作.任何想法都会有所帮助.我的代码如下. wb是一个全局级工作簿,ws1是一个全局级工作表.

Public Sub Run_Me()

Public Sub Run_Me()

    'Application.DisplayAlerts = False
    'Application.ScreenUpdating = False

    Call Populate_Me
    Call Format_Me

    'Application.DisplayAlerts = True
    'Application.ScreenUpdating = True

End Sub
Run Code Online (Sandbox Code Playgroud)

结束子

Private Sub Populate_Me()

Private Sub Populate_Me()

    Dim lRow_PM As Integer
    Dim xlCalc As XlCalculation

    Set wb = ThisWorkbook
    Set ws1 = wb.Sheets(1)

    'clear out any values from previous day
    If wb.Sheets(ws1.Name).Range("A1").Value <> "" Then
        wb.Sheets(ws1.Name).Select
        Selection.ClearContents
    End If


    xlCalc = Application.Calculation
    Application.Calculation = xlCalculationAutomatic

    Range("A1").Value = "F5"
    Range("B1").Value = "Term"
    Range("C1").Value = "PX LAST"

    Range("A2").Select
    ActiveCell.FormulaR1C1 = "=BDS(""YCCF0005 Index"",""CURVE_MEMBERS"",""cols=1;rows=15"")"
    BloombergUI.RefreshAllStaticData

    Range("B2").Select
    ActiveCell.FormulaR1C1 = "=BDS(""YCCF0005 Index"",""CURVE_TERMS"",""cols=1;rows=15"")"
    BloombergUI.RefreshAllStaticData

    Application.OnTime Now + TimeValue("00:00:10"), "HardCode"

    '******more code*******'
    End Sub
Run Code Online (Sandbox Code Playgroud)

Sub HardCode()

Sub HardCode()

    Range("C2").Select
    ActiveCell.FormulaR1C1 = "=BDP($A2,C$1)"
    BloombergUI.RefreshAllStaticData

End Sub
Run Code Online (Sandbox Code Playgroud)

结束子

小智 6

解决这个问题的一种方法是在将bloomberg数据拉入另一个子数据库之后放置您想要运行的所有子类.每次拨打彭博信息时都必须这样做.如果在Application.OnTime Now + TimeValue("00:00:15")之后调用"master"子中的另一个sub,它将失败 - 您必须将所有子跟随放入新的master子.

例如:而不是

Sub Master1()
Application.Run "RefreshAllStaticData"
Application.OnTime Now + TimeValue("00:00:15"), "OtherSub1"
'This will cause the Bloomberg Data to not refresh until OtherSub2 and 3 have run
OtherSub2
OtherSub3
End Sub
Run Code Online (Sandbox Code Playgroud)

它应该是

Sub Master1()
Application.Run "RefreshAllStaticData"
Application.OnTime Now + TimeValue("00:00:15"), "Master2"
End Sub

Sub Master2()
OtherSub1
OtherSub2
OtherSub3
End Sub
Run Code Online (Sandbox Code Playgroud)

希望有所帮助

  • 当你有一个for循环时你做什么? (2认同)

Ton*_*ore 5

我在Google上搜索了BloombergUI.RefreshAllStaticData,并立即转到该Mr Excel页面:http ://www.mrexcel.com/forum/showthread.php?t=414626

我们不应该发布答案,它们仅是链接的情况,以防链接消失并带上答案。但是,我不确定我是否足够理解问题或答案以进行总结。

在可预见的将来,Google链接可能会存在。

在Excel先生内,链为:MrExcel留言板>问题论坛> Excel问题>彭博链接和宏。

关键信息似乎是:

在Bloomberg终端上,如果键入WAPI <GO>,则会找到Bloomberg API的列表和可下载的示例。

使用该区域的帮助文件信息,我们可以使用彭博数据类型库为此构建更强大的解决方案。转到工具| 参考并添加对此库的参考。然后可以使用以下代码填充单元格:

Sub Test2()
    Dim vResults, vSecurities, vFields
    Dim objBloomberg As BLP_DATA_CTRLLib.BlpData

    'fill our arrays - must be 1 dimension so we transpose from the worksheet
    With Application.WorksheetFunction
        vSecurities = .Transpose(Sheet1.Range("B2:B4").Value)
        vFields = .Transpose(.Transpose(Range("C1:H1").Value))
    End With

    Set objBloomberg = New BLP_DATA_CTRLLib.BlpData
    objBloomberg.AutoRelease = False

    objBloomberg.Subscribe _
            Security:=vSecurities, _
            cookie:=1, _
            Fields:=vFields, _
            Results:=vResults

    Sheet1.Range("C2:H4").Value = vResults
End Sub
Run Code Online (Sandbox Code Playgroud)

一旦您试用了Excel先生的解决方案,也许您就可以更新此答案,以便将来的访问者受益。