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

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

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

person TheBriStar    schedule 07.07.2014    source источник


Ответы (2)


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
person hnk    schedule 07.07.2014
comment
Теперь я могу поймать ошибку, но я все еще не могу выполнить функцию Match в одиночку. GraphDataA = WorksheetFunction.Match(dat, Worksheets(DayTot).Range(I3:EK3), 0) Должна ли эта функция работать на основе предположения, что данные находятся в массиве DayTot!I3:EK3? - person TheBriStar; 07.07.2014
comment
Разделите MATCH и VLOOKUP на отдельные строки в вашем коде, т.е. сохраните промежуточное совпадающее значение в одной переменной, а затем используйте его в своем VLOOKUP. Узнайте, какой шаг генерирует ошибку, используя точки останова на обоих, а затем - person hnk; 07.07.2014
comment
Я разделил VLOOKUP и Match и определил ошибку в Match. Была проблема с ассортиментом. Спасибо. - person TheBriStar; 07.07.2014

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

Function GraphDataA(cR As String, time As String, aClient As String, tps As String, dat As String) As Variant
person Gareth    schedule 07.07.2014
comment
но OP возвращает значение из функции. В VBA вы заменяете return именем функции. - person ; 07.07.2014
comment
@mehow, разве ему не нужно указывать тип возвращаемого значения, как указал Гарет? - person rex; 07.07.2014
comment
@ArmenSafieh-Garabedian тип возвращаемого значения по умолчанию — Variant - person ; 07.07.2014