#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