Excel 从外部链路重复提取时出现错误91

Excel 从外部链路重复提取时出现错误91,excel,msxml,msxml2,vba,Excel,Msxml,Msxml2,Vba,我的函数从外部网站提取汇率 我可以提取特定日期的单一费率 当我有一个不同日期的列表时,我得到了错误91,我将函数复制粘贴到整个列表中。(我告诉Excel在每个特定日期应用此功能。) 这是我的代码(xDoc对象创建方法的功劳归于AnalystCave.com/vba xml working xml files/上的AnalystCave): 公共函数getCurrtuzs(ByRef Curr作为字符串,ByRef date_param作为日期)作为货币 作为对象的Dim xDoc Dim xPa

我的函数从外部网站提取汇率

我可以提取特定日期的单一费率

当我有一个不同日期的列表时,我得到了错误91,我将函数复制粘贴到整个列表中。(我告诉Excel在每个特定日期应用此功能。)

这是我的代码(xDoc对象创建方法的功劳归于AnalystCave.com/vba xml working xml files/上的AnalystCave):

公共函数getCurrtuzs(ByRef Curr作为字符串,ByRef date_param作为日期)作为货币
作为对象的Dim xDoc
Dim xParent作为对象
Dim getRateChild作为对象
将日期设置为字符串
错误转到错误处理程序时:
如果Len(Curr)3那么
MsgBox“当前标识符长度应为3个字母”,vbCritical+vbOKOnly_
“错误!”
退出功能
如果结束
'将输入的日期转换为所需的格式“YYYY-MM-DD”
corrDate=年(日期参数)&“-”月(日期参数)&“-”日(日期参数)
设置xDoc=CreateObject(“MSXML2.DOMDocument”)
使用xDoc
.async=False
.validateOnParse=False
.加载“http://cbu.uz/ru/arkhiv-kursov-valyut/xml/“&Curr&“/”&corrDate&“/”
以
'获取文档元素
设置xParent=xDoc.DocumentElement
设置getRateChild=xParent.ChildNodes(0).ChildNodes(7)
GetCurrToUZS=getRateChild.Text'函数的输出
Set xDoc=Nothing'终止xDoc对象
退出功能
错误处理程序:
MsgBox Err.Number,vbCritical+vbOKOnly,“严重错误!”
退出功能
端函数

作为错误的一个例子,我在Dropbox()上创建了这个小Excel文件,其中包含一个日期列表。第一个是使用此函数完成的,应该可以轻松地提取速率而不会出现任何错误。将公式复制粘贴到所有其他日期时,将出现错误91。

错误91表示未设置对象

最有可能的情况是,
xDoc
不能总是从指定的URL检索。如果我转到
http://cbu.uz/ru/arkhiv-kursov-valyut/xml/usd/14.01.17
(第3页中的日期),您将获得2017年7月11日的XML。事实上,如果您转到
http://cbu.uz/ru/arkhiv-kursov-valyut/xml
您将看到提供的所有记录都是针对该特定日期的


将错误处理放在无法获取
xDoc
和随后无法设置
xParent
getRateChild
的情况下,它应该可以像一个魔咒一样工作。

@Chrotensie,感谢您的评论。是的,如果我省略了日期并缩短了URL,它仍然会像你说的那样检索速率。问题在于,它将始终检索可用的最新版本(2017年7月11日是央行设定的最新版本)。要让它检索任何以前的日期,我需要使用原始链接。我不确定我是否真的理解了你关于错误处理的建议(我对XML不是很精通;事实上,我也只是VBA编程的业余爱好者),而且鉴于我继续使用原始URL,我也不确定这个建议是否适用。@Chrotensie,您之所以一直获得2017年7月11日而不是2017年1月14日的XML,是因为日期的格式应该正确。如果您注意到,我在代码
corrDate
中有一个特殊的行,然后在
xDoc.Load
中后跟一个正斜杠。
Public Function GetCurrToUZS(ByRef Curr As String, ByRef date_param As Date) As Currency        
    Dim xDoc As Object
    Dim xParent As Object
    Dim getRateChild As Object
    Dim corrDate As String

    On Error GoTo errorHandler:

    If Len(Curr) <> 3 Then
        MsgBox "Current identifier should be 3 letters in lenght", vbCritical + vbOKOnly _
            , "ERROR!"
        Exit Function
    End If
    'transforms 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")
    With xDoc
        .async = False
        .validateOnParse = False
        .Load "http://cbu.uz/ru/arkhiv-kursov-valyut/xml/" & Curr & "/" & corrDate & "/"
    End With

    'Get Document Elements
    Set xParent = xDoc.DocumentElement
    Set getRateChild = xParent.ChildNodes(0).ChildNodes(7)

    GetCurrToUZS = getRateChild.Text 'output of the function

    Set xDoc = Nothing 'terminates xDoc Object
    Exit Function

errorHandler:
    MsgBox Err.Number, vbCritical + vbOKOnly, "Critical Error!"
    Exit Function
End Function