2017-07-07 60 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「:) –