我需要一个公式来比较同一行中任意两个或多个单元格的多个列,这些单元格具有相同的内容。如果为真,则显示“TEXT A”(可以是任何值,例如“TRUE”)。如果所有值都不同,则显示“TEXT B”或仅显示“FALSE”。
我正在使用一个IF
公式,但如果有很多列需要比较,它将会非常耗时,所以我需要一个更好的公式。
=IF((B2=C2);"YES";IF((B2=D2);"YES";IF((C2=D2);"YES";"ALL DIFFERENT")))
与 OR 函数类似(结果为真或假)
=AND(($C2<>$D2);($C2<>$E2);($D2<>$E2))
下面是工作表的截图,这只是一个例子。我的实际工作有 4 列以上。
突出显示的行是其中有两个或多个单元格包含相同文本的行(第 2 组也应突出显示),因此这些行应显示“TEXT A”消息。
答案1
这个 VBa 可以做到这一点(如何添加 VBa)。我提供了一些选项,以便您将来可以扩展它,请查看前 12 行左右,您可以在其中输入各种“答案”。您可以选择哪一行是起始行和结束行,结果将显示在哪里以及如果存在文本匹配则显示哪些单词!请注意,突出显示是由于您提供的 Excel 文档,与代码无关。
在运行 VBa 脚本之前,请备份文件 - 通常没有撤消选项!
Sub DoTheThing()
'Answer these questions or ye walk the plank
Dim row As Integer
row = 2
Dim firstColumn As String
firstColumn = "B"
Dim lastColumn As String
lastColumn = "D"
Dim resultsColumn As String
resultsColumn = "G"
Dim isFoundText As String
isFoundText = "YES"
Dim isNotFoundText As String
isNotFoundText = "Good Job"
'***Below be for the cap'ains eyes only.
Do While Range("A" & row).Value <> ""
Dim startChar As Integer
startChar = Asc(firstColumn)
Dim endChar As Integer
endChar = Asc(lastColumn)
Dim i As Integer
Dim hasMatch As Boolean
hasMatch = False
For i = startChar To endChar
If Range(Chr(i) & row).Value = Range(Chr(i + 1) & row).Value Then
hasMatch = True
End If
If Range(Chr(startChar) & row).Value = Range(Chr(i + 1) & row).Value Then
hasMatch = True
End If
Next i
If (hasMatch) Then
Range(resultsColumn & row).Value = isFoundText
Else
Range(resultsColumn & row).Value = isNotFoundText
End If
row = row + 1
Loop
End Sub
我将结果写给了 Col G(保留原件)
运行 vba 后
答案2
有一种使用公式的简单方法。我要指出的是,该示例仅显示包含第一列的匹配项。任何公式都应针对包含随机匹配项的示例进行测试。
由于列数可能有所不同,我将分两部分进行解释。第一部分是您为所需列数构建的表达式。我添加了一列数据以更好地说明公式,并包含了一些随机匹配的情况:
四列数据的表达式如下所示(显示第 2 行,即第一个数据行):
COUNTIF(C2:E2,B2)+COUNTIF(D2:E2,C2)+(D2=E2)
如果 N 是数据列的数量,则公式包含 N-1 个项。第一个项计算有多少列的值等于第一个列。第二个项计算剩余列中有多少列的值等于第二个列。依此类推。它们都可以是 COUNTIF,但我在最后一种情况下使用了更简单的术语。我没有计算一列,而是测试倒数第二列是否等于最后一列。结果为 True 时,值被识别为 1,结果为 False 时,值被识别为 0。如果所有值都是唯一的,则此表达式将等于 0。否则,它将是一个更大的数字。表达式位于 IF 测试中:
=IF(<expression>=0,"Unique Message","Match Message")
因此对于四个数据列,公式将是:
=IF(COUNTIF(C2:E2,B2)+COUNTIF(D2:E2,C2)+(D2=E2)=0,"Unique Message","Match Message")
结果如下:
答案3
我会使用 Power Query 插件来实现这一点。它有一个 Group 命令,带有 Count Distinct 函数,可以跨任意行和/或列组合计算出结果。
我已经构建了一个原型,您可以查看或下载它 - 我的 One Drive 中的“Power Query 演示 - 比较多列的唯一值.xlsx”:
https://onedrive.live.com/redir?resid=4FA287BBC10EC562%21398
请注意,您可以继续向输入表添加列和/或行,然后只需点击数据功能区中的“全部刷新”即可重新处理 Power Queries。
其中 90% 只需在 Power Query 功能区中单击即可构建。唯一的例外是我在“比较多列”查询的最后一步中编写的简单“if”语句。因此,与公式或 VBA 解决方案相比,需要维护的代码要少得多。