带多个条件的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
但是我需要这个VLOOKUP来比较多个匹配条件的返回值。
任何想法如何可以升级?
谢谢。 更新如下:
数据表:
我需要公式来返回A1-1A和A.0002匹配的单元格中的值。 结果应该是8 3
这是一个稍微不同的方法。
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
它可以让你确定是否在你的分隔符,或者只是一个空间或任何你想要放在返回值之间。
第二个标准询问您是否要返回任何空的空白空间。
第三,你会把一个IF()的数组forms,它使用你想过滤返回值的条件。
所以在你的例子中,你可以使用这个数组forms:
=TEXTJOIN(" ",TRUE,IF((A2:A7="A")*(B2:B7=2),C2:C7,""))
" "
表示我们需要一个值之间的空格。
TRUE
意味着我们跳过任何空白,这是非常重要的,因为我们发送空白值时,没有filter的理由。
IF((A2:A7="A")*(B2:B7=2),C2:C7,"")
循环遍历列,并在两个布尔检验都为TRUE时返回值,否则返回空格。
存在和数组公式必须在退出编辑模式而不是Enter时用Ctrl-Shift-Enter确认。 如果正确完成,则Excel将在公式周围放置{}
。
如果你想返回完整的列,你可以简单地使用:
=TEXTJOIN(" ",TRUE,C2:C7)
以常规的forms,它将在一个单元中返回8 3 3 9 2 3
。
注意
如果您有Office 365 Excel,则TEXTJOIN
是一种本地存在的公式,这两种公式都是在上面input的公式。
您只需使用上述的公式,而不是使用vba代码。