2016-07-29 3 views
0

현재 통합 문서에서 중복을 식별하는 매크로를 실행하고 있지만 색인에서 첫 번째 집합을 식별하고 첫 번째 집합에 태그를 지정하지 않아 if 문을 설정하게되었습니다 to this by는 첫 번째 인스턴스에도 중복을 추가합니다. 그러나이 작업을 수행하는 데 오랜 시간이 걸리고 가능한 경우이를 향상시키고 자합니다. 어떤 제안이라도 대단히 감사 할 것입니다. 저는 VBA에 처음 왔지만 새로운 문제가 생겨서 조금 배우고 있습니다!VBA - IF 루프 개선

'Declaring the lastRow variable as Long to store the last row value in the Column1 
Dim lastRow As Long 
'matchFoundIndex is to store the match index values of the given value 
Dim matchFoundIndex As Long 
'iCntr is to loop through all the records in the column 1 using For loop 
    Dim iCntr As Long 
    Dim first_dup As Long 
    Dim tagging As Long 
    Dim item_code As String 

'Finding the last row in the Column 1 
    lastRow = Range("B1000000").End(xlUp).Row 
' 
'looping through the column1 
    For iCntr = 2 To lastRow 

     'checking if the cell is having any item, skipping if it is blank. 
     If Cells(iCntr, 1) <> "" Then 
      'getting match index number for the value of the cell 

      matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0) 

      'if the match index is not equals to current row number, then it is a duplicate value 
      If iCntr <> matchFoundIndex Then 

       'Printing the label in the column B 
       Cells(iCntr, 4) = "Duplicate" 

      End If 
     End If 
    Next 


    For first_dup = 2 To lastRow 
     If Cells(first_dup, 5) = "Duplicate" Then 
      item_code = Cells(first_dup, 1) 
      For tagging = 2 To lastRow 
       If Cells(tagging, 1) = item_code Then 
        Cells(tagging, 5) = "Duplicate" 
       End If 
      Next 
     End If 
    Next 

Example data: 
item code 
1 
2 
3 
4 
1 duplicate 
2 duplicate 
3 duplicate 
4 duplicate 
1 duplicate 
2 duplicate 
3 duplicate 
4 duplicate 
+0

개별 범위/셀을 사용하는 대신 Range.Value 배열을 반복하면 도움이됩니다. '= IF (MATCH ($ A2, $ A : $ A, 0) <> ROW ($ A2), "Duplicate", "") 같은 공식을 사용하여 동일한 결과를 얻을 수도 있습니다. –

답변

0

나의 첫번째 제안은, 일을 지나치게 복잡하게이 도움이 있는지 확인하기 위해 중복 값을 조건부 서식을 사용하려고하지 않는 것입니다 : 당신은 단지를 찾기 위해 필사적 경우, 불합격

enter image description here

(데이터가 A2로 시작하면 B2 셀에서 일치하지 않는 머리글 행이 필요하거나 첫 번째 행이 항상 일치합니다)

=IF(COUNTIF($A1:A$1,A2)>=1,"Duplicate","") 
다음과 같이 보일 수있는 데이터의 당신의 행을 붙여

어떤 :

enter image description here

이 당신이 VBA 솔루션에 대한 절망,하지만 난 당신에게 간단한을 줄 거라고 생각하는 경우도 VBA 솔루션입니다 먼저. 코멘트에 어떻게 참여하는지 알려주세요.

편집 : 당신은 그냥 :,

Sub test() 
    Range("B2:B" & Range("A1").End(xlDown).Row).FormulaR1C1 = "=IF(COUNTIF(R1C1:R[-1]C1,RC1)>=1,""Duplicate"","""")" 
End Sub 

을 예컨대을 R1C1 표기법과 VBA를 사용하여 위의 공식을 삽입 할 수 있습니다 내가 이것을 무너 뜨리는 것이다 그래서 당신은 무슨 일이 일어나고 있는지 알고있다.

Range("B2:B" & Range("A1").End(xlDown).Row)

는 그것을

그리고 B2와 Range("A1").End(xlDown).Row 즉 열 A의 마지막 채워진 행 (당신은 데이터의 한 부분으로 열 A의 공백을 기대한다면 그래서이 작동하지 않습니다) 사이의 열 B의 셀을 선택 R1C1의 수식을 "=IF(COUNTIF(R1C1:R[-1]C1,RC1)>=1,""Duplicate"","""")"으로 설정합니다. 여기서 R1C1은 첫 번째 행, 첫 번째 열 (즉, $A$1)을 의미합니다. R[-1]C1은 이전 행, 첫 번째 열을 의미합니다. 예 : B5에 있으면 A4가 선택됩니다. A2에 있으면 A1을 선택합니다. A1에있는 경우 1보다 이전 행에있을 수 없기 때문에 오류가 발생합니다. RC1은 현재 행, 첫 번째 열을 의미합니다.

희망이 도움이됩니다.

+0

안녕하세요 앤드류, 나는 모든 복제물을 찾기를 절박합니다. 그러나 복제본이 어떤 범주에 속하는지 확인하기 위해 추가로 "복제본"태그로 모두 플래그를 지정해야합니다. 이렇게하면 vba 솔루션이 필요합니다. 실제로 앞으로는이 작업을 진행하지 않으며 다른 작업자는 중복 작업을 찾는 방법을 모릅니다. 우선 Excel에 대한 귀하의 제안에 감사드립니다! Ged – Hinchy16

+0

지연되어 죄송합니다. 제 편집을 참조하십시오. –

+0

안녕하세요 다시 Andrew, Countif가 오랜 시간이 걸리지 만 지금 제안을 시도하고 있습니다. 이전에 수행했던 루프보다 더 잘 작동 할 것입니다. 처음에는 아무 것도 필요로하지 않는 복제물을 모두 태그하는 것처럼 보이기 때문에 루프를 디자인했습니다. 이 항목을 사용하여 어떤 항목 목록이 서로 중복되는지 찾습니다. 귀하의 제안에 감사드립니다! – Hinchy16

0

대답은 내가 제시 한 초기 코드와 동일 했으므로 30000 개 항목의 경우 약 5 분이 걸리므로 그다지 나쁘지 않습니다.