arrays - Excel:使用 vlookup 但在数组中使用通配符

标签 arrays excel wildcard vlookup

我在一张纸上的一列中有一个值列表。在另一张纸上我有两列。一个是通配符列表,另一个是另一个值列表。在第一张工作表上的列旁边,我想要一个附加列来包含一个公式,该公式将根据第二张工作表中的通配符检查第一列中的值。如果找到匹配项,它应该显示该通配符旁边的值。

有什么办法可以做到这一点吗?我已经研究了几个小时了,但无法让它工作。

提前致谢。

一些示例数据:

第一张

A列

随机不需要的数据USEFULTHINGS123INFO更多垃圾

morerandomstuffIMPORTANT456junkjunkjunk

重要456很多垃圾

更多垃圾有用的东西789INFO垃圾

B 列

<some formula>

<some formula>

"

"

等等

第二张

A列

*usefulthings???INFO*

*important456*

B 列

有用的东西 - 信息

重要456

我希望 <some formula> 对照工作表 2 中的表格检查工作表 1 旁边的 A 列中的值。如果工作表 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))),"")

This is an array formula and must be confirmed with ctrl+shift+enter.

enter image description here
左侧是包含查找项的工作表 1,右侧是包含通配符列表和值的工作表 2。

编辑
要自动调整范围,只需使用以下公式:

=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))

这两个公式不是数组,只需按回车即可确认。

关于arrays - Excel:使用 vlookup 但在数组中使用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215774/

相关文章:

c - 用 C 语言解决迷宫问题并打印正确路径

javascript 按内部数据对数组进行排序

c# - 如何检查数组列表中是否存在数组

vba - 将包含行的范围复制到另一个工作表

excel - 跳过 IF/CountIf 中的单元格

java - 我的数组生成算法坏了

excel - 合并两个查询而不在 Power Query 中重复行

javascript - 如何使用 Javascript Regex 从字符串中获取数据

c - 在 C 中使用通配符查找文件名

jQuery:removeClass 中的通配符类选择器