2016-06-01 31 views
1

未確定債券タイプの既知のCUSIP(企業、財務省、住宅ローンまたは資産の可能性があります)のSECURITY_DESフィールド値をプルダウンしようとしています - バック、等)。私は宣言されたバリアントを使用して、ブルームバーグの返答を返します。これは、リクエストの構造に関係なく、「#N/A Sec」を表示しています。ブルームバーグVBA - CUSIP入力用に "#N/A Sec"を返す

私はこれをExcel内で実行しており、「Bloomberg Data Type Library」のリファレンスが追加されています。私は以下のコードを貼り付けます。私はCUSIPを/ CUSIP/xxxxxxxxx、xxxxxxxxx CUSIP、IDxxxxxxxxxのようにフォーマットしてみました。私は書式設定支援のためにグーグルを試みましたが、私にはうまくいっている一致する議論を見つけるのに問題がありました。

 Dim BloombergModule As BlpData 
     Set BloombergModule = New BlpData 
     Dim BloombergReturnData As Variant 
     Dim BloombergFields(0) As String 
     ' Prepare request for the SECURITY_DES field, "Security Description"... 
     BloombergFields(0) = "SECURITY_DES" 
     BloombergReturnData = BloombergModule.BLPSubscribe([CUSIP], BloombergFields) 

上記の最後の行の直後にブレークポイントを配置しました。私がBloombergReturnData変数を見ると、BloombergReturnData(0,0)式の "#N/A Sec"が表示されます。これは "#N/A Sec"の代わりに返されるセキュリティの実際の記述でのみです。

まだ捕まっていないのであれば、私は貿易によってプログラマーではなく、最近ブルームバーグとVBAを使ってオフィス周辺のギャップを埋めています。私が読んだことに基づいて、私は固定所得タイプ(Corp、Govt、Mtgeなど)を渡さなければならないと思うが、私は現在のデータセット内でそのことを知らず、何とかそれを追跡しなければならないだろう。

ブルームバーグのGUIを使用して、セキュリティのためにメインメニューに到達するために「IDxxxxxxxxx」(xはCUSIPを表す)を入力できます。ここで

は、いくつかのサンプルCUSIPsです: 428236BR3、 500255AV6、 912828UE8、 49126PET3、 912828SC5、 912828MS6、 02225AFW7

は、どのように私はブルームバーグからのセキュリティの説明を返すために、私のBLPSubscribe要求をフォーマットします首尾よく?



EDIT:これは回答されています。私はBloombergがもはやサポートしていない古いリファレンスと構造を使用していました。 MikaelKatajamäkiが投稿したブログ記事の情報を使用して、私は更新されたリファレンス( "Bloomberg API COM 3.5タイプライブラリ")とセキュリティ名フォーマット "/ cusip/xxxxxxxxx"を使用して呼び出しを再構成しました。更新されたコード(あなたはコピーこの構造に予定の場合は、ミカエルKatajamäkiのブログ記事からのクラスモジュールが必要になります心に留めておく)以下である:

 ' BCOM_wrapper is from Mikael Katajamäki's Bloomberg Class Module 
     Dim BloombergModule As BCOM_wrapper 
     Set BloombergModule = New BCOM_wrapper 
     Dim BloombergReturnData As Variant 
     Dim BloombergFields(0) As Variant 
     Dim BloombergSecurities(0) As Variant 
     Dim SecurityDescription As String 
     ' Prepare request for the SECURITY_DES field, "Security Description"... 
     BloombergFields(0) = "SECURITY_DES" 
     BloombergSecurities(0) = ("/cusip/" & CStr(SQLResults![CUSIP])) 
     ' getData() is from Mikael Katajamäki's Bloomberg Class Module 
     BloombergReturnData = BloombergModule.getData(REFERENCE_DATA, BloombergSecurities, BloombergFields) 

     ' I used an absolute reference to the (0,0) slot since the nature of my use here is always just a single security 
     SecurityDescription = BloombergReturnData(0, 0) 

     Range("D" & CStr(Right(Target.Address, 2))).Value = SecurityDescription 

ミカエルKatajamäkiのブログポスト:ミカエルのhttp://mikejuniperhill.blogspot.com/2013/06/bloomberg-v3com-api-wrapper-update-for.html

アーカイブKatajamäkiのクラスモジュール(これはルールに反していると私は削除されます場合は私に連絡してください):

Option Explicit 
' 
' public enumerator for request type 
Public Enum ENUM_REQUEST_TYPE 
    REFERENCE_DATA = 1 
    HISTORICAL_DATA = 2 
    BULK_REFERENCE_DATA = 3 
End Enum 
' 
' constants 
Private Const CONST_SERVICE_TYPE As String = "//blp/refdata" 
Private Const CONST_REQUEST_TYPE_REFERENCE As String = "ReferenceDataRequest" 
Private Const CONST_REQUEST_TYPE_BULK_REFERENCE As String = "ReferenceDataRequest" 
Private Const CONST_REQUEST_TYPE_HISTORICAL As String = "HistoricalDataRequest" 
' 
' private data structures 
Private bInputSecurityArray() As Variant 
Private bInputFieldArray() As Variant 
Private bOutputArray() As Variant 
' 
' BCOM objects 
Private bSession As blpapicomLib2.Session 
Private bService As blpapicomLib2.Service 
Private bRequest As blpapicomLib2.REQUEST 
Private bSecurityArray As blpapicomLib2.Element 
Private bFieldArray As blpapicomLib2.Element 
Private bEvent As blpapicomLib2.Event 
Private bIterator As blpapicomLib2.MessageIterator 
Private bIteratorData As blpapicomLib2.Message 
Private bSecurities As blpapicomLib2.Element 
Private bSecurity As blpapicomLib2.Element 
Private bSecurityName As blpapicomLib2.Element 
Private bSecurityField As blpapicomLib2.Element 
Private bFieldValue As blpapicomLib2.Element 
Private bSequenceNumber As blpapicomLib2.Element 
Private bFields As blpapicomLib2.Element 
Private bField As blpapicomLib2.Element 
Private bDataPoint As blpapicomLib2.Element 
' 
' class non-object data members 
Private bRequestType As ENUM_REQUEST_TYPE 
Private bNumberOfDataPoints As Long 
Private bCalendarType As String 
Private bFrequency As String 
Private bMaxDataPoints As Long 
Private bStartDate As String 
Private bEndDate As String 
Private nSecurities As Long 
Private nSecurity As Long 
' 
Public Function getData(ByVal requestType As ENUM_REQUEST_TYPE, _ 
ByRef securities() As Variant, ByRef fields() As Variant, _ 
Optional ByVal calendarType As String, Optional ByVal dataFrequency As String, _ 
Optional ByVal startDate As Date, Optional ByVal endDate As Date) As Variant() 
    ' 
    bRequestType = requestType 
    bInputSecurityArray = securities 
    bInputFieldArray = fields 
    ' 
    If (bRequestType = ENUM_REQUEST_TYPE.HISTORICAL_DATA) Then 
     ' 
     bCalendarType = calendarType 
     bFrequency = dataFrequency 
     ' 
     If ((startDate = CDate(0)) Or (endDate = CDate(0))) Then _ 
      Err.Raise vbObjectError, "Bloomberg API", "Input parameters missing for historical data query" 
     bStartDate = convertDateToBloombergString(startDate) 
     bEndDate = convertDateToBloombergString(endDate) 
    End If 
    ' 
    openSession 
    sendRequest 
    catchServerEvent 
    releaseObjects 
    getData = bOutputArray 
End Function 
' 
Private Function openSession() 
    ' 
    Set bSession = New blpapicomLib2.Session 
    bSession.Start 
    bSession.OpenService CONST_SERVICE_TYPE 
    Set bService = bSession.GetService(CONST_SERVICE_TYPE) 
End Function 
' 
Private Function sendRequest() 
    ' 
    Select Case bRequestType 
     Case ENUM_REQUEST_TYPE.HISTORICAL_DATA 
      ReDim bOutputArray(0 To UBound(bInputSecurityArray, 1), 0 To 0) 
      Set bRequest = bService.CreateRequest(CONST_REQUEST_TYPE_HISTORICAL) 
      bRequest.Set "periodicityAdjustment", bCalendarType 
      bRequest.Set "periodicitySelection", bFrequency 
      bRequest.Set "startDate", bStartDate 
      bRequest.Set "endDate", bEndDate 
      ' 
     Case ENUM_REQUEST_TYPE.REFERENCE_DATA 
      Dim nSecurities As Long: nSecurities = UBound(bInputSecurityArray) 
      Dim nFields As Long: nFields = UBound(bInputFieldArray) 
      ReDim bOutputArray(0 To nSecurities, 0 To nFields) 
      ' 
      Set bRequest = bService.CreateRequest(CONST_REQUEST_TYPE_REFERENCE) 
      ' 
     Case ENUM_REQUEST_TYPE.BULK_REFERENCE_DATA 
      ReDim bOutputArray(0 To UBound(bInputSecurityArray, 1), 0 To 0) 
      Set bRequest = bService.CreateRequest(CONST_REQUEST_TYPE_BULK_REFERENCE) 
      ' 
    End Select 
    ' 
    Set bSecurityArray = bRequest.GetElement("securities") 
    Set bFieldArray = bRequest.GetElement("fields") 
    appendRequestItems 
    bSession.sendRequest bRequest 
End Function 
' 
Private Function appendRequestItems() 
    ' 
    Dim nSecurities As Long: nSecurities = UBound(bInputSecurityArray) 
    Dim nFields As Long: nFields = UBound(bInputFieldArray) 
    Dim i As Long 
    Dim nItems As Integer: nItems = getMax(nSecurities, nFields) 
    For i = 0 To nItems 
     If (i <= nSecurities) Then bSecurityArray.AppendValue CStr(bInputSecurityArray(i)) 
     If (i <= nFields) Then bFieldArray.AppendValue CStr(bInputFieldArray(i)) 
    Next i 
End Function 
' 
Private Function catchServerEvent() 
    ' 
    Dim bExit As Boolean 
    Do While (bExit = False) 
     Set bEvent = bSession.NextEvent 
     If (bEvent.EventType = PARTIAL_RESPONSE Or bEvent.EventType = RESPONSE) Then 
      ' 
      Select Case bRequestType 
       Case ENUM_REQUEST_TYPE.REFERENCE_DATA: getServerData_reference 
       Case ENUM_REQUEST_TYPE.HISTORICAL_DATA: getServerData_historical 
       Case ENUM_REQUEST_TYPE.BULK_REFERENCE_DATA: getServerData_bulkReference 
      End Select 
      ' 
      If (bEvent.EventType = RESPONSE) Then bExit = True 
     End If 
    Loop 
End Function 
' 
Private Function getServerData_reference() 
    ' 
    Set bIterator = bEvent.CreateMessageIterator 
    Do While (bIterator.Next) 
     Set bIteratorData = bIterator.Message 
     Set bSecurities = bIteratorData.GetElement("securityData") 
     Dim offsetNumber As Long, i As Long, j As Long 
     nSecurities = bSecurities.Count 
     ' 
     For i = 0 To (nSecurities - 1) 
      Set bSecurity = bSecurities.GetValue(i) 
      Set bSecurityName = bSecurity.GetElement("security") 
      Set bSecurityField = bSecurity.GetElement("fieldData") 
      Set bSequenceNumber = bSecurity.GetElement("sequenceNumber") 
      offsetNumber = CInt(bSequenceNumber.Value) 
      ' 
      For j = 0 To UBound(bInputFieldArray) 
       If (bSecurityField.HasElement(bInputFieldArray(j))) Then 
        Set bFieldValue = bSecurityField.GetElement(bInputFieldArray(j)) 
        ' 
        If (bFieldValue.DataType = BLPAPI_INT32) Then 
         bOutputArray(offsetNumber, j) = VBA.CLng(bFieldValue.Value) 
        Else 
         bOutputArray(offsetNumber, j) = bFieldValue.Value 
        End If 
       End If 
      Next j 
     Next i 
    Loop 
End Function 
' 
Private Function getServerData_bulkReference() 
    ' 
    Set bIterator = bEvent.CreateMessageIterator 
    nSecurity = nSecurity + 1 
    ' 
    Do While (bIterator.Next) 
     Set bIteratorData = bIterator.Message 
     Set bSecurities = bIteratorData.GetElement("securityData") 
     Dim offsetNumber As Long, i As Long, j As Long 
     Dim nSecurities As Long: nSecurities = bSecurities.Count 
     ' 
     Set bSecurity = bSecurities.GetValue(0) 
     Set bSecurityField = bSecurity.GetElement("fieldData") 
     ' 
     If (bSecurityField.HasElement(bInputFieldArray(0))) Then 
      Set bFieldValue = bSecurityField.GetElement(bInputFieldArray(0)) 
      ' 
      If ((bFieldValue.NumValues - 1) > UBound(bOutputArray, 2)) Then _ 
       ReDim Preserve bOutputArray(0 To UBound(bOutputArray, 1), 0 To bFieldValue.NumValues - 1) 
      ' 
      For i = 0 To bFieldValue.NumValues - 1 
       Set bDataPoint = bFieldValue.GetValue(i) 
       bOutputArray(nSecurity - 1, i) = bDataPoint.GetElement(0).Value 
      Next i 
     End If 
    Loop 
End Function 
' 
Private Function getServerData_historical() 
    ' 
    Set bIterator = bEvent.CreateMessageIterator 
    Do While (bIterator.Next) 
     Set bIteratorData = bIterator.Message 
     Set bSecurities = bIteratorData.GetElement("securityData") 
     Dim nSecurities As Long: nSecurities = bSecurityArray.Count 
     Set bSecurityField = bSecurities.GetElement("fieldData") 
     Dim nItems As Long, offsetNumber As Long, nFields As Long, i As Long, j As Long 
     nItems = bSecurityField.NumValues 
     If (nItems = 0) Then Exit Function 
     If ((nItems > UBound(bOutputArray, 2))) Then _ 
      ReDim Preserve bOutputArray(0 To nSecurities - 1, 0 To nItems - 1) 
     ' 
     Set bSequenceNumber = bSecurities.GetElement("sequenceNumber") 
     offsetNumber = CInt(bSequenceNumber.Value) 
     ' 
     If (bSecurityField.Count > 0) Then 
      For i = 0 To (nItems - 1) 
       ' 
       If (bSecurityField.Count > i) Then 
        Set bFields = bSecurityField.GetValue(i) 
        If (bFields.HasElement(bFieldArray(0))) Then 
         ' 
         Dim d(0 To 1) As Variant 
         d(0) = bFields.GetElement(0).GetValue(0) 
         d(1) = bFields.GetElement(1).GetValue(0) 
         bOutputArray(offsetNumber, i) = d 
        End If 
       End If 
      Next i 
     End If 
    Loop 
End Function 
' 
Private Function releaseObjects() 
    ' 
    Set bFieldValue = Nothing 
    Set bSequenceNumber = Nothing 
    Set bSecurityField = Nothing 
    Set bSecurityName = Nothing 
    Set bSecurity = Nothing 
    Set bSecurities = Nothing 
    Set bIteratorData = Nothing 
    Set bIterator = Nothing 
    Set bEvent = Nothing 
    Set bFieldArray = Nothing 
    Set bSecurityArray = Nothing 
    Set bRequest = Nothing 
    Set bService = Nothing 
    bSession.Stop 
    Set bSession = Nothing 
End Function 
' 
Private Function convertDateToBloombergString(ByVal d As Date) As String 
    ' 
    ' convert date data type into string format YYYYMMDD 
    Dim dayString As String: dayString = VBA.CStr(VBA.Day(d)): If (VBA.Day(d) < 10) Then dayString = "0" + dayString 
    Dim MonthString As String: MonthString = VBA.CStr(VBA.Month(d)): If (VBA.Month(d) < 10) Then MonthString = "0" + MonthString 
    Dim yearString As String: yearString = VBA.Year(d) 
    convertDateToBloombergString = yearString + MonthString + dayString 
End Function 
' 
Private Function getMax(ByVal a As Long, ByVal b As Long) As Long 
    ' 
    getMax = a: If (b > a) Then getMax = b 
End Function 
+0

ようこそスタックオーバーフロー。あなたの説明は非常に詳細です - あなたの質問は何ですか?あなたが求めていることを非常に具体的にしてください。 – Matt

+0

明快さに欠けて申し訳ありません - BLPSubscribeのリクエストでBloombergのセキュリティ記述を正常に返すためにどのようにフォーマットするのですか? – Bloomie

+0

私は上記の文章にあなたの質問を追加しました。 – Matt

答えて

0

あなたはCUSIP番号の後に「CUSIP」を置くことによって、それをフォーマットしたいです。 BloombergReturnData = BloombergModule.BLPSubscribe( "xxxxxxx Cusip"、BloombergFields)は必須フィールドを返します。 Cusipリストを使用してテストしましたが、正しいフィールドデータでバリアントを設定しています。

使用しているActiveXコントロールは、Bloombergではサポートされなくなりました。 「v3」インターフェイスを使用するCOMデータコントロールがあります。

+0

ありがとう!私が使用していたリファレンスを「Bloomberg Data Type Library」から「Bloomberg API COM 3.5 Type Library」に更新しました。 私はこのブルームバーグコールを最適化するために作られたあらかじめ書かれたブルームバーグクラスモジュールを参照しました。(感謝MikaelKatajamäki):http://mikejuniperhill.blogspot.com/2013/06/bloomberg-v3com-api-wrapper -update-for.html セキュリティ名を「/ cusip/xxxxxxxxx」に再フォーマットするまで、リファクタリングされたコードを使用して空のバリアントを返していました。元の質問の編集で新しいコードを投稿します。 – Bloomie

関連する問題