пользовательская функция не работает vba

у меня есть этот udf, и в основном я хочу получить последнюю дату из вектора (столбца), которая соответствует другим данным в другом столбце, вот код:

Option Explicit
Public Function GetLastDate(Carrier As String, CarrierVector As Range, DateVector As Range) As Variant
    Dim TempRange(1 To 10) As Variant
    Dim i, j As Integer
    For i = 1 To DateVector.Rows.Count
        With Application.WorksheetFunction
            If .Text(CarrierVector.Item(i), "#") = Carrier And .IsError(.VLookup(DateVector.Item(i), TempRange, 1, False)) Then
                j = j + 1
                TempRange(j) = DateVector.Item(i)
            End If
        End With
    Next i
    GetLastDate = Application.WorksheetFunction.Max(TempRange)
End Function

в этом случае, если переменная Carrier найдена в CarrierVector, дата, соответствующая этому перевозчику, будет храниться в массиве TempRange (это, если он не повторяется), и в конце он вернет самую последнюю дату, но это не работает, он просто возвращает ошибку в ячейке, из которой вызывается функция, не могли бы вы мне помочь?


person Jey    schedule 18.07.2016    source источник
comment
Вы поставили точку останова в функции, а затем прошли через нее, чтобы увидеть, в чем может быть причина ошибки? если нет, это, вероятно, поможет вам ответить на ваш собственный вопрос.   -  person Scott Holtzman    schedule 18.07.2016
comment
Что происходит не так, ошибки? Кроме того, вы думали об использовании словаря и функции .exists вместо vlookup.   -  person Nathan_Sav    schedule 18.07.2016
comment
он просто возвращает '#ЗНАЧ! ошибка, а в vba (немедленное окно) я пробовал с этой строкой ? GetLastDate("53421",AF1:AF1290,L1:L1290), но потом говорил Ожидаемый список или разделитель)   -  person Jey    schedule 18.07.2016
comment
Вам нужно использовать Range("AF1:AF1290") или [AF1:AF1290] при вызове функции из непосредственного окна.   -  person arcadeprecinct    schedule 18.07.2016
comment
@arcadeprecinct, это правда, я сделал, как вы сказали, и получил сообщение об ошибке «Невозможно получить свойство Vlookup из класса Worksheetfunction». буду работать над этой ошибкой   -  person Jey    schedule 18.07.2016


Ответы (1)


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

Но в этом случае вы можете использовать Collection для отслеживания уникального набора дат, который у вас уже есть:

Public Function GetLastDate(Carrier As String, CarrierVector As Range, 
                            DateVector As Range) As Variant
    Dim TempRange As New Collection
    Dim i As Integer
    Dim found As Boolean
    Dim max As Date
    For i = 1 To DateVector.Rows.Count
        With Application.WorksheetFunction
            If .Text(CarrierVector.Item(i), "#") = Carrier Then
                On Error Resume Next
                    found = TempRange.Item(DateVector.Item(i) & "")
                On Error GoTo 0
                If Not found Then
                    TempRange.Add DateVector.Item(i), DateVector.Item(i) & ""
                    If DateVector.Item(i) > max Then max = DateVector.Item(i)
                End If
            End If
        End With
    Next i
    GetLastDate = max
End Function

Тем не менее, я не уверен, зачем вам вообще нужно использовать этот TempRange, поскольку вы не используете его ни для чего другого. Вы могли бы также полностью отказаться от него:

Public Function GetLastDate(Carrier As String, CarrierVector As Range,
                            DateVector As Range) As Variant
    Dim i As Integer
    Dim found As Boolean
    Dim max As Date
    For i = 1 To DateVector.Rows.Count
        With Application.WorksheetFunction
            If .Text(CarrierVector.Item(i), "#") = Carrier Then
                If DateVector.Item(i) > max Then max = DateVector.Item(i)
            End If
        End With
    Next i
    GetLastDate = max
End Function
person trincot    schedule 18.07.2016
comment
первый UDF был тем, чего я хотел достичь, большое спасибо - person Jey; 18.07.2016