cre*_*ret 5 arrays excel wildcard vlookup
我在一张纸上的一列中有一个值列表。在另一张纸上我有两列。一个是通配符列表,另一个是另一个值列表。在第一张工作表上的列旁边,我想要一个附加列来包含一个公式,该公式将根据第二张工作表中的通配符检查第一列中的值。如果找到匹配项,则应显示该通配符旁边的值。
有什么办法可以做到这一点吗?已经研究了好几个小时了,但我无法让它工作。
提前致谢。
一些示例数据:
第一张
A栏
随机不必要的数据有用的123信息更多垃圾
更多随机的东西重要456垃圾垃圾垃圾
重要456还有很多垃圾
更多垃圾有用的东西789INFO垃圾
B栏
<some formula>
<some formula>
”
”
ETC。
第二张
A栏
*usefulthings???INFO*
*important456*
B栏
有用的东西 - 信息
重要 456
我想<some formula>
对照工作表 2 中的表格检查其旁边的工作表 1 列 A 中的值。如果工作表 2 列 A 中的通配符之一匹配,则包含公式的单元格应显示工作表 2 列 B 中的内容。
如果我没猜错的话,你想要这样的东西(在 B1 中,然后抄下来):
\n\n=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))),"")\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n\nctrl这是一个数组公式,必须用+ shift+确认enter。
\n
\n左侧是包含查找项的工作表 1,右侧是包含通配符列表和值的工作表 2。
编辑
\n要自动调整范围,只需使用以下公式:
=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))),"")\n
Run Code Online (Sandbox Code Playgroud)\n\n是的,只会输出第一个值...如果您想获取多个值,您可以使用此公式(与 B1 中一样,然后向下复制,这次也向左复制):
\n\n*\xc2\xb2 =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)),""),"")\n
Run Code Online (Sandbox Code Playgroud)\n\n但请记住,使用公式的单元格越多(最后一个公式最多),所有公式都会减慢 Excel 的速度。如果您的列表很长,我建议使用 UDF。
\n\n编辑2
\n\n为了再次加快速度,您可以对 C1 使用此公式(向下/向右复制)(仅对 B 列使用最后一个公式):
\n\n=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)),""),""))\n
Run Code Online (Sandbox Code Playgroud)\n\n另请记住,所有公式都是数组公式;)
\n\n*\xc2\xb2 如果对 B 列使用第一个 EDIT 公式,对 C+ 列使用 EDIT 2 公式,则不需要第二个 EDIT 公式。
\n\n编辑3
\n\n对于 UDF 方式,请转到 VBA 编辑器(点击alt+ F11),然后选择“插入”->“模块”。然后在该模块的代码窗口中输入:
\n\nOption Explicit\n\nPublic Function getLikeLookup(str As String, rng As Range, Optional nCou As Long, Optional outCol As Range) As String\n\n \'for not case sensitive\n str = LCase(str)\n\n \'set ranges\n If nCou < 1 Then nCou = 1\n If outCol Is Nothing Then Set outCol = rng.Offset(, rng.Columns.Count - 1).Resize(, 1)\n Set rng = Intersect(rng.Resize(, 1), rng.Parent.UsedRange.EntireRow)\n Set outCol = Intersect(outCol.Resize(, 1), outCol.Parent.UsedRange.EntireRow)\n\n \'get check-array (will be faster than running the sheet directly)\n Dim inArr As Variant\n inArr = rng.Value\n\n \'run checks\n Dim i As Long\n For i = 1 To UBound(inArr)\n \'If str Like inArr(i, 1) Then nCou = nCou - 1\n If str Like LCase(inArr(i, 1)) Then nCou = nCou - 1 \'for not case sensitive\n If nCou = 0 Then Exit For\n Next\n\n \'check for valid output\n If i > UBound(inArr) Or i > outCol.Rows.Count Then Exit Function\n\n \'set output\n getLikeLookup = outCol.Offset(i - 1).Resize(1, 1).Value\n\nEnd Function\n
Run Code Online (Sandbox Code Playgroud)\n\n现在您可以像其他工作表函数一样使用 UDF。对此要详细解释一下。
\n\ngetLikeLookup(lookup_string,lookup_range,[#_occurrence,[output_range]])\n
Run Code Online (Sandbox Code Playgroud)\n\nlookup_string
:要检查的字符串(整个字符串,不适用于占位符)
lookup_range
:此范围内最左边的列将被检查为类似 lookup_string
。如果output_range
省略,则最右边的列lookup_range
将用于输出。
#_occurrence
:[可选] 指示要输出的匹配项。如果省略(如 1),则将选择第一个。
output_range
:[可选] 中的第一列output_range
将用于输出。
现在您可以使用示例(从 B1 开始):
\n\n=getLikeLookup($A1,Sheet2!$A:$B,COLUMN()-1)\n
Run Code Online (Sandbox Code Playgroud)\n\n为了加快速度,请使用(仍然从 B1 开始):
\n\n=IF(A1="","",getLikeLookup($A1,Sheet2!$A:$B,COLUMN()-1))\n
Run Code Online (Sandbox Code Playgroud)\n\n这两个公式不是数组,只需点击即可确认enter。
\n