2017-07-07 46 views
1

我目前使用查找函数返回多个值。我从Extend Office获得了这个功能。 https://www.extendoffice.com/documents/excel/2706-excel-vlookup-return-multiple-values-in-one-cell.html使用查找函数返回过滤值列表

我想编辑代码以迎合我的需求它可以进一步将多个值过滤为我所需要的值。我目前正在使用Instr函数返回仅以用户键入的字母开始的值。但是,该函数无法正常工作,因为结果会显示“#VALUE!”。我不知道我出错的地方。例如,我在工作表本身的函数中使用了'MYVLOOKUP(C2,Table!A:B,2,“J”)''键。这意味着我只想返回以'J'开头的值,但它返回#VALUE !.

Function MYVLOOKUP(pValue As String, pWorkRng As Range, pIndex As Long, 
filter As String) 
Dim rng As Range 
Dim xResult As String 
Dim result As Integer 

xResult = vbNullString 
'the next line trims pWorkRng down to the .UsedRange 
Set pWorkRng = Intersect(pWorkRng, pWorkRng.Parent.UsedRange) 

For Each rng In pWorkRng 
    If rng = pValue Then 
     result = InStr(rng.Value, filter, vbTextCompare) 
     If result = 1 Then 
     xResult = xResult & rng.Offset(0, pIndex - 1) & "," 
     Else 
     End If 
    End If 
Next 
MYVLOOKUP = Trim(xResult) 
End Function 
+0

请详细说明* “无法工作” *,并显示一个例子用例。 –

+0

你首先检查'If rng = pValue',然后如果它以'filter'开头,这个双重检查就没有意义。要么搜索完全匹配,要么搜索以某物开头的内容。 –

+0

我不能返回多个值,它将值的范围缩小到只让'J'开始? –

回答

1

我认为你正在寻找这个UDF:

Function MYVLOOKUP(pValue As String, pWorkRng As Range, pIndex As Long, _ 
        Optional filter As String = "*") 
    Dim rng As Range, ret As String 
    For Each rng In Intersect(pWorkRng.Columns(1), pWorkRng.Parent.UsedRange) 
    If rng Like pValue Then If rng(1, pIndex) Like filter Then _ 
     ret = ret & IIf(Len(ret), ",", "") & rng(1, pIndex) 
    Next 
    MYVLOOKUP = ret 
End Function 

注意如何使用它:

  • 第一个参数是第一列完全匹配。您可以在里面使用通配符(*)(如"xx*")以匹配任何以"xx""*yy*"开头的内容,以匹配任何包含"yy"的内容。

  • 最后一个参数是一个类似的过滤器,但在返回的值。因此,您可以使用"J*"将返回值限制为以"J"开头的值。此参数为可选:如果您不想进行任何筛选,则可以省略该参数。

  • 返回值是所有找到的匹配的逗号分隔列表。

例子:

enter image description here

+1

非常感谢!你是一个救星!它现在有效 –

+0

“J *”表示包含J不是以“J”开头的? –

+0

@RachelChia使用'“J *”'表示“以J开头”,“'”* J“'表示”以J结尾“,而”* J *“表示”包含J“:) –