Daily Life of BlueRose

컴퓨터 & 코딩 공부/엑셀 & VBA

엑셀 VBA 기본기능 정리 - 중복데이터 처리

푸른로즈 2023. 7. 9. 01:53
728x90

중복데이터 처리

중복값 제거방법엔 여러가지가 있지만 개인적으로 콜렉션 기능은 잘 안쓰게 되다보니 대부분의 경우에는 RemoveDuplicates를 사용하게 되더군요.

 

모로가도 서울만 가면 되기 마련이니, 각자에게 가장 편한 방법을 찾으시면 될 것 같습니다만은, 일반적으로 프로그래밍에서 요구되는 중복값 제거 방법은 컬렉션 기능을 사용하는 부분이 가장 유사한것 같습니다. 

중복값을 스스로 제거하지 못해서 에러발생을 막는 코드를 동원해야 비로소 고유값 추출이 가능한 한계는 있지만요,

 

아래 기재된 방법을 추후 잘 사용하진 않을것 같지만, 만일을 대비하여 정리해두려 합니다.


    • 중복값 제거 방법의 종류
      • VBA 함수 중 RemoveDuplicate을 사용하거나, 고급필터의 중복값 제거 기능 활용 (여기서는 다루지 않음)
      • 신규항목이 고유값인지 판단하여 추출하는 방법
      • VBA 자료형 중 Collection을 사용하여 추출하는 방법
    • 방법1 : 신규항목 추출 (Application의 CountIf 함수 이용)
Public Function findDiff()

Dim oldRange As Range       					'구 목록
    Set oldRange = Range("a2", Range("a2").End(xlDown))
Dim newRange As Range       					'신 목록
    Set newRange = Range("d2", Cells(Rows.Count, "d").End(xlUp))
Dim c As Range              					'신 목록을 순회할 iterator

For Each c In newRange
    If Application.CountIf(oldRange, c) = 0 Then        		'신목록을 순회하며, 각 항목별로 구목록과 비교대조
        c.Resize(, 2).Copy Cells(Rows.Count, "a").End(xlUp).Offset(1)
    End If
Next

End Function

 

    • 방법2 : 중복값 제거 및 고유값 정렬 표기 (NewCollection과 BubbleSort의 혼합 활용)
'<선언부>
Dim myCol As New Collection
Dim rng As Range, c As Range
Dim i As Long, x As Long, y As Long
Dim a(), arr()
'<중복값제거>
Set rng = Range("a1", Cells(Rows.Count, "a").End(xlUp))
On Error Resume Next
  For Each c In rng
    If Len(c) Then
      myCol.Add Trim(c), CStr(Trim(c))
    End If
  Next
On Error GoTo 0
'<컬렉션을 배열로 변환>             	'VBA는 파이썬과 달리 자유로운 변환이 안되므로, 별도 절차가 필요함
ReDim arr(myCol.Count – 1)          	'인덱스가 배열은 0부터, 컬렉션은 1부터 시작하므로 -1이 필요함
    For i = 0 To myCol.Count – 1    	'배열의 크기는 콜렉션 크기보다 하나 작음을 반영함
    arr(i) = myCol(i + 1)           	'배열에 myCol의 값(iem)을 삽입
Next
'<버블정렬>
For x = 0 To myCol.Count – 2            	'외부 반복문의 x는 내부 for문 1회당 Swap횟수에 해당
  For y = x + 1 To myCol.Count - x – 1  	'내부 반복문은 좁혀지는 범위내에서 비교를 실시
    If arr(x) > arr(y) Then             	'arr(x)와 arr(y)를 비교하여 크기에 따라 비교, 교체 실시
    	temp = a(x)                    	'x와 y가 같으면 의미가 없다. 따라 y는 x+1로 앞서나간다
    	a(x) = a(y)                    	'x값이 상승할수록 최대값이 하나씩 고정된 위치를 가지게 된다
    	a(y) = temp                   	'이에 따라 y값 범위도 점점 줄어들며 연산할 횟수가 점차 줄어든다.
    End If
  Next
Next
'<붙여넣기>
Range("B1").Resize(UBound(arr) + 1, 1) = Application.Transpose(arr)

 

반응형