2015-02-05 101 views
2

我需要搜索重複值並將它們標記在Excel電子表格中。我有我的數據在列D中進行驗證,並且在可能的情況下重複的數據位於列K中。我需要檢查列中所有行的D列中的每一行。 K加快Excel VBA搜索腳本

這是我爲這個當前腳本:

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分鐘才能完成。有什麼辦法可以讓它更快嗎?

+0

你如何定義你的搜索?您是否檢查列D中的值是否出現在列K中?還是它不得不多次出現在K列中? – user3561813 2015-02-05 16:29:44

+0

我正在檢查'K'列中的值是否出現在列'D'中。在'D'列中可能有多個出現,所以這就是爲什麼搜索必須檢查'D'中每行的'K'中的所有行。 – PeterInvincible 2015-02-05 16:32:52

回答

1

字典將是最快的方式來實現你在找什麼。不要忘記在您的項目中添加對「Microsoft腳本運行時」的引用

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答案的改進。

+0

謝謝,按預期工作。 :) – PeterInvincible 2015-02-05 18:40:58

+0

你有多少加速? – Seb 2015-02-05 19:11:28

+0

我的腳本在D列中有13行,在K列中有4.5k,需要超過2小時才能完成。你的版本花了6分鐘:)) – PeterInvincible 2015-02-05 22:16:51

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 
+0

這很有用,謝謝! – PeterInvincible 2015-02-05 18:41:20

1

如果K列中的值存在,您是不是隻突出顯示D列中的單元格?無需爲此使用VBA,只需使用條件格式。

  • 選擇列d(選擇整列是罰款)
  • 使用此公式添加條件格式:=COUNTIF($K:$K,$D1)>0

條件格式將應用和自動更新爲您更改列的數據d和K,它應該基本上是即時的