【问题标题】:Excel VBA Highlight duplicates in active columnExcel VBA 突出显示活动列中的重复项
【发布时间】:2014-02-19 09:40:32
【问题描述】:

我正在尝试创建一个宏,该宏将突出显示正在输入文本的列中的重复项。

我有 54 列,并希望在输入文本时突出显示每列中的重复项。场景是:如果在 B 列中输入两次“订书钉”,则单元格(B3、B22)将被突出显示。我想要一个可以为每一列执行此操作的宏,所以如果“STAPLES”仅在 E 列中输入一次,则不会发生任何事情。

使用条件格式 =COUNTIF 不一定有帮助(由于将列复制到新工作表的工作流程)。

我已经有了这个宏:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


Dim Rng As Range
Dim cel As Range

'Test for duplicates in a single column
'Duplicates will be highlighted in red


Set Rng = Range(Range("C1"), Range("C" & Rows.Count).End(xlUp))


For Each cel In Rng
    If WorksheetFunction.CountIf(Rng, cel.Value) > 1 Then

cel.Interior.ColorIndex = 3
    End If
Next cel

End Sub

它工作正常,但仅适用于一列(“C”)。

如何将范围设置为活动列?

我已经尝试将 Rng 更改为

'Set Rng = Range(ActiveCell,ActiveCell.Column.End(xlUp)) 

但这显然是错误的。

有什么想法吗?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    试试这个:

    Set Rng = Range(Cells(1, Target.Column), Cells(Rows.Count, Target.Column).End(xlUp))
    

    最好使用Worksheet_Change 事件而不是Worksheet_SelectionChange

    顺便说一句,重复项有特殊的 CF:


    统一更新: 如果您想使用 VBA,请尝试以下代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim Rng As Range
        Dim cel As Range
        Dim col As Range
        Dim c As Range
        Dim firstAddress As String
    
    
    
        'Duplicates will be highlighted in red
        Target.Interior.ColorIndex = xlNone
        For Each col In Target.Columns
            Set Rng = Range(Cells(1, col.Column), Cells(Rows.Count, col.Column).End(xlUp))
            Debug.Print Rng.Address
    
            For Each cel In col
                If WorksheetFunction.CountIf(Rng, cel.Value) > 1 Then
                    Set c = Rng.Find(What:=cel.Value, LookIn:=xlValues)
                    If Not c Is Nothing Then
                        firstAddress = c.Address
                        Do
                            c.Interior.ColorIndex = 3
                            Set c = Rng.FindNext(c)
                        Loop While Not c Is Nothing And c.Address <> firstAddress
                    End If
                End If
            Next
        Next col
    
    End Sub
    

    【讨论】:

    • 谢谢simoco。 Set Rng 适用于所有列。您是指 If 语句中的“
    • 不,这一行If Target.Cells &gt; 1 Then Exit Sub 用于同时更改多个单元格的情况(例如,在复制/粘贴之后)。在这种情况下,Target 可能包含多于一列(例如,如果您将值粘贴到 A10:D10 中)。如果您将使用此行,则不会发生任何事情,但如果您不使用它,您的代码将仅适用于A。顺便说一句,这不是解决问题的最佳方法。最好循环遍历Target:For each colT in Target.Columns 中的所有列。或者您可以根据需要删除此行:)
    • 查看我的更新答案。这段代码效率更高。它尝试检测新值是否重复,如果是,则突出显示它并且所有单元格都等于它(在一列中)。即使Target 包含多个单元格,它也可以工作
    • 对不起!!我没有想到。 CF Duplicates 运行良好。感谢您的提示。
    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 2019-11-06
    • 2012-04-18
    • 2014-04-16
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多