簡體   English   中英

Excel:使用vlookup但在數組中使用通配符

[英]Excel: using vlookup but with wildcards in the array

我在一張紙上的列中有一個值列表。 在另一張紙上,我有兩列。 一個是通配符列表,另一個是另一個值列表。 在第一張工作表的列旁邊,我想要一個額外的列來包含一個公式,該公式將根據第二個工作表中的通配符檢查第一列中的值。 如果找到匹配項,則應顯示該通配符旁邊的值。

有沒有辦法做到這一點? 已經好幾個小時,我無法讓它工作。

提前致謝。

一些樣本數據:

第一張

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中的內容。

如果我說得對,你想要這樣的東西(在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 + shift + enter確認

在此輸入圖像描述
左邊是帶有查找詞的第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。

編輯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列的第一個EDIT公式和C +列的EDIT 2公式,則不需要第二個EDIT公式。

編輯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個公式沒有數組,可以通過點擊輸入來確認。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM