10

Bloomberg ライセンスを持つ PC で、空白の Excel 2007 ワークブックでマクロを実行しています。マクロは、利回り曲線データを取得するブルームバーグ関数をシート 1 に挿入します。一部の追加関数の結果は、最初の関数が終了して Bberg データを正しく表示するかどうかに依存します。プログラムを実行すると、「#N/A Requesting Data」のみが表示されます。. .' どんなにゆっくり行っても、クエリの結果の代わりに。一部の関数は、入力される文字列および数値フィールドの結果に依存するため、プログラムはそのコードで実行時エラーを検出します。デバッグを停止すると (プログラムの実行を完全に終了すると)、入力されているはずのすべての Bberg 値が表示されます。プログラムの実行中にこれらの値が表示されるようにします。

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 HardCode()

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

End Sub
4

4 に答える 4

5

BloombergUI.RefreshAllStaticData をグーグル検索したところ、すぐにこの Mr Excel ページに移動しました: http://www.mrexcel.com/forum/showthread.php?t=414626

リンクが消えて回答を取得した場合に備えて、リンクのみの回答を投稿することは想定されていません。ただし、質問または回答を要約するのに十分なほど十分に理解しているかどうかはわかりません。

Google リンクは、おそらく当面の間存在するでしょう。

Mr Excel 内のチェーンは、MrExcel Message Board > Question Forums > Excel Questions > Bloomberg links and macro です。

重要な情報は次のようです。

ブルームバーグ ターミナルで 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 氏のソリューションを試したら、将来の訪問者のためにこの回答を更新することができます。

于 2011-12-29T21:51:52.763 に答える
2

私はウェブ全体からいくつかの情報を収集し、これまでに見つけたすべてのものと比較して、私見が改善されたバージョンであることを書きました。

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

どんなコメントでも大歓迎です。可能な改善は、ワークブックやワークシートを関数の入力にできるようにすることかもしれませんが、その必要性は本当にわかりませんでした。

乾杯

于 2015-12-23T12:59:57.533 に答える