Excel如何查找同一行中的重复单元格或数值?

3
我有一个数据集,其中每行属于唯一的人,所以我想要做的是在每行中找到重复值。 我尝试使用条件格式,但这很耗时,因为我必须将其应用于每个单独的行,否则它将在所有行中查找重复项,而不仅仅是在一行中。

enter image description here

你能否提供一些关于条件格式的公式、VBA或者其他建议?

我使用宏录制器创建了一个宏,以下是结果。如果可以让它适用于一系列行并应用格式,那会很有帮助。

Sub DuplicatesRow1() ' ' DuplicatesRow Macro '

'
    Rows("251:251").Select
    Selection.FormatConditions.AddUniqueValues
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Selection.FormatConditions(1).DupeUnique = xlDuplicate
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Rows("252:252").Select
    Selection.FormatConditions.AddUniqueValues
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Selection.FormatConditions(1).DupeUnique = xlDuplicate
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Rows("253:253").Select
    Selection.FormatConditions.AddUniqueValues
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Selection.FormatConditions(1).DupeUnique = xlDuplicate
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Range("E259").Select End Sub

1
这似乎是Excel中的一个设计缺陷。您在此处放置了“excel-vba”标签。您是否尝试过使用代码来完成此操作?如果是,请提供您尝试过的内容。否则,该问题可能会被投票下降并关闭。另一个选择 - 也许不那么耗时的是为每一行输入格式 - 是从一行复制和粘贴格式到另一行;虽然这显然对于大量行数来说很麻烦。 - Scott Holtzman
1
此外,如果您提供一些样本数据的示例来阐述您的问题,这将增加您获得良好答案的机会。 - Michael
@ScottHoltzman 添加了 VBA 代码。 - Ali Shaikh
@Michael 示例已添加 - Ali Shaikh
2个回答

1

我接着努力并成功编写了下面的代码,它对我来说似乎可以工作。我是VBA的新手且没有足够的经验,请告诉我是否可以进一步改进我的代码。

Private Sub HighlightDuplicateRow(row As Integer)

Dim report As Worksheet
Set report = Excel.ActiveSheet
report.Cells(row, row).EntireRow.Select
    Selection.FormatConditions.AddUniqueValues
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Selection.FormatConditions(1).DupeUnique = xlDuplicate
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
End Sub


Sub DuplicatesInEachRow()
Dim counter As Integer, limit As Variant
counter = 2
limit = InputBox("Give me last row number", "Highlight Duplicates in a Row")
If limit = "" Then Exit Sub
Do Until counter > limit
Call HighlightDuplicateRow(counter)
counter = counter + 1
Loop
End Sub

0

这里有一个循环,将在每一行上设置条件格式。我根据您的示例数据和代码使用了工作表和范围引用。您可以修改它们以适应您的确切数据集。

我还要注意的是,如果有大量行,这可能会导致Excel性能问题,因为格式的数量可能会严重增加文件大小并影响性能。

Sub LoopCF()

Dim ws As Worksheet
Set ws = Sheets("Sheet1")

'Dim lRow As Long
'lRow = ws.Range("A2").End(xlDown).Row 'will give row 200 as long as contiguous rows

Dim rng As Range, cel As Range
Set rng = ws.Range("B2:B200") 'ws.Range("B2:B" & lRow)

For Each cel In rng

    With cel.Resize(1, 4)

        .FormatConditions.AddUniqueValues
        .FormatConditions(.FormatConditions.Count).SetFirstPriority

        With .FormatConditions(1)

            .DupeUnique = xlDuplicate

            With .Font
                .Color = -16383844
                .TintAndShade = 0
            End With

            With .Interior
                .PatternColorIndex = xlAutomatic
                .Color = 13551615
                .TintAndShade = 0
            End With

            .StopIfTrue = False

        End With

    End With

Next

End Sub

@AAZ - 请查看我的编辑代码。lRow只是获取范围内的最后一行,而rng将所需处理的范围设置为对象,以便可以在该对象上进行操作。此外,如果您告诉我您遇到的错误及其所在的行,我可能可以提供帮助 :) - Scott Holtzman
我尝试了更新后的代码,这次没有错误,但它什么也没做 :( 工作表的名称是Sheet1。 - Ali Shaikh
另一种方法可能是使用循环,将格式应用于一行,然后将Rows("251:251").Select加1,这样就会变成Rows("252:252").Select ,以此类推。它可以询问要应用格式的行数是多少,输入一个数字,然后从第2行开始直到用户定义的行号为止。 - Ali Shaikh
@AAZ - 现在试试。我去掉了一些我认为可能不必要的东西,但也许它是必要的。这段代码通过循环遍历行中的每个单元格逐行进行。如果您喜欢,您可以使用输入框和计数器。 - Scott Holtzman
让我们在聊天中继续这个讨论 - Ali Shaikh
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接