Excel自定义函数检索XML数据

时间:2016-01-27 08:02:18

标签: xml excel vba excel-vba

我想创建一个自定义函数,以XML URL链接的形式检索可用的特定数据。这是我第一次在Excel中处理XML,更不用说VBA,并且正在努力解决它。

我已经能够编写一个程序(本地货币汇率检索),只需按下自定义按钮即可运行该程序,该按钮运行以下代码:

Sub FX_Retrieve()
    Dim FX As String
    Dim CustomDate As String

    FX = Range("FX")
    CustomDate = Range("CustomDate")

    Application.ScreenUpdating = False

    ActiveSheet.Unprotect 
    Rows(2).Clear
    ActiveWorkbook.XmlImport URL:= _
        "http://www.cbu.uz/section/rates/widget/xml/" & FX & "/" & CustomDate, ImportMap:= _
        Nothing, Overwrite:=True, Destination:=Range("C2")
    Range("D:D").EntireColumn.AutoFit
    Rows(2).HorizontalAlignment = xlCenter
    Columns(6).ClearContents
    ActiveSheet.Protect 

    Application.ScreenUpdating = True
End Sub

以防万一,XML输出如下所示:          2015年12月29日     美元     2809.98     1      因此,我的代码中需要一些格式化。

单次调用外汇汇率时,该程序没问题! 现在,我想进一步了解并创建一个函数。这就是我提出几个问题的地方:

  1. 我需要从xml输出中提取特定的子节点(rate),如下所示:
  2. <response>
    <date_act>2015-12-29</date_act>
    <symbol>USD</symbol>
    <rate>2809.98</rate>
    <size>1</size>
    </response>
    

    我已经找到类似的内容(如此处:Excel VBA getting specific node from XML),但我无法在我的情况下应用它。

    1. 功能的创建,据我所知,它不会允许我在我的程序中采用相同的方法。
    2. 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

感谢@Dick Kusleika运营的AnalystCave.com网站,我已经能够根据&#34;使用XML文件&#34;我的问题并成功解决了它。万一有人遇到同样的问题,这是我的代码(我希望它在编程上有效):

Public Function GetCurrToUZS(ByRef Curr As String, ByRef date_param As Date) As Currency
    Dim XDoc As Object
    Dim lists
    Dim getThirdChild
    Dim corrDate As String

    If Len(Curr) <> 3 Then
        MsgBox "Currency name must be 3 letters long!", vbCritical + vbOKOnly _
            , "VARIABLE ERROR!"
        Exit Function
    End If
    'corrects the entered date to the required format of "YYYY-MM-DD"
    corrDate = Year(date_param) & "-" & Month(date_param) & "-" & Day(date_param)

    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.Load "http://www.cbu.uz/section/rates/widget/xml/" & Curr & "/" & corrDate

    'Get Document Elements
    Set lists = XDoc.DocumentElement
    Set getThirdChild = lists.ChildNodes(2)

    GetCurrToUZS = getThirdChild.Text 'output of the function

    Set XDoc = Nothing 'terminates xDoc Object
End Function