Excel 在一个单元格中返回值的具有多个条件的VLOOKUP

Excel 在一个单元格中返回值的具有多个条件的VLOOKUP,excel,vlookup,vba,Excel,Vlookup,Vba,我发现这个VBA能够使用一个匹配条件将所有匹配值返回到一个单元格中: Function MYVLOOKUP(pValue As String, pWorkRng As Range, pIndex As Long) 'Update 20150310 Dim rng As Range Dim xResult As String xResult = "" For Each rng In pWorkRng If rng = pValue Then xResult = xResul

我发现这个VBA能够使用一个匹配条件将所有匹配值返回到一个单元格中:

Function MYVLOOKUP(pValue As String, pWorkRng As Range, pIndex As Long)
'Update 20150310
Dim rng As Range
Dim xResult As String
xResult = ""
For Each rng In pWorkRng
    If rng = pValue Then
        xResult = xResult & " " & rng.Offset(0, pIndex - 1)
    End If
Next
MYVLOOKUP = xResult
End Function
但是我需要这个VLOOKUP来返回与多个匹配条件相比较的值

你知道如何升级吗

谢谢。 更新如下:

数据表:


我需要公式来返回A1-1A和A.0002匹配的单元格中的值。结果应该是83

这里有一个稍微不同的方法

Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
    Dim d As Long
    Dim c As Long
    Dim arr2()
    Dim t As Long, y As Long
    t = -1
    y = -1
    If TypeName(arr) = "Range" Then
        arr2 = arr.Value
    Else
        arr2 = arr
    End If
    On Error Resume Next
    t = UBound(arr2, 2)
    y = UBound(arr2, 1)
    On Error GoTo 0
    
    If t >= 0 And y >= 0 Then
        For c = LBound(arr2, 1) To UBound(arr2, 1)
            For d = LBound(arr2, 1) To UBound(arr2, 2)
                If arr2(c, d) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                End If
            Next d
        Next c
    Else
        For c = LBound(arr2) To UBound(arr2)
            If arr2(c) <> "" Or Not skipblank Then
                TEXTJOIN = TEXTJOIN & arr2(c) & delim
            End If
        Next c
    End If
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
End Function
表示我们希望值之间有一个空格

TRUE意味着我们跳过任何空格,这一点很重要,因为当值未被过滤器对齐时,我们会发送空格

当两个布尔测试均为真时,IFA2:A7=A*B2:B7=2,C2:C7循环遍历列并返回值,否则返回空白

当退出编辑模式而不是Enter时,必须使用Ctrl-Shift-Enter确认是否存在和数组公式。如果操作正确,Excel将在公式周围放置{}

如果要返回完整列,只需使用:

=TEXTJOIN(" ",TRUE,C2:C7)
以正则形式,它将在一个单元格中返回8 3 9 2 3

如果您有Office 365 Excel TEXTJOIN,则它是一个本机存在的公式,在上述两种情况下都是这样输入的

Office 365还具有过滤器,我们可以使用:

=TEXTJOIN(" ",TRUE,FILTER(C2:C7,(A2:A7="A")*(B2:B7=2),""))
 

这里有一个稍微不同的方法

Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
    Dim d As Long
    Dim c As Long
    Dim arr2()
    Dim t As Long, y As Long
    t = -1
    y = -1
    If TypeName(arr) = "Range" Then
        arr2 = arr.Value
    Else
        arr2 = arr
    End If
    On Error Resume Next
    t = UBound(arr2, 2)
    y = UBound(arr2, 1)
    On Error GoTo 0
    
    If t >= 0 And y >= 0 Then
        For c = LBound(arr2, 1) To UBound(arr2, 1)
            For d = LBound(arr2, 1) To UBound(arr2, 2)
                If arr2(c, d) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                End If
            Next d
        Next c
    Else
        For c = LBound(arr2) To UBound(arr2)
            If arr2(c) <> "" Or Not skipblank Then
                TEXTJOIN = TEXTJOIN & arr2(c) & delim
            End If
        Next c
    End If
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
End Function
表示我们希望值之间有一个空格

TRUE意味着我们跳过任何空格,这一点很重要,因为当值未被过滤器对齐时,我们会发送空格

当两个布尔测试均为真时,IFA2:A7=A*B2:B7=2,C2:C7循环遍历列并返回值,否则返回空白

当退出编辑模式而不是Enter时,必须使用Ctrl-Shift-Enter确认是否存在和数组公式。如果操作正确,Excel将在公式周围放置{}

如果要返回完整列,只需使用:

=TEXTJOIN(" ",TRUE,C2:C7)
以正则形式,它将在一个单元格中返回8 3 9 2 3

如果您有Office 365 Excel TEXTJOIN,则它是一个本机存在的公式,在上述两种情况下都是这样输入的

Office 365还具有过滤器,我们可以使用:

=TEXTJOIN(" ",TRUE,FILTER(C2:C7,(A2:A7="A")*(B2:B7=2),""))
 

你能给我们举一些例子吗//你的数据是什么样子的?你能给我们举一些例子吗//你的数据是什么样子的?如果列按顺序混在一起会有区别吗?由于当前的顺序是A B C,如果是C A B怎么办?@Martin一点也不,只要更改范围以匹配即可。并确保使用Ctrl-Shift-enter而不是enter将其作为数组输入。哪个选项的计算时间更长?在自身上使用VBA或公式?您会推荐哪一种,因为我期待处理大约15k-20k行。如果您有Office 365 excel,请使用公式。如果你不这样做,那么我会使用我上面所显示的。不要使用完整的列引用,但要将引用限制在实际的数据集上。如果列按顺序混在一起,会有区别吗?由于当前的顺序是A B C,如果是C A B怎么办?@Martin一点也不,只要更改范围以匹配即可。并确保使用Ctrl-Shift-enter而不是enter将其作为数组输入。哪个选项的计算时间更长?在自身上使用VBA或公式?您会推荐哪一种,因为我期待处理大约15k-20k行。如果您有Office 365 excel,请使用公式。如果你不这样做,那么我会使用我上面所显示的。不要使用完整列引用,但将引用限制在实际数据集。