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.