用户定义的函数不起作用 vba

user defined function doesn't work 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

在这种情况下,如果在 CarrierVector 上找到了 Carrier 变量,则对应于该载体的 Date 将存储在 TempRange 数组中(如果不重复的话),最后,它将 return最新的日期,但这不起作用,它只是 return 调用函数的单元格上的错误,你能帮我吗?

问题似乎出在 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