Excel 从外部链路重复提取时出现错误91
我的函数从外部网站提取汇率 我可以提取特定日期的单一费率 当我有一个不同日期的列表时,我得到了错误91,我将函数复制粘贴到整个列表中。(我告诉Excel在每个特定日期应用此功能。) 这是我的代码(xDoc对象创建方法的功劳归于AnalystCave.com/vba xml working xml files/上的AnalystCave):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
公共函数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