Excel 更新汇率-VBA-运行时错误13类型不匹配
我已经编写了一个函数,它根据日期和货币符号更新汇率,并且运行良好。但是,当我想更改工作表中(定义范围内)的某些值(例如,从PLN更改为USD)时,循环将被解释(以粗体显示)。此外,保存汇率的范围将更改为#ARG!。下面是函数和循环的代码:Excel 更新汇率-VBA-运行时错误13类型不匹配,excel,vba,Excel,Vba,我已经编写了一个函数,它根据日期和货币符号更新汇率,并且运行良好。但是,当我想更改工作表中(定义范围内)的某些值(例如,从PLN更改为USD)时,循环将被解释(以粗体显示)。此外,保存汇率的范围将更改为#ARG!。下面是函数和循环的代码: Function PobierzKurs(kurs As String, data As Date) Dim hReq As Object Dim objxml As Object Dim link As String Dim
Function PobierzKurs(kurs As String, data As Date)
Dim hReq As Object
Dim objxml As Object
Dim link As String
Dim odpowiedz As String
link = "http://api.nbp.pl/api/exchangerates/rates/a/" & kurs & "/" & Format(data, "yyyy-mm-dd") & "/?format=xml"
Set hReq = CreateObject("MSXML2.XMLHTTP")
With hReq
.Open "GET", link, False
.Send
End With
odpowiedz = hReq.ResponseText
If odpowiedz Like "*Brak danych" Then
PobierzKurs = "Brak danych"
Else
Set objxml = New MSXML2.DOMDocument60
objxml.LoadXML (odpowiedz)
PobierzKurs = objxml.DocumentElement.ChildNodes.Item(3).ChildNodes.Item(0).ChildNodes.Item(2).nodeTypedValue
PobierzKurs = CDbl(Replace(PobierzKurs, ".", ","))
End If
End Function
真正有趣的是,几天前它工作得很好
每次第二个宏将值从波兰兹罗提转换为美元时,它都会重新计算用于检索外汇汇率的函数(
函数PobierzKurs
)
由于循环过程很快,您的函数有时没有足够的时间重新计算给定的汇率,因此会出现错误。它还解释了为什么使用断点遍历代码会产生结果(当手动单步遍历代码时,函数PobierzKurs
有足够的时间重新计算FX值)
有两种可能的解决方案,您可以在自己的方面尝试-
1)您可以在代码的最开头添加Application.Calculation=xlCalculationManual
(带有r.Value
)并使用Application.Calculation=xlCalculationAutomatic
2)您可以将单元格L14的值存储在变量中(例如,
dim lngFX,只要长/lngFX=Sheets(“Raport”)。范围(“L14”).Value
然后在您的计算中使用它:r.Value=r.Value/lngFX
请原谅,但是上面的代码和下面的代码之间有什么联系?请尝试删除rFound。如果没有rFound是空的,请在之后选择如果没有rFound是空的,则在之后为rFound中的每个r添加End
-它s函数,用于更新汇率底部代码-它是案例结构的一部分-当我尝试执行宏时,它以粗体显示失败尝试转到工作表中此函数PobierzKurs
所在的范围,并可能重新应用它(F2
+Enter
,或者只需选择它并Enter
)。我觉得这很好,但可能是因为您存在一些连接问题。我想底部的代码抛出了一个错误,因为范围($L$14”)。值
不是一个数字。在解析范围($L$14”)之前,请尝试指定工作表名称.Value
,例如工作表(“工作表名称”).Range($L$14”).Value
。或者,在错误行之前添加Debug.Print r.Value,Range($L$14”).Value
,以查看即时窗口中的实际值。第一个解决方案非常有效!非常感谢!
Dim rng As Range, r As Range, rFound As Range
Set rFound = Nothing
For Each r In Sheets("Raport").Range("K1:S5000")
If InStr(1, r.Text, "zł") > 0 Then
If rFound Is Nothing Then
Set rFound = r
Else
Set rFound = Union(rFound, r)
End If
End If
Next r
If Not rFound Is Nothing Then rFound.Select
For Each r In rFound
** r.Value = r.Value / Range("$L$14").Value**
r.NumberFormat = "#,##0.00 [$USD]"
Next r