2016-05-13 82 views
4

我在一張紙上的列中有一個值列表。在另一張紙上,我有兩列。一個是通配符列表,另一個是另一個值列表。在第一個工作表的列旁邊,我想要一個附加列包含一個公式,該公式將檢查第一列中的值與第二個工作表中的通配符。如果找到匹配項,它應該顯示該通配符旁邊的值。Excel:使用vlookup,但在數組中使用通配符

有沒有辦法做到這一點?一直在它幾個小時,我不能得到它的工作。

在此先感謝。

某些樣本數據:

表一個

列A

randomunnecessarydataUSEFULTHINGS123INFOmoregarbage

morerandomstuffIMPORTANT456junkjunkjunk

IMPORTANT456lotsofmorejunk

morejunkUSEFULTHINGS789INFOgarbage

列B

<some formula>

<some formula>

表二

列A

*usefulthings???INFO*

*important456*

列B

有用的東西 - 信息

重要456

我希望<some formula>檢查工作表1列A中與工作表2中的表格相對的值。如果工作表2列A中的某個通配符匹配,則包含公式的單元格應顯示工作表2列B中的內容。

+1

有些數據會有所幫助。請模擬一些數據,並使用編輯選項 –

回答

1

如果我得到了你的權利,你想是這樣的(在B1,然後複製下來):

=IF(MIN(IFERROR(MATCH(Sheet2!$A$1:$A$100,A1,0)*ROW($1:$100),FALSE)),INDEX(Sheet2!B:B,MIN(IFERROR(MATCH(Sheet2!$A$1:$A$100,A1,0)*ROW($1:$100),FALSE))),"") 

這是一個數組公式,必須以CTRL + 移來證實 + 輸入

enter image description here
左是片1與查找術語和右與通配符列表和值SHEET2。

編輯
要自動量程它只是使用這個公式:

=IF(MIN(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!A:A,MATCH("zzz",Sheet2!A:A)),A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE)),INDEX(Sheet2!B:B,MIN(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!A:A,MATCH("zzz",Sheet2!A:A)),A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE))),"") 

是的,只有第一個值將被輸出......如果你想獲得多個值,你可以使用這個公式(如總是B1,然後複製下來,這個時候也到左):

*² =IFERROR(IF(SMALL(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A)),$A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE),COLUMN()-1),INDEX(Sheet2!$B:$B,SMALL(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A)),$A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE),COLUMN()-1)),""),"") 

但是請記住,所有的公式將您的Excel減慢更多的細胞使用他們(最後一個)。如果你的名單很長,我建議一個UDF。

EDIT 2

要再次加快了一點了,你可以用這個公式C1(抄下/右)(只需使用最後一個公式僅列B):

=IF(B1="","",IFERROR(IF(SMALL(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A)),$A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE),COLUMN()-1),INDEX(Sheet2!$B:$B,SMALL(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A)),$A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE),COLUMN()-1)),""),"")) 

另外請記住,所有的公式都是數列公式;)

*²如果使用列B的第一個編輯公式和列C +的編輯2公式,則不需要第二個編輯公式。

編輯3

對於UDF路去你的VBA編輯器(打ALT + F11 ),並有 「插入」 - > 「模塊」。然後把在代碼窗口此模塊:

Option Explicit 

Public Function getLikeLookup(str As String, rng As Range, Optional nCou As Long, Optional outCol As Range) As String 

    'for not case sensitive 
    str = LCase(str) 

    'set ranges 
    If nCou < 1 Then nCou = 1 
    If outCol Is Nothing Then Set outCol = rng.Offset(, rng.Columns.Count - 1).Resize(, 1) 
    Set rng = Intersect(rng.Resize(, 1), rng.Parent.UsedRange.EntireRow) 
    Set outCol = Intersect(outCol.Resize(, 1), outCol.Parent.UsedRange.EntireRow) 

    'get check-array (will be faster than running the sheet directly) 
    Dim inArr As Variant 
    inArr = rng.Value 

    'run checks 
    Dim i As Long 
    For i = 1 To UBound(inArr) 
    'If str Like inArr(i, 1) Then nCou = nCou - 1 
    If str Like LCase(inArr(i, 1)) Then nCou = nCou - 1 'for not case sensitive 
    If nCou = 0 Then Exit For 
    Next 

    'check for valid output 
    If i > UBound(inArr) Or i > outCol.Rows.Count Then Exit Function 

    'set output 
    getLikeLookup = outCol.Offset(i - 1).Resize(1, 1).Value 

End Function 

現在你可以使用你的UDF像其他工作表函數。詳細解釋這一點。

getLikeLookup(lookup_string,lookup_range,[#_occurrence,[output_range]]) 
  • lookup_string:要檢查對字符串(整個字符串,不佔位工作)

  • lookup_range:在此範圍內的最左邊的列將被檢查爲lookup_string。如果output_range被省略,則lookup_range中最右邊的列將用於輸出。

  • #_occurrence:[可選]表示哪個匹配輸出。如果省略(比如1)將會被挑選出來。

  • output_range:[可選] output_range中的第一列將用於輸出。

現在的例子中,你可以使用(在B1開始):

=getLikeLookup($A1,Sheet2!$A:$B,COLUMN()-1) 

,並加速它一點使用(在B1仍然開始):

=IF(A1="","",getLikeLookup($A1,Sheet2!$A:$B,COLUMN()-1)) 

這2公式不是陣列,只需擊中即可確認輸入

+0

將它放在原始文章中。讓我去測試一下。在此期間,有沒有100行限制的任何方式? – creepblockedunderturret

+0

另外我猜如果一個值匹配多個通配符,它​​會與列表中的第一個匹配? – creepblockedunderturret

+0

我不會完全反對在這裏使用結構化引用以及工作表2中的數據在標題爲 – creepblockedunderturret