2017-12-28 27 views
0

데이터가 30,000 개가 넘는 스프레드 시트가 있는데 각각 38 개의 데이터 포인트가 있습니다. 복제 된 행이 있는지 확인하기 위해 각 행에 대해 14 개의 필드를 연결하고 데이터를 잘라 냈습니다. 349 자로 구성된 각 행의 키가 만들어졌습니다.응용 프로그램. 일치 오류 2015

편집 : 키의 복제는 14 개의 필드가 모두 동일 할 때 발생합니다. 시각적 인 검토에서, 나는 14 개의 모든 필드의 데이터가 정확히 동일한 200 개의 행 (2000 년 중)을 확인했습니다.

그런 다음 application.match를 사용하여 검색을 실행하여 키가 이미 생성되었는지 확인합니다. 중복이 없으면 application.match 함수가 제대로 작동합니다. 중복이있을 때 그러나, 반환

오류 2015

내가 함수가 # VALUE 반환 할 때이 것을 이해합니다. 즉치 창을 사용하여 값을 확인하면 값이 중복되고 스프레드 시트에 "= Xi = Yj"를 입력하면 같음을 알 수 있습니다 (예 : TRUE)

정확한 행 값을 알아야합니다. 프로젝트의 다음 부분에서 중복 값을 식별하고 올바른 행 값을 얻는 방법이 있다면 궁금한 점은 무엇입니까?

내가 가진 코드는 (여전히 의한 PoC)를 다음과 같습니다

While Cells(a, 1) <> vbNullString 

    If Cells(a, 36).Interior.Color = 5296274 Then 

    ElseIf Cells(a, 36) <> vbNullString Then 

    Else 
     Cells(a, 39) = Trim(Cells(a, 3) & Cells(a, 4) & Cells(a, 5) & Cells(a, 6) & Cells(a, 7) & Cells(a, 8) & Cells(a, 9) & Cells(a, 10) & _ 
     Cells(a, 11) & Cells(a, 12) & Cells(a, 13) & Cells(a, 14) & Cells(a, 15) & Cells(a, 16) & _ 
     Cells(a, 17) & Cells(a, 18) & Cells(a, 19)) 

     Cells(a, 44) = Len(Cells(a, 39)) 

     m = vbNullString 

     m = Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0) 

     If m = vbNullString Then 
      Cells(a, 39).Select 
      Selection.Style = "Good" 

     Else 
'   Range(Cells(a - 1, 39), Cells(a, 39)).Select 
'   Selection.Style = "Bad" 

     End If 
    End If 
    a = a + 1 

Wend 
+0

이 첫 번째 후 중복 키 또는에서만 발생의 모든 위치를 수집 :

코드는 지금처럼 보인다? 그리고 범위를 완전히 참조하십시오. 또는 With 문 안에 배치 한 다음 "."접두사를 붙이십시오. – QHarr

+1

팁 :'Cells (a, 39) = Join (Application.Index (Cells (r, 3) .Resize (, 17) .Value, 0, 0), ";") – JohnyL

+0

@QHarr - 확실하지 않음 질문의 두 번째 부분을 따르십시오. 첫 번째로, 나는 각각의 위치를 ​​알아야한다. 후속 세트가 고유하지 않은 것으로 바뀌면 첫 번째 세트를 변경하는 것을 포함한다. – Clauric

답변

0

많은 실험을 거친 후 오류의 원인을 파악했습니다.

생성되는 키의 길이는 349 자입니다. Excel의 많은 기능에는 최대 글자 수 제한 256 (0 - 255)이 있습니다.

이를 바탕으로 트림 기능을 사용하여 키를 자릅니다.

While Cells(a, 1) <> vbNullString 

    If Cells(a, 36).Interior.Color = 5296274 Then 

    ElseIf Cells(a, 36) <> vbNullString Then 

    Else 
'  Cells(a, 39) = Join(Application.Index(Cells(a, 3).Resize(, 17).Value, 0, 0), ";") 
     Cells(a, 39) = Trim(Cells(a, 3)) & Trim(Cells(a, 4)) & Trim(Cells(a, 5)) & Trim(Cells(a, 6)) & Trim(Cells(a, 7)) & Trim(Cells(a, 8)) & Trim(Cells(a, 9)) & Trim(Cells(a, 10)) & _ 
     Trim(Cells(a, 11)) & Trim(Cells(a, 12)) & Trim(Cells(a, 13)) & Trim(Cells(a, 14)) 

'  & Trim(Cells(a, 15)) & Trim(Cells(a, 16)) & Trim(Cells(a, 17)) & Trim(Cells(a, 18)) & Trim(Cells(a, 19))) removed 

     Cells(a, 44) = Len(Cells(a, 39)) 

     m = vbNullString 

     m = Application.Match(Cells(a, 39), Range(Cells(1, 39), Cells(a - 1, 39)), 0) 

     If m = vbNullString Then 
      Cells(a, 39).Select 
      Selection.Style = "Good" 
'   Cells(a, 41).Select 
'   Selection.ClearContents 

     Else 
      Cells(a, 39).Select 
      Selection.Style = "Bad" 
      Cells(a, 40) = m 

      Cells(m, 39).Select 
      Selection.Style = "Bad" 
      Cells(m, 40) = a 

     End If 
    End If 
    a = a + 1 

Wend 
1

한번에 두 가지 옵션, 조건에 오류를 포함 할 수 있습니다. 이렇게 :

If IsError(Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0)) Then 
    'm = something 
Else  
    m = Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0) 
End If 
+0

거기에 문제가 있습니다.그것은 단지 값을주기 위해 "m"이 필요한 곳에 오류를줍니다. 아무것도 찾지 못하면 m = vbnullstring을 반환합니다. 이는 정확합니다. – Clauric

+0

@Clauric - If IsError 조건에 다른 내용을 씁니다. – Vityata