【问题标题】:Updating exchange rates - VBA - Run-time error 13 Type mismatch更新汇率 - VBA - 运行时错误 13 类型不匹配
【发布时间】:2020-01-08 03:41:43
【问题描述】:

我编写了一个函数,它根据日期和货币符号更新汇率 - 效果很好。但是当我想在我的工作表(在定义的范围内)中更改一些值(从 PLN 到例如 USD)时,循环被插入(以粗体线)。此外,保存汇率的范围更改为#ARG!。下面是函数和循环的代码:

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
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

真正有趣的是,前几天它运行良好。

Screenshot

Screenshot2

【问题讨论】:

  • 请见谅,上码和下码有什么关系?
  • 尝试在If Not rFound Is Nothing Then 之后删除rFound.Select 并在For Each r In rFound 循环之后添加End if
  • 上层代码 - its function, which updates exchange rates Bottom code - its 是 CASE 结构的一部分 - 当我尝试执行宏时,它以粗体线显示失败
  • 尝试转到您的工作表中此函数PobierzKurs 所在的范围,并可能重新应用它(F2 + Enter,或者只选择它和Enter)。对我来说似乎很好,但可能是您遇到了一些连接问题。我想底部代码会抛出错误,因为Range("$L$14").Value 不是数字。
  • 也尝试在解析Range("$L$14").Value之前指定工作表名称,例如Sheets("Sheet Name").Range("$L$14").Value。或者,在错误行之前添加Debug.Print r.Value, Range("$L$14").Value 以查看即时窗口中的实际值。

标签: excel vba


【解决方案1】:

每次您的第二个宏将值从波兰兹罗提转换为美元时,您检索外汇汇率 (Function PobierzKurs) 的函数似乎都会重新计算。

由于循环过程很快,您的函数有时没有足够的时间重新计算给定的汇率,因此会出错。它还解释了为什么使用断点遍历代码会产生结果(手动单步执行代码时,Function PobierzKurs 有足够的时间重新计算 FX 值)。

您可以尝试两种潜在的解决方案 -

1) 您可以在代码的最开头添加Application.Calculation = xlCalculationManual(带有r.Value 的那个),然后以Application.Calculation = xlCalculationAutomatic 结束它

2) 您可以将单元格 L14 的值存储在变量中(例如 dim lngFX as Long // lngFx = Sheets("Raport").Range("L14").Value 然后在计算中使用它:r.Value = r.Value / lngFX

【讨论】:

  • 第一个解决方案效果很好!非常感谢!
猜你喜欢
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多