用户定义的函数不起作用 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
我有这个 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