[英]Problem with UDF designed to concatenate multiple matches in vlookup
For the life of me, I can't figure out why this isn't working.对于我的生活,我无法弄清楚为什么这不起作用。 It gives me a #VALUE error.它给了我一个 #VALUE 错误。
I'm using ActiveSheet because I'll put it on a number of different sheets, and I don't want to have to add a field in the function for that.我正在使用 ActiveSheet,因为我会将它放在许多不同的工作表上,而且我不想为此在函数中添加一个字段。
LookupRange is designed to find the last row with data in it on ActiveSheet. LookupRange 旨在查找 ActiveSheet 上包含数据的最后一行。
My lookup values begin in B5 and extend indefinitely, and the desired matches are in Column O (15th column).我的查找值从 B5 开始并无限期扩展,所需的匹配项位于 O 列(第 15 列)中。
Function EmailConcat(LookupValue As String)
Application.Volatile
Dim i As Long
Dim Result As String
Dim LookupSheet As Worksheet
Dim LookupRange As Range
Set LookupSheet = Application.ActiveSheet
LookupRange = LookupSheet.Cells.Find(What:="*", SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Row
For i = 5 To LookupRange.Rows.Count
If LookupSheet.Cells(i, 2) = LookupValue Then
Result = Result & LookupSheet.Cells(i, 15) & "; "
End If
Next i
EmailConcat = Left(Result, Len(Result) - 2)
End Function
Using ThisCell
to ensure results are accurate, and reading the lookup column into an array for better performance:使用ThisCell
确保结果准确,并将查找列读入数组以获得更好的性能:
Function EmailConcat(LookupValue As String)
Application.Volatile
Dim vals, rv, i As Long, sep As String
If LookupValue <> "" Then
With Application.ThisCell.Worksheet
vals = .Range(.Range("B5"), .Cells(.Rows.Count, 2).End(xlUp))
For i = 1 To UBound(vals, 1)
If vals(i, 1) = LookupValue Then
rv = rv & sep & .Cells(4 + i, 15).Value
sep = "; "
End If
Next i
End With
End If
EmailConcat = rv
End Function
When using Range or Cells etc. without qualifiers, they refer to the ActiveSheet
of the ActiveWorkbook
.当使用 Range 或 Cells 等不带限定符时,它们指的是ActiveWorkbook
的ActiveSheet
。
Function EmailConcat(LookupValue As String)
Application.Volatile
Const cFirst As String = "B5"
Const cCol As Variant = "O"
Dim i As Long
Dim Result As String
Dim LastRow As Long
LastRow = Cells.Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row
For i = Range(cFirst).Row To LastRow
If Cells(i, Range(cFirst).Column) = LookupValue Then
Result = Result & Cells(i, cCol) & "; "
End If
Next i
EmailConcat = Left(Result, Len(Result) - 2)
End Function
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.