Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于检索XML数据的Excel自定义函数_Xml_Vba_Excel - Fatal编程技术网

用于检索XML数据的Excel自定义函数

用于检索XML数据的Excel自定义函数,xml,vba,excel,Xml,Vba,Excel,我想创建一个自定义函数,用于检索XML URL链接形式的特定可用数据。这是我第一次在Excel中处理XML,更不用说VBA了,我正在努力解决它 我已经能够编写一个程序(本地货币汇率检索),只需按下自定义按钮即可运行该程序,该程序运行以下代码: Sub FX_Retrieve() Dim FX As String Dim CustomDate As String FX = Range("FX") CustomDate = Range("CustomDate")

我想创建一个自定义函数,用于检索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. 因此,在我的代码中需要一些格式

在外汇汇率单次调用的情况下,该程序没有问题! 现在,我想更进一步,创建一个函数。这就是我提出几个问题的原因:

  • 我需要从xml输出中提取特定的子节点(速率),如下所示:
  • "

    
    2015-12-29
    美元
    2809.98
    1.
    
    我已经发现了类似的东西(如这里:),但我无法将其应用到我的案例中

  • 就我所知,函数的创建将不允许使用与我在过程中使用的方法相同的方法

  • 任何帮助都将不胜感激

    多亏了@Dick Kusleika运行的AnalystCave.com网站,我才能够将网站上关于“使用XML文件”的信息应用到我的问题中,并成功地解决了这个问题。为了防止有人有同样的问题,下面是我的代码(我只希望它在编程上是有效的):

    公共函数getCurrtuzs(ByRef Curr作为字符串,ByRef date_param作为日期)作为货币
    作为对象的Dim XDoc
    模糊列表
    灰暗的孩子
    将日期设置为字符串
    如果Len(Curr)3那么
    MsgBox“货币名称必须有3个字母长!”,vbCritical+vbOKOnly_
    ,“变量错误!”
    退出功能
    如果结束
    '将输入的日期更正为所需的格式“YYYY-MM-DD”
    corrDate=年(日期参数)&“-”月(日期参数)&“-”日(日期参数)
    设置XDoc=CreateObject(“MSXML2.DOMDocument”)
    XDoc.async=False:XDoc.validateOnParse=False
    XDoc.Load“http://www.cbu.uz/section/rates/widget/xml/“&Curr&”/“&corrDate”
    '获取文档元素
    Set lists=XDoc.DocumentElement
    Set getThirdChild=lists.ChildNodes(2)
    GetCurrtuzs=getThirdChild.Text'函数的输出
    Set XDoc=Nothing'终止XDoc对象
    端函数
    
    <response>
    <date_act>2015-12-29</date_act>
    <symbol>USD</symbol>
    <rate>2809.98</rate>
    <size>1</size>
    </response>
    
    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