2015-02-05 13 views
2

중복 값을 검색하여 Excel 스프레드 시트에 표시해야합니다. 내 데이터는 D 열에서 확인할 수 있으며 중복 가능한 데이터는 K 열에 있습니다. 나는 열의 모든 행을 확인해야한다. D col의 모든 행. 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

+0

'D'열에 'K'열의 값이 표시되는지 확인하고 있습니다. 'D' 열에 여러 번 나타날 수 있습니다. 그래서'D '의 각 행에 대해'K'의 모든 행을 검사해야합니다. – PeterInvincible

답변

1

사전은 당신이 찾고있는 것을 달성하는 가장 빠른 방법 일 것입니다. 프로젝트에

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

+0

당신은 얼마나 많은 스피드 업을 얻었습니까? – Seb

+0

D 열에 13k 행과 K 열에 4.5k가있는 스크립트는 완료하는 데 2 ​​시간 이상이 걸렸습니다. 귀하의 버전은 6 분 걸렸습니다 :) – PeterInvincible

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

1

열 K에 값이 있으면 열 D의 셀을 강조 표시하지 않습니까? 이 경우 VBA를 사용할 필요가 없으며 조건부 서식 만 사용하면됩니다.

  • 선택 열 D
  • 이 공식을 사용하여 조건부 서식을 추가 (미세한 전체 열을 선택) : =COUNTIF($K:$K,$D1)>0

조건부 서식을 적용하고 열에서 데이터를 변경할 때 자동으로 업데이트됩니다 D 그리고 K, 그리고 그것은 기본적으로 즉각적이어야합니다