UDF нормально вызывает в VBA, но возвращает вызовы при вызове в листе - PullRequest
0 голосов
/ 04 мая 2020

У меня есть функция в модуле, которая прекрасно работает при вызове в Sub, но при использовании в рабочей таблице я получаю только пробелы. Функции должны иметь 3 входа. Один вход определил лист для проверки, а затем нашел строку, соответствующую двум другим критериям. Я использовал подпрограмму, которая вызвала функцию и предоставила msgbox с результатом, который был правильным. Но в рабочем листе тот же самый ввод привел к пустой ячейке.

Function ToolStatus(PartNumber As String, Model As String, Number As Integer) As String
Dim SearchSheet As Worksheet
Dim PN As Integer
Dim MdlCol As Integer
Dim Mdl As String
Dim Result As Integer
Dim FinalRow As Integer
Dim i As Integer
Application.ScreenUpdating = False
Select Case True
    Case Number < WorksheetFunction.CountA(Sheet2.Range("B:B")) And Model = "1A"
        Set SearchSheet = Sheet2
        PN = 2
        MdlCol = 4
        Mdl = "1A"
        Result = 19
    Case Number < WorksheetFunction.CountA(Sheet2.Range("B:B")) And Model = "1B"
        Set SearchSheet = Sheet2
        PN = 2
        MdlCol = 5
        Mdl = "1B"
        Result = 19
    Case Number < WorksheetFunction.CountA(Sheet2.Range("B:B")) And Model = "1C"
        Set SearchSheet = Sheet2
        PN = 2
        MdlCol = 6
        Mdl = "1C"
        Result = 19
    Case Number < WorksheetFunction.CountA(Sheet3.Range("B:B")) And Model = "1A"
        Set SearchSheet = Sheet3
        PN = 3
        MdlCol = 17
        Mdl = "-1A"
        Result = 4
    Case Number < WorksheetFunction.CountA(Sheet3.Range("B:B")) And Model = "1B"
        Set SearchSheet = Sheet3
        PN = 3
        MdlCol = 18
        Mdl = "-1B"
        Result = 4
    Case Number < WorksheetFunction.CountA(Sheet3.Range("B:B")) And Model = "1C"
        Set SearchSheet = Sheet3
        PN = 3
        MdlCol = 19
        Mdl = "-1C"
        Result = 4
End Select
SearchSheet.Select
FinalRow = Cells(Rows.Count, 2).End(xlUp).Row

For i = 2 To FinalRow
    If Cells(i, PN) = PartNumber And Cells(i, MdlCol) = Mdl Then
        ToolStatus = Cells(i, Result).Value
        Exit For
    End If
Next i
Application.ScreenUpdating = True
End Function

1 Ответ

2 голосов
/ 04 мая 2020

SearchSheet.Select

Вы не можете сделать это в функции, называемой UDF. Подробнее см. https://support.microsoft.com/en-us/help/170787/description-of-limitations-of-custom-functions-in-excel.

Вам не нужно выбирать лист - просто используйте

FinalRow = SearchSheet.Cells(Rows.Count, 2).End(xlUp).Row 

(и аналогично следующему коду)

...