繁体   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