Excel VBA — пользовательская функция; ошибка # значения; ВПР на другом листе

#vba #excel #vlookup #worksheet-function

#vba #excel #ВПР #рабочий лист-функция

Вопрос:

Я пытаюсь выполнить ВПР на другом листе на основе заданных параметров в функции. Я играл с этим в течение нескольких часов и не могу понять, почему это не работает. Я сократил код настолько, насколько мог, для тестирования, но не могу эффективно найти решение. Я думаю, что это может быть проблема в том, как я вызываю диапазон из другого листа для ВПР. Код приведен ниже. Пожалуйста, дайте совет. Если мне неясно, о чем я спрашиваю, просто спросите, и я предоставлю отзыв. Спасибо

 Function GraphDataA(cR As String, time As String, aClient As String, tps As String, dat As String)

Dim client As Boolean
Dim day As Boolean
Dim tot As Boolean

Dim dayTotData As Range
Dim dayTotDatas As Worksheet


Set dayTotDatas = ActiveWorkbook.Sheets("DayTot")
Set dayTotData = dayTotDatas.Range("A3:AI168")

client = False
day = False
tot = False

If date = "" Then
    GraphDataA = ""
End If

If aClient = "" Then
    GraphDataA = ""
End If

If cR = "Client" Then
    client = True
End If

If time = "Day" Then
    day = True
End If

If tps = "Total" Then
    tot = True
End If

If client = True Then
    If day = True Then
        If tot = True Then
            GraphDataA = WorksheetFunction.VLookup(aClient, dayTotData, WorksheetFunction.Match(dat, dayDate, 0)   8, _
        False)
        End If
    End If
End If
End Function
  

Ответ №1:

VLOOKUP() выдаст ошибку, если ничего не соответствует. Итак, вам нужно добавить код отслеживания ошибок в вашу функцию.

Вам необходимо изменить функцию следующим образом

 Function MyFunction() as Something
    On Error Goto ErrorHandler
    ' Your existing code goes here
    Exit Function
ErrorHandler:
    MyFunction = -1 ' Or something which indicates that the value isn't found
End Function
  

Комментарии:

1. Теперь я могу перехватить ошибку, но я все еще даже не в состоянии выполнить функцию сопоставления в одиночку. GraphDataA = WorksheetFunction. Совпадение (dat, Worksheets(«DayTot»). Диапазон («I3: EK3»), 0) Должна ли эта функция работать, исходя из предположения, что dat находится в DayTot! I3: массив EK3?

2. Разделите MATCH и VLOOKUP на отдельные строки в своем коде, т. е. сохраните промежуточное согласованное значение в одной переменной, а затем используйте его в своем VLOOKUP . Выясните, на каком шаге генерируется ошибка, используя точки останова на обоих, затем

3. Я разделил VLOOKUP и Match и определил ошибку в Match. Это была проблема с диапазоном. Спасибо.

Ответ №2:

Похоже, что вы не возвращаете никакого значения из своей функции. Попробуйте добавить As Variant в конец первой строки вот так:

 Function GraphDataA(cR As String, time As String, aClient As String, tps As String, dat As String) As Variant
  

Комментарии:

1. но OP возвращает значение из функции. В VBA вы заменяете return имя функции.

2. @mehow разве ему не нужно указывать возвращаемый тип, как указал Гарет?

3. @ArmenSafieh-Гарабедян типом возвращаемого значения по умолчанию является Variant