2011-12-29 5 views
8

Я запускаю макрос в пустой книге Excel 2007 на ПК с лицензией Bloomberg. Макрос вставляет Bloomberg функции в лист1, которые вытаскивают данные кривой доходности. Результаты некоторых дополнительных функций зависят от первых функций, заканчивающих и правильно отображающих данные Bberg. Когда я перехожу через программу, он отображает только «# N/A Requesting Data». , «. вместо результатов запроса, независимо от того, как медленно я иду. Поскольку некоторые функции зависят от заполняемых результатов строковых и числовых полей, программа обращается к ошибке во время выполнения этого кода. Когда я прекращаю отладку - полностью заканчивая запуск программы, тогда появляются все значения Bberg, которые должны были заполняться. Я хочу, чтобы эти значения отображались во время работы программы.Данные Bloomberg не заполняются до тех пор, пока макрос Excel VBA не завершится

Я попытался использовать комбинацию DoEvents и Application.OnTime(), чтобы вернуть управление операционной системе и заставить программу ждать долгое время для обновления данных, но ни одна из них не работала. Любые идеи были бы полезны. Мой код ниже. wb - это книга на глобальном уровне и ws1 - это рабочий лист глобального уровня.

Public Sub Run_Me()

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

Call Populate_Me 
Call Format_Me 

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

End Sub

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 

Sub жёстко()

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

End Sub

ответ

4

Я гугл для BloombergUI.RefreshAllStaticData и сразу же был доставлен на эту страницу Mr Excel: http://www.mrexcel.com/forum/showthread.php?t=414626

Мы не должны писать ответы, которые только ссылки в случае, если ссылка на него исчезнет, ​​и принимает ответ с ним. Однако я не уверен, что я правильно понимаю вопрос или ответ, чтобы его обобщить.

Ссылка Google, вероятно, будет существовать в обозримом будущем.

Внутри Mr Excel цепочка: MrExcel Message Board> Вопросы по форуму> Вопросы по Excel> Ссылки и макросы Bloomberg.

Ключевая информация, как представляется:

На терминале Bloomberg, если вы наберете в WAPI < GO> вы найдете объявления о API Bloomberg и загружаемые примеры.

Используя информацию справочного файла в этой области, мы можем создать более надежное решение для этого, используя библиотеку типов данных Bloomberg. Перейдите в раздел Инструменты | Ссылки и добавьте ссылку на эту библиотеку. Этот код может быть использован для заполнения ячеек:

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 

После того, как вы опробовали решение г-в Excel, возможно, вы могли бы обновить этот ответ на благо будущих посетителей.

+1

Мне нравится, что вы рекомендуете использовать WAPI, но я не думаю, что он затрагивает оригинальный вопрос, почему таблица BBG этой формулы не вычислять, пока макросы не остановятся. – rex

6

Способ обойти эту проблему состоит в том, чтобы поместить все субтитры и т. Д., Которые вы хотите запустить, после того, как вы поместили данные bloomberg в другой суб. Вы должны делать это каждый раз, когда вы звоните в информацию Bloomberg. Если вы вызовете еще одну подменю в «master» после приложения.OnTime Now + TimeValue («00:00:15»), он не сработает - вы должны поместить все субсайты в новый мастер-юг.

Например: Вместо

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 

Это должно быть

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

Sub Master2() 
OtherSub1 
OtherSub2 
OtherSub3 
End Sub 

Надежда, что помогает

+1

Что вы делаете, когда у вас есть цикл for? – JohnAndrews

+0

Все это просто не работает, когда есть цикл for. – mynameisJEFF

0

Я собрал некоторую информацию со всего Интернета и написал то, что имхо это улучшенная версия по сравнению со всем, что я нашел до сих пор:

Private WaitStartedAt As Double 
Private Const TimeOut As String = "00:02:00" 

Public Function BloomCalc(Callback As String) As Boolean 
    Dim rngStillToReceive As Range 
    Dim StillToReceive As Boolean 
    Dim ws As Worksheet 
    StillToReceive = False 
    If WaitStartedAt = 0 Then 
     WaitStartedAt = TimeValue(Now()) 
    End If 
    If TimeValue(Now()) >= WaitStartedAt + TimeValue(TimeOut) Then 
     GoTo errTimeOut 
    End If 
    For Each ws In ActiveWorkbook.Worksheets 
     Set rngStillToReceive = ws.UsedRange.Find("*Requesting Data*", LookIn:=xlValues) 
     StillToReceive = StillToReceive Or (Not rngStillToReceive Is Nothing) 
    Next ws 
    If StillToReceive Then 
     BloomCalc = False 
     Application.OnTime Now + (TimeSerial(0, 0, 1)), Callback 
    Else 
     WaitStartedAt = 0 
     BloomCalc = True 
    End If 
    Exit Function 
errTimeOut: 
    Err.Raise -1, , "BloomCalc: Timed Out. Callback = " & Callback 
End Function 

Она должна произвольная задача путем вызова к югу, как DoSomething()

Public Sub DoSomething() 
    DoSomethingCallback 
End Function 

Это вызывает функцию «обратного вызова», который будет называться либо до того, как данные были обновлены или лимит времени достиг

Public Sub AutoRunLcbCallback() 
    If BloomCalc("AutoRunLcbCallback") Then 
     MsgBox "Here I can do what I need with the refreshed data" 
     ' for instance I can close and save the workbook 
     ActiveWorkbook.Close True 
    End If 
End Sub 

Прокомментирован любой комментарий. Возможное улучшение может заключаться в том, чтобы позволить рабочей книге и/или рабочему листу быть входом функции, но я действительно не видел необходимости в этом.

Приветствия