我在单元格中有以下信息
| John Smith 34, Manager |
| Jane Doe 25, Assistant |
| Lucio 32, Web Developer |
我还有另一份名单,上面有名字
| Lucio |
| John Smith |
| Jane Doe |
| Samuel L Jackson |
[已编辑以澄清问题]
我想要做的是解析第一组单元格中的数据,将名称与第二组单元格中的信息进行比较,如果匹配则输出 1。
我该如何在 Excel 2013 中执行此操作?
编辑:我认为由于我的错误,许多答案都误解了列表需要逐个单元格匹配。我只需要确保第一个列表中的名称正确,并且它们至少与第二个列表中的一个匹配。
答案1
根据您的描述,完成您要求的操作的最简单方法是编写 VBA 宏作为公式。但您的问题太模糊了。例如,您需要说明第一个列表是否包含第二个列表中没有的名称。如果第二个列表包含第一个列表中没有的名称。同样,在您的示例中,第一个列表的第 1 项与第二个列表的第 1 项匹配,第 2 项和第 3 项也是如此。您只是匹配第二个列表中的相应行还是匹配整个列表?我可以做出假设,但希望当我说您的问题太模糊时,您明白我的意思。
答案2
这可能对你有用。
如果您的第一个列表在 A1:A3 中,而第二个列表在 D1:D3 中,则在单元格 E1 中输入以下内容:
=IFERROR(IF(MATCH(D1,LEFT($A$1:$A$3,LEN(D1)),0)>0,1,0),0)
使用 CTRL+Shift+Enter 使其成为数组公式。然后复制并粘贴下来。
我在额外的单元格中使用错误值进行了检查D4=Donald
,如果没有完全匹配,它将返回 0。
编辑:
我应该解释一下这个公式的工作方式,它将获取原始列表A1:A3
,并将其缩减为我们要检查的单元格中的字符数量D1
。
将LEFT($A$1:$A$3,LEN(D1))
返回一个包含 3 个值的数组:
{"John Smith";"Jane Doe 2";"Lucio 32, "}
。
从此列表中,我们寻找John Smith
一个完全匹配(不区分大小写),并且由于只有一个,所以它返回1
。
例如,在 中D2
,要检查的新值的结果数组是:
{"John Smi";"Jane Doe";"Lucio 32"}
因为我们正在寻找Jane Doe
,所以有一个完全符合的匹配项,因此1
返回。
答案3
如果NameList
指的是包含您的姓名列表的范围(例如:$J$8:$J$10):
此公式必须数组输入:
=COUNT(FIND(NameList,A1))
到数组输入公式,在单元格或公式栏中输入公式后,按住 并点击 。如果操作正确,Excel 会在公式周围放置括号 {...}。
答案4
如果我错了,请纠正我,但我理解你的问题的是主题文本和搜索字符串已经以特定的顺序存在,你只是想比较这两个字符串。即
| John Smith 34, Manager | John Smith |
| Jane Doe 25, Assistant | Jane Doe |
| Lucio 32, Web Developer | Lucio |
我使用substitute()
方法来避免过度使用iferror()
。您可以比较主题文本的长度(“haystack”)与 haystack 的长度,替换搜索字符串(“needle”)。
= LEN(haystack) - LEN( SUBSTITUTE(haystack, needle, "") ) > 0
// Analysis of a matching example
- LEN("John Smith 34, Manager") = 22
- SUBSTITUTE("John Smith 34, Manager", "John Smith", "") = " 34, Manager"
- LEN(" 34, Manager") = 10
- (22 - 10) > 0 = TRUE
// Analysis of a non-matching example
- LEN("John Smith 34, Manager") = 22
- SUBSTITUTE("John Smith 34, Manager", "Lucio", "") = "John Smith 34, Manager"
- LEN("John Smith 34, Manager") = 22
- (22 - 22) > 0 = FALSE
在上面的例子中,你只需使用=LEN(A1)-LEN(SUBSTITUTE(A1,B1,""))>0
。另请注意,你可以通过以下方式执行不区分大小写的比较SUBSTITUTE(UPPER(haystack), UPPER(needle), "")
我更喜欢这种方法iferror(find(needle, haystack)>0,false)
,因为错误处理是固有的 - 更多的是一种哲学,即错误处理应该在宏观层面而不是公式化地进行。
此外,如果您更喜欢二进制输出(0, 1
)而不是布尔输出(TRUE, FALSE
),您可以将函数包装在其中INT()
(即INT(TRUE)
= 1,INT(FALSE)
= 0)。