Excel UDF возвращает #N/A при переключении на лист

У меня есть UDF в Excel, который технически работает идеально. Однако иногда при переключении на лист с ячейками, которые вызывают эту UDF, он возвращает #N/A. Это происходит последовательно, когда я открываю файл и затем переключаюсь на этот лист.
Причина, по которой я говорю, что она "отлично работает", заключается в том, что когда я захожу в эту ячейку и нажимаю клавишу ввода (т.е. запускаю функцию вручную), она возвращает правильное значение! Как и в любое время, измените значение в одной из зависимых ячеек.
Я попытался устранить неполадки, чтобы найти причину проблемы, и понял, что мой udf даже не вызывается! (Оператор debug.print, который у меня там, не печатается)

Вот мой udf:

Function AvgPrice(myWS As String, r As Range, bCol As Range, szCol As Range, ttlCol As Range)
    Application.Volatile

    Dim cell As Range, MinArb As Boolean
    Dim val As Variant, inc As Variant, thisRow As Long, iSum As Long, thisCol As Long, total As Long, price As Long
    Dim fabric As String, book As String, size As String, Lookup As String, fab As String
    Dim rLookUp As Range, cIndex As Variant

    Dim ws As Worksheet, prices As Worksheet
    Set ws = ThisWorkbook.Worksheets(myWS)
    Set prices = ThisWorkbook.Worksheets("Prices")

    Debug.Print (ws.Name)

    Set r = ws.Range(r.Address)
    Set bCol = ws.Range(bCol.Address)
    Set szCol = ws.Range(szCol.Address)
    Set ttlCol = ws.Range(ttlCol.Address)

    thisRow = r.Cells(1).row
    book = bCol.Value
    size = szCol.Value
    total = ttlCol.Value


    For Each cell In r.Cells
        inc = cell.Value
        If inc = vbNullString Then GoTo NXT
        If Not (IsNumeric(inc)) Then GoTo NXT

        thisCol = cell.Column
        fabric = getFabric2(cell, ws)

        Debug.Print (ws.Parent.Name)

        fabric = Mid(fabric, 1, 1) & LCase(Mid(fabric, 2))
        Lookup = book & "-" & size & "-" & fabric
        Set rLookUp = prices.Range("A:A")

        cIndex = Application.Match(Lookup, rLookUp, 0)
        If IsError(cIndex) Then
            Debug.Print ("1 -- Error: " & Lookup)
            Debug.Print (Err.Description)
            GoTo QuitIt
        End If
        val = prices.Cells(cIndex, 3).Value
        If val = vbNullString Or Not (IsNumeric(val)) Then
            val = prices.Cells(cIndex, 2).Value
            If val = vbNullString Or Not (IsNumeric(val)) Then GoTo NXT
        End If

        inc = inc * val
        iSum = iSum + inc
NXT:
    Next cell

QuitIt:
    If iSum > 0 Then
        AvgPrice = iSum / total
    Else
        AvgPrice = ""
    End If

End Function

0 ответов

У меня была такая же проблема, и я решил, передав дополнительный параметр функции UDF. Да, параметр - это имя листа, в котором вызывается UDF.

Другие вопросы по тегам