加速Excel VBA搜索脚本

时间:2015-02-05 16:06:24

标签: excel vba excel-vba search

我需要搜索重复值并在Excel电子表格中标记它们。我在D列中验证了我的数据,可能重复的数据在列K中。我需要在列D中检查col中的所有行中的每一行。 K

这是我目前的脚本:

Sub MySub()
Dim ThisCell1 As Range
Dim ThisCell2 As Range
    For Each ThisCell1 In Range("D1:D40000")
    'This is the range of cells to check
        For Each ThisCell2 In Range("K1:K40000")
        'This is the range of cells to compare
            If ThisCell1.Value = ThisCell2.Value Then
            If ThisCell1.Value <> "" Then
                ThisCell1.Interior.ColorIndex = 3
                End If
                Exit For
                End If
            Next ThisCell2
        Next ThisCell1
End Sub

问题在于它非常慢。我的意思是需要小时来检查不可接受的数据。即使范围设置为1:5000,仍需要10-15分钟才能完成。有没有办法让它更快?

3 个答案:

答案 0 :(得分:1)

使用数组而不是更快地引用对象(范围)。

Sub MySubFast()
    Dim v1 As Variant
    Dim v2 As Variant
    v1 = Range("D1:D40000").Value
    v2 = Range("K1:K40000").Value
    Dim i As Long, j As Long
    For i = LBound(v1, 1) To UBound(v1, 1)
        For j = LBound(v2, 1) To UBound(v2, 1)
            If v1(i, 1) = v2(j, 1) Then
                If v1(i, 1) <> "" Then
                    Range("D" & i).Interior.ColorIndex = 3
                End If
                Exit For
            End If
        Next j
    Next i
End Sub

答案 1 :(得分:1)

如果K列中存在值,您是不是只是在D列中突出显示单元格?不需要VBA,只需使用条件格式。

  • 选择列D(选择整列很好)
  • 使用以下公式添加条件格式:=COUNTIF($K:$K,$D1)>0

条件格式将在您更改D列和K列中的数据时自动应用和更新,并且应该基本上是即时的

答案 2 :(得分:1)

字典将是实现您所寻找目标的最快方式。别忘了添加对“微软脚本运行时”的引用&#39;在你的项目中

Sub MySubFast()
    Dim v1 As Variant
    Dim dict As New Scripting.Dictionary
    Dim c As Range

    v1 = Range("D1:D40000").Value
    For Each c In Range("K1:K40000")
        If Not dict.Exists(c.Value) Then
            dict.Add c.Value, c
        End If
    Next

    Dim i As Long
    For i = LBound(v1, 1) To UBound(v1, 1)
        If v1(i, 1) <> "" Then
            If dict.Exists(v1(i, 1)) Then
                Range("D" & i).Interior.ColorIndex = 3

            End If
        End If
    Next i
End Sub

注意:这是@Jeanno答案的改进。