简体   繁体   English

用于在 vlookup 中连接多个匹配项的 UDF 问题

[英]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

Concatenate Multiple连接多个

When using Range or Cells etc. without qualifiers, they refer to the ActiveSheet of the ActiveWorkbook .当使用 Range 或 Cells 等不带限定符时,它们指的是ActiveWorkbookActiveSheet

The Code编码

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM