比较同一行中任意两个或多个单元格的多个列,它们的内容相同

比较同一行中任意两个或多个单元格的多个列,它们的内容相同

我需要一个公式来比较同一行中任意两个或多个单元格的多个列,这些单元格具有相同的内容。如果为真,则显示“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 解决方案相比,需要维护的代码要少得多。

答案4

无需数组公式的两步解决方案:

Excel 屏幕截图

步骤1:计算每列的出现次数。如果大于 1,则输入 1,否则输入空字符串。屏幕截图中单元格 D2 的公式:

=IF(COUNTIF($A2:$C2,A2)>1,1,"")

此公式可以通过右下角拖动(或双击)来覆盖所有行,然后可以通过右下角拖动整个选定行 D 来覆盖所有列。

第2步:检查每一行是否有“1”

屏幕截图中单元格 G2 的公式:

=IF(SUM($D2:$F2)>0,"YES","Good Job")

此公式可以通过右下角拖动(或双击)来覆盖所有行。

为了使其更美观,您可以考虑将中间计算移到另一张表。

相关内容