【问题标题】:Check a cell contains the same count of each letter and number as an adjacent cell检查一个单元格包含与相邻单元格相同的每个字母和数字的计数
【发布时间】:2022-11-17 20:34:42
【问题描述】:

概括

我想检查一个单元格是否包含与它旁边的单元格相同数量的 a-z 中的每个字母和 0-9 中的数字。顺序无关紧要,但字符数很重要。例如,如果一个单元格包含“flat 1, 32 test road”,而它旁边的单元格包含“32, flat 1, test road”,它将匹配,因为它们都包含 3 t's, 2 a's, 1 l, ETC。)。

示例表

下面是预期输出的示例,公式填充在 C 列中:

Data 1 Data 2 Match?
123 test road testroad123 MATCH
FOOBAR 34 FOO,/,34BAR MATCH
HELLOWORLD1 HELLOWORLD2 NO MATCH
FLAT4,33 STREET NAME STREET NAME 33,FLAT 4 MATCH
12345 12345 Road NO MATCH

工作代码

目前,我首先将单元格的内容转换为小写,然后在IF(AND) 语句中分别检查 a-z 中的每个字母和 0-9 中的每个数字。它有效,但看起来很糟糕,而且无疑是非常低效和资源密集型的。代码如下: =IF(AND(LEN(A1)-LEN(SUBSTITUTE(A1,"a",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"a","")),LEN(A1)-LEN(SUBSTITUTE(A1,"b",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"b","")),LEN(A1)-LEN(SUBSTITUTE(A1,"c",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"c","")),LEN(A1)-LEN(SUBSTITUTE(A1,"d",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"d","")),LEN(A1)-LEN(SUBSTITUTE(A1,"e",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"e","")),LEN(A1)-LEN(SUBSTITUTE(A1,"f",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"f","")),LEN(A1)-LEN(SUBSTITUTE(A1,"g",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"g","")),LEN(A1)-LEN(SUBSTITUTE(A1,"h",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"h","")),LEN(A1)-LEN(SUBSTITUTE(A1,"i",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"i","")),LEN(A1)-LEN(SUBSTITUTE(A1,"j",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"j","")),LEN(A1)-LEN(SUBSTITUTE(A1,"k",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"k","")),LEN(A1)-LEN(SUBSTITUTE(A1,"l",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"l","")),LEN(A1)-LEN(SUBSTITUTE(A1,"m",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"m","")),LEN(A1)-LEN(SUBSTITUTE(A1,"n",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"n","")),LEN(A1)-LEN(SUBSTITUTE(A1,"o",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"o","")),LEN(A1)-LEN(SUBSTITUTE(A1,"p",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"p","")),LEN(A1)-LEN(SUBSTITUTE(A1,"q",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"q","")),LEN(A1)-LEN(SUBSTITUTE(A1,"r",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"r","")),LEN(A1)-LEN(SUBSTITUTE(A1,"s",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"s","")),LEN(A1)-LEN(SUBSTITUTE(A1,"t",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"t","")),LEN(A1)-LEN(SUBSTITUTE(A1,"u",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"u","")),LEN(A1)-LEN(SUBSTITUTE(A1,"v",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"v","")),LEN(A1)-LEN(SUBSTITUTE(A1,"w",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"w","")),LEN(A1)-LEN(SUBSTITUTE(A1,"x",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"x","")),LEN(A1)-LEN(SUBSTITUTE(A1,"y",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"y","")),LEN(A1)-LEN(SUBSTITUTE(A1,"z",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"z","")),LEN(A1)-LEN(SUBSTITUTE(A1,"0",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"0","")),LEN(A1)-LEN(SUBSTITUTE(A1,"1",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"1","")),LEN(A1)-LEN(SUBSTITUTE(A1,"2",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"2","")),LEN(A1)-LEN(SUBSTITUTE(A1,"3",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"3","")),LEN(A1)-LEN(SUBSTITUTE(A1,"4",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"4","")),LEN(A1)-LEN(SUBSTITUTE(A1,"5",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"5","")),LEN(A1)-LEN(SUBSTITUTE(A1,"6",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"6","")),LEN(A1)-LEN(SUBSTITUTE(A1,"7",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"7","")),LEN(A1)-LEN(SUBSTITUTE(A1,"8",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"8","")),LEN(A1)-LEN(SUBSTITUTE(A1,"9",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"9",""))),TRUE,FALSE)

正如您所看到的,它很碍眼。它有效,但我需要将其应用于至少 100,000 行数据,而且我相信它会过于密集而无法可靠地工作。当前的解决方案是遍历每个字母并确保它们的计数匹配,如果匹配则返回 TRUE。

结论

我有一个可行的解决方案,它给出了所需内容的示例,但它笨拙且不可靠。我希望有更好的方法来利用 Excel 以更有效地完成这项任务。在此先感谢您的时间!

我使用的是 MSO 365,Excel 版本 2202

【问题讨论】:

  • 这需要区分大小写吗?例如:ddD是否匹配DDd
  • 谢谢回复。这最好不是请区分大小写。我只是将所有内容都设为小写,因为替代公式区分大小写,如果一个大写而另一个不大写,就会不匹配。

标签: excel if-statement excel-formula compare comparison


【解决方案1】:

非常好的问题。这是一个会溢出结果的选项:

C2中的公式:

=BYROW(A2:B6,LAMBDA(x,COUNTA(UNIQUE(MAP(x,LAMBDA(a,CONCAT(LET(b,MID(a,SEQUENCE(LEN(a)),1),c,CODE(UPPER(b)),SORT(IFERROR(--b,IF((c>64)*(c<91),b,""))))))),1))))=1

简而言之:

  • BYROW() - 遍历数据集中的每一行;
  • MAP() - 上述循环的每次迭代都将通过此函数传递两个值以将每个元素拆分为字符,检查这些是否为数字,如果不是则检查 ASCII CODE() 表,如果两者均不返回空字符串。 SORT()这些字符和CONCAT()结果一起回来;
  • COUNTA(UNIQUE()) - 用于测试上述迭代是否返回两个相同值(不区分大小写)的组合。

【讨论】:

  • 感谢您的回复,但不幸的是(除非我在这里做错了什么)=BYROW 在 MSO 365 版本 2202 中不可用。我无法使用更新的版本。是否有任何替代解决方案可以使用 2202 版? imgur.com/a/FjXKoLo 另外 - 再次感谢 JvdV。你总是超级快地回答我奇怪而美妙的问题!
【解决方案2】:

这是一个替代方案,它对我有用,

• 单元格C2 中使用的公式

=BYROW(A2:B6,LAMBDA(x,IF(ISNA(MATCH(0,
--(MID(INDEX(x,,1),SEQUENCE(LEN(INDEX(x,,1))),1)
=MID(INDEX(x,,2),SEQUENCE(LEN(INDEX(x,,2))),1)))),
"NO MATCH","MATCH")))

【讨论】:

    猜你喜欢
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多