Как использовать ComboBox для извлечения информации из XML-файла? - PullRequest
1 голос
/ 21 мая 2019

У меня есть XML-файл, который содержит много информации.Итак, я хотел бы создать макрос в VBA Excel, который позволит мне фильтровать информацию на основе accountID (доступно из пользовательской формы - ComboBox)

Впервые я работаю сXML и пользовательская форма.

Я попытался настроить несколько кодов, которые я нашел в сети, но я лучше понимаю этот код, поэтому я хотел бы продолжить с чем-то похожим (если возможно):

Private Sub ComboBox1_Click()
    Dim wks As Worksheet
    Set wks = Sheet2

    ' Load the XML document
    Dim XDoc As Object, root As Object
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.Load ("C:\Users\isabelle\Google Drive\IB API Integration\Flexqueries\FlexDay.xml") 

    Dim singleNode As Object
    Set singleNode = XDoc.SelectSingleNode("//FlexQueryResponse/FlexStatements/FlexStatement[@accountId='U2396623']")

End Sub

AccountId 'U2396623' является лишь примером.Это будет соответствовать записи в выпадающем списке.

Мои две проблемы:

  1. Во-первых, я не знаю, как связать запись в выпадающем списке скод (на основе идентификатора учетной записи)

  2. Во-вторых, приведенный выше код не работает.Я думаю, что путь (XDoc.SelectSingleNode) не правильный ... Итак, я связал несколько комбинаций, и они никогда не работали.Или, может быть, это вывод, который не работает правильно (вывод должен быть в Sheet2 )

Мой XML-файл выглядит так:

<FlexQueryResponse queryName="Sample_1" type="AF">
   <FlexStatements count="10">
      <FlexStatement accountId="" fromDate="2019-04-22" toDate="2019-05-21" period="Last30CalendarDays" whenGenerated="2019-05-22;13:49:30">
         <AccountInformation accountId="" acctAlias="" currency="CAD" accountType="Advisor Client" dateOpened="2018-02-08" dateFunded="2018-03-01" dateClosed="" street="" street2="" city="" state="" country="" postalCode="" primaryEmail="" />
         <ChangeInNAV accountId="" acctAlias="" startingValue="" endingValue="" realized="0" changeInUnrealized="0" depositsWithdrawals="0" twr="" mtm="" dividends="" changeInDividendAccruals="" interest="" changeInInterestAccruals="" advisorFees="" clientFees="0" otherFees="0" />
         <CashReport>
            <CashReportCurrency accountId="" acctAlias="" clientFees="0" commissions="" deposits="0" withdrawals="0" accountTransfers="0" dividends="" advisorFees="" otherFees="0" currency="BASE_SUMMARY" startingCash="" endingCash="" endingSettledCash="" />
            /&gt;
         </CashReport>
         <OpenPositions>
            <OpenPosition accountId="" acctAlias="" symbol="" position="" costBasisPrice="" strike="" expiry="" putCall="" positionValue="" percentOfNAV="" fifoPnlUnrealized="" currency="CAD" fxRateToBase="1" assetCategory="STK" description="BOMBARDIER INC PFD SER 2" securityID="CA0977515075" cusip="" isin="CA0977515075" />
         </OpenPositions>
         <FxPositions>
            <FxPosition accountId="" fxCurrency="CAD" quantity="" costPrice="" unrealizedPL="0" />
         </FxPositions>
         <OptionEAE>
            <OptionEAE accountId="" acctAlias="" currency="USD" assetCategory="" symbol="" description="" securityID="" cusip="" isin="" listingExchange="" underlyingConid="" underlyingSymbol="FCAU" underlyingSecurityID="NL0010877643" underlyingListingExchange="NYSE" issuer="" strike="16" expiry="2019-05-03" putCall="C" date="2019-04-22" transactionType="Assignment" quantity="2" tradePrice="0.0000" markPrice="0.3500" realizedPnl="0.00" />
         </OptionEAE>
         <PendingExcercises />
         <ClientFees />
         <OpenDividendAccruals>
            <OpenDividendAccrual accountId="" acctAlias="" currency="" assetCategory="" symbol="" description="" securityID="" cusip="" isin="" exDate="2019-05-03" payDate="2019-06-24" quantity="400" grossRate="0.23" grossAmount="92" netAmount="92" />
         </OpenDividendAccruals>
      </FlexStatement>
   </FlexStatements>
</FlexQueryResponse>

Если у вас есть какие-либо вопросы, не стесняйтесь!

Спасибо за помощь

1 Ответ

0 голосов
/ 23 мая 2019

Рассмотрим несколько настроек:

  1. Используйте событие запуска AfterUpdate в выпадающем списке.

    Private Sub ComboBox1_AfterUpdate()
        ...
    End Sub
    
  2. Просто объедините значение комбинированного списка Me.ComboBox1 с выражением XPath.

    XDoc.SelectSingleNode("/FlexQueryResponse/FlexStatements/FlexStatement[@accountId='" & Me.ComboBox1 & "']")
    
  3. Выберите нужное значение атрибута или выполните цикл по нескольким узлам для извлечения на лист.

    Private Sub ComboBox1_AfterUpdate()
        ' Load the XML document
        Dim XDoc As Object, root As Object, singleNode As Object
        Dim i As Integer
    
        Set XDoc = CreateObject("MSXML2.DOMDocument")
    
        XDoc.async = False: XDoc.validateOnParse = False
        XDoc.Load ("C:\Users\isabelle\Google Drive\IB API Integration\Flexqueries\FlexDay.xml")
    
        ' OUTPUT ONE ATTRIBUTE OF NODE
        Set singleNode = XDoc.SelectSingleNode("/FlexQueryResponse/FlexStatements/FlexStatement[@accountId='" & Me.ComboBox1 & "']")
        ThisWorkbook.Worksheets("Sheet1").Range("A1") =  singleNode.Attributes.getNamedItem("accountId").Text
    
        ' OUTPUT ALL ATTRIBUTES OF NODE
        For i = 0 To singleNode.Attributes.Length - 1
             ThisWorkbook.Worksheets("Sheet1").Range("A" & i + 1) = singleNode.Attributes(i).Name
             ThisWorkbook.Worksheets("Sheet1").Range("B" & i + 1) = singleNode.Attributes(i).Text
        Next i
    
        Set XDoc = Nothing
    End Sub
    

    Excel Output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...