Q:最近,我的一项任务是需要比较包含多行数据的两列中,每行对应列的文本是否完全相同。例如,列A中有一系列文本,列B中也有一系列文本,比较A1中的文本是B1中的文本是否完全相同,A2与B2中的文本是否完全相同,……,等等。
完全相同意味着仅“Ant”=“Ant”和“ant”=“ant”才通过测试,而“Ant”=“ant”则不会通过测试。
这样,简单地使用:
=A1=B1
对于“Ant”和“ant”肯定返回TRUE。因为它们不区分大小写。
怎样才能进行区分大小写的比较呢?
A:可以使用EXACT函数。
=EXACT(文本1, 文本2)
EXACT函数比较两个字符串是否完全相同,它执行区分大小写的比较。
然而,假设想测试“Ant”是否与“ant”完全相同但不允许使用EXACT函数,如何做?
一种方法是将两个文本值转换为它们的ASCII等效值,然后以某种方式比较这两组值。不能比较这些值的总和,因为对于不同的文本(例如“Aa”和“aA”),总和是相同的。因此,应以其他方式比较它们的ASCII值。
可以使用公式:
=CODE(MID(text, {1;2;3;4;5;6;7;8;9;10}, 1))
获取每个字符的代码。这里,假设要测试的任何字符串的最大长度只有十个字符。更短的字符串对于MID函数来说没有问题,那是因为当MID函数尝试返回例如一个四字符字符串的第十个字符时,它返回一个空字符串。
但是,当CODE尝试返回空字符串的ASCII值时,Excel会返回#VALUE!错误。这意味着必须将公式包装在IFERROR函数中,如下所示:
=IFERROR(CODE( MID( “Aa”,{1;2;3;4;5;6;7;8;9;10}, 1) ),””)
其结果应该如下:
{65;97;””;””;””;””;””;””;””;””}
也就是说,公式返回了一个由两个数字和八个空字符串组成的数组。
那么,如何比较两个数组呢?很简单:
={1;2;3}<>{3;2;1}
中间结果为:
={TRUE; FALSE; TRUE}
如果将比较公式改写为:
=({1;2;3}<>{3;2;1}) 0
中间结果为:
={1;0;1}
对其求和,即:
=SUM(({1;2;3}<>{3;2;1}) 0)
返回一个大于0的数值,表明两个数组不匹配。
基于上述原理,如果想要比较两列中的文本是否完全相同,对于单元格A1和B1的比较来说,可以使用公式:
=SUM((IFERROR(CODE(MID(A1,{1;2;3;4;5;6;7;8;9;10},1)),"")<>IFERROR(CODE(MID(B1,{1;2;3;4;5;6;7;8;9;10},1)),"")) 0)
当单元格A1和B1中的文本不匹配时,将返回一个非零值,并且这个公式应该适用于支持IFERROR函数的任何版本的Excel——只要相比较的文本的长度不超过10个字符。
当然,使用EXACT更简单。后面的只是练练手而已!
注:本文的问题来源于exceluser.com,供有兴趣的朋友参考。