2011-12-29 70 views
8

我在具有彭博許可證的PC上的空白Excel 2007工作簿中運行宏。宏將Bloomberg函數插入到可以提取收益率曲線數據的sheet1中。一些附加功能的結果取決於第一個功能,即完成並正確顯示Bberg數據。當我瀏覽程序時,它只顯示'#N/A申請數據。 。 「。而不管查詢結果如何,不管我走得有多慢。由於某些函數依賴於字符串和數字字段結果的填充,程序在該代碼處遇到運行時錯誤。當我停止調試時 - 完全結束運行程序 - 所有應該填充的Bberg值隨即出現。我希望這些值在程序仍在運行時出現。直到Excel VBA宏結束爲止,彭博數據纔會填充

我試過使用DoEvents和Application.OnTime()的組合來返回控制權給操作系統,並讓程序等待數據更新很長時間,但都沒有成功。任何想法都會有所幫助。我的代碼如下。 wb是一個全球級工作簿,ws1是一個全球級工作表。

公用Sub Run_Me()

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

Call Populate_Me 
Call Format_Me 

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

結束子

私人小組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 

子硬編碼()

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

結束子

回答

4

我用Google搜索BloombergUI.RefreshAllStaticData,並立即被送往這個Excel先生頁:http://www.mrexcel.com/forum/showthread.php?t=414626

我們不應該交的答案這是在的情況下鏈接消失,需要答案與它只是鏈接。但是,我不確定我是否理解了這個問題或答案,以便對其進行總結。

谷歌鏈接可能存在的可預見的未來。

在Mr Excel中,鏈條是:MrExcel留言板>問題論壇> Excel問題>彭博社鏈接和宏。

的關鍵信息似乎是:如果你在WAPI < GO輸入

在您的彭博終端>你會發現彭博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 

一旦你已經嘗試了Excel中先生的解決方案,也許你可以更新這個答案對未來遊客的利益。

+1

我喜歡你推薦使用WAPI,但我不認爲它解決了原來的問題,爲什麼電子表格BBG公式的不計算,直到宏停止運行。 – rex 2014-08-08 06:26:16

6

解決此問題的一種方法是在將bloomberg數據拉入不同的子元素後,將所有要運行的子元素等。您每次撥打彭博信息時都必須這樣做。如果您在應用程序之後在「主」子部分中調用另一個子部分。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 2017-04-28 11:34:58

+0

當有for循環時,整個事情就不起作用。 – mynameisJEFF 2017-12-11 12:51:41

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 

任何意見表示讚賞。一個可能的改進可能是允許工作簿和/或工作表成爲函數的輸入,但我真的沒有看到需要這樣做。

乾杯