Обновление курсов валют - VBA - Ошибка времени выполнения 13 Несоответствие типов - PullRequest
1 голос
/ 07 января 2020

Я написал функцию, которая обновляет курсы валют в зависимости от даты и символа валюты - и это работает хорошо. Но когда я хочу изменить некоторые значения (от PLN до, например, USD) в моем рабочем листе (в определенном диапазоне), l oop вставляется (жирной линией). Более того, диапазон, в котором были сохранены обменные курсы, меняется на #ARG !. Ниже код функции и l oop:

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

Что действительно интересно, это работало несколько дней назад.

Снимок экрана

Снимок экрана2

1 Ответ

1 голос
/ 07 января 2020

Похоже, ваша функция для получения курсов валют (Function PobierzKurs) пересчитывает каждый раз, когда ваш второй макрос конвертирует значения из Poli sh Злотых в доллары США.

Поскольку процесс зацикливания быстрый, ваша функция иногда не хватает времени для пересчета данного обменного курса, поэтому ошибка. Это также объясняет, почему выполнение кода с точкой останова дает результат (при ручном пошаговом выполнении кода у Function PobierzKurs есть достаточно времени для пересчета значений FX).

Существует два возможных решения, которые вы можете попробовать на вашей стороне -

1) Вы можете добавить Application.Calculation = xlCalculationManual в самом начале вашего кода (тот, что с r.Value) и завершить sh его с помощью Application.Calculation = xlCalculationAutomatic

2) Вы можете сохранить значение ячейки L14 в переменной (например, dim lngFX as Long // lngFx = Sheets("Raport").Range("L14").Value, а затем использовать его в своих вычислениях: r.Value = r.Value / lngFX

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...