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

Mar*_*tin 1 excel vba vlookup

我发现这个 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
Run Code Online (Sandbox Code Playgroud)

但是我需要这个 VLOOKUP 来返回与多个匹配条件相比的值。

任何想法如何升级?

谢谢。更新如下:

数据表: 在此处输入图片说明

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

Sco*_*ner 6

这是一种稍微不同的方法。

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
Run Code Online (Sandbox Code Playgroud)

它允许您确定分隔符,因为您可以,在返回值之间放置一个空格或任何您想要放置的内容。

第二个条件询问您是否要为任何空的空间返回一个空的空间。

第三个你会放置一个 IF() 的数组形式,它使用你想要过滤返回值的条件。

因此,在您的实例中,您将以数组形式使用它:

=TEXTJOIN(" ",TRUE,IF((A2:A7="A")*(B2:B7=2),C2:C7,""))
Run Code Online (Sandbox Code Playgroud)

" "说,我们想要的值之间的空间。

TRUE意味着我们跳过任何空白,这很重要,因为当过滤器未证明值合理时我们发送空白。

IF((A2:A7="A")*(B2:B7=2),C2:C7,"")通过列和返回值的周期当两个布尔测试是TRUE,如果没有它返回一个空白。

当退出编辑模式而不是 Enter 时,必须使用 Ctrl-Shift-Enter 来确认和数组公式。如果正确完成,那么 Excel 将{}围绕公式。

在此处输入图片说明


如果你想返回完整的列,你可以简单地使用:

=TEXTJOIN(" ",TRUE,C2:C7)
Run Code Online (Sandbox Code Playgroud)

以常规形式,它会8 3 3 9 2 3在一个单元格中返回。


笔记

如果你有 Office 365 ExcelTEXTJOIN是一个本机存在的公式,在两种情况下都像上面一样输入。

Office 365 也有 FILTER,我们可以使用:

=TEXTJOIN(" ",TRUE,FILTER(C2:C7,(A2:A7="A")*(B2:B7=2),""))
 
Run Code Online (Sandbox Code Playgroud)