我在一张纸上的列中有一个值列表。在另一张纸上,我有两列。一个是通配符列表,另一个是另一个值列表。在第一张工作表的列旁边,我想要一个额外的列来包含一个公式,该公式将根据第二个工作表中的通配符检查第一列中的值。如果找到匹配项,则应显示该通配符旁边的值。
有没有办法做到这一点?已经好几个小时,我无法让它工作。
提前致谢。
一些示例数据:
第一张
A栏
randomunnecessarydataUSEFULTHINGS123INFOmoregarbage
morerandomstuffIMPORTANT456junkjunkjunk
IMPORTANT456lotsofmorejunk
morejunkUSEFULTHINGS789INFOgarbage
B栏
<some formula>
<some formula>
“
“
等
第二张
A栏
*usefulthings???INFO*
*important456*
B栏
有用的东西 - 信息
重要456
我希望<some formula>
根据工作表2中的表检查其旁边的工作表1列A中的值。如果工作表2列A中的某个通配符匹配,则包含该公式的单元格应显示其中的内容第2栏B栏。
答案 0 :(得分: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 + shift + 输入确认。
左边是带有查找词的第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 )并在那里“插入” - &gt; “模块”。然后输入此模块的代码窗口:
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))
这两个公式没有数组,可以通过点击 enter 来确认。