엑셀 고유값 추출 매크로 :: Get_UniqueDB 함수 사용법

배열의 특정 열 또는 모든 열을 참조하여 고유값을 반환하는 Get_UniqueDB 함수의 동작원리 및 실전 사용법을 알아봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2021. 05. 06. 04:40
URL 복사
메모 남기기 : (7)

엑셀 고유값 추출 매크로 :: Get_UniqueDB 함수 사용법 총정리

엑셀 Get_UniqueDB 함수 목차 바로가기
요약

엑셀 Get_UniqueDB 함수는 배열의 특정 열번호 또는 전체열을 참조하여 고유값을 추출하는 엑셀 사용자 지정 함수입니다.

명령문 구문
DB = Get_UniqueDB ( 배열, [열번호], [고유열반환] )
사용된 인수 및 변수 알아보기
인수 설명
배열
[Variant]
고유값을 추출할 배열입니다.
열번호
[Long, 선택인수]
고유값을 참조할 열 번호입니다. 열번호가 없을 경우 모든 열을 참조하여 고유값을 판단합니다.
고유열반환
[Boolean, 선택인수]
TRUE일 경우 선택된 열만 결과값으로 반환합니다. FALSE일 경우 배열의 모든 열이 결과값으로 반환됩니다. 기본값은 TRUE 입니다.

예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.


상세 설명

엑셀 Get_UniqueDB 함수는 배열의 특정 열 번호 또는 모든 열을 참조하여 고유값을 반환하는 엑셀 사용자지정 함수입니다. Get_UniqueDB 함수는 엑셀 데이터베이스 관련 VBA 함수 중 하나입니다. 엑셀 DB 함수 전체 목록은 아래 관련 포스트를 참고하세요.

특정 시트의 범위를 참조하여 고유값을 추출하려면 Get_DB 함수로 시트 범위를 배열로 받아온 후 Get_UniqueDB 함수를 사용합니다. 예를 들어, 현재 통합문서의 '직원목록' 시트의 3번째 열을 참조하여 고유값을 추출하려면 Get_UniqueDB 함수를 아래와 같이 입력합니다.

Dim DB As Variant
DB = Get_DB(ThisWorkbook.Worksheets("직원목록"))
DB = Get_UniqueDB(DB, 3)
'실행 중인 통합문서의 '직원목록'시트 3번째 열을 참조하여 고유값을 반환합니다.
실전 사용 예제
  1. 제품 목록 DB에서 구매처의 고유값 반환하기
    'DB 구조 : 제품ID | 구매처 | 제품구분 | 제품명
    Dim DB As Variant
    DB = Get_DB(ThisWorkbook.Worksheets("제품목록"))
    DB = Get_UniqueDB(DB, 2)
    '구매처의 고유목록이 DB로 반환됩니다.
  2. 제품 목록 DB에서 구매처의 고유 개수 확인하기
    'DB 구조 : 제품ID | 구매처 | 제품구분 | 제품명
    Dim DB As Variant
    DB = Get_DB(ThisWorkbook.Worksheets("제품목록"))
    DB = Get_UniqueDB(DB, 2)
    MsgBox Ubound(DB)
    '구매처의 고유 개수를 메시지박스로 출력합니다.

엑셀 고유값 추출 매크로, Get_UniqueDB 함수 동작원리

Get_UniqueDB 함수 전체 코드
Function Get_UniqueDB(DB, Optional UniqueCol As Long, Optional UniqueOnly As Boolean = True) As Variant
 
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'수정 및 배포 시 출처를 반드시 명시해야 합니다.
 
'■ Get_UniqueDB 함수
'■ 배열의 특정열 또는 전체 열을 참조하여 고유값을 반환합니다.
'■ 사용방법
'DB = GetUnique_DB(DB)
'■ 인수 설명
'_____________DB                  : 고유값을 추출할 배열입니다.
'_____________UniqueCol      : 고유값을 참조할 열 번호입니다. 열 번호가 없을 경우 모든 열을 참조하여 고유값을 판단합니다.
'_____________UniqueOnly    :  True 일 경우 결과값으로 해당 열번호만 반환합니다. False 일 경우 결과값으로 모든 열을 반환합니다.
'###############################################################
 
 
Dim Dict As Object
Dim i As Long: Dim j As Long: Dim a As Long: a = 1
Dim s As String
Dim v As Variant: Dim vArr As Variant
Dim ArrD As Integer
 
Set Dict = CreateObject("scripting.dictionary")
 
On Error Resume Next
 
Do
    i = i + 1
    j = UBound(DB, i)
Loop Until Err.Number <> 0
Err.Clear
ArrD = i - 1
 
On Error GoTo 0
 
If ArrD > 1 Then
    If UniqueCol = 0 Then
        For i = LBound(DB) To UBound(DB)
            For j = LBound(DB, 2) To UBound(DB, 2)
                s = s & DB(i, j) & "|"
            Next
            If Not Dict.Exists(s) Then Dict.Add s, i
        Next
    Else
        For i = LBound(DB) To UBound(DB)
            s = DB(i, UniqueCol)
            If Not Dict.Exists(s) Then Dict.Add s, i
        Next
    End If
    If UniqueOnly = False Or UniqueCol = 0 Then
        ReDim vArr(1 To Dict.Count, LBound(DB, 2) To UBound(DB, 2))
    Else
        ReDim vArr(1 To Dict.Count)
    End If
GoTo Parse2D
Else
    For i = LBound(DB) To UBound(DB)
        s = Dict(i)
        If Not Dict.Exists(s) Then Dict.Add s, i
    Next
    ReDim vArr(1 To Dict.Count)
GoTo Parse1D
End If
 
Parse2D:
For Each v In Dict.Keys
    i = Dict(v)
    If UniqueOnly = False Or UniqueCol = 0 Then
        For j = LBound(vArr, 2) To UBound(vArr, 2)
            vArr(a, j) = DB(i, j)
        Next
    Else
        vArr(a) = DB(i, UniqueCol)
    End If
    a = a + 1
Next
GoTo Final
 
Parse1D:
For Each v In Dict.Keys
    i = Dict(v)
    vArr(a) = DB(i)
    a = a + 1
Next
GoTo Final
 
Final:
Get_UniqueDB = vArr
 
End Function
명령문 동작원리 단계별 알아보기
  1. 명령문에 사용할 변수를 선언하고 값을 저장합니다.
    Dim Dict As Object
    Dim i As Long: Dim j As Long: Dim a As Long: a = 1
    Dim s As String
    Dim v As Variant: Dim vArr As Variant
    Dim ArrD As Integer
     
    Set Dict = CreateObject("scripting.dictionary")
  2. DB로 받아온 배열의 차원을 계산한 후 ArrD에 저장합니다.
    On Error Resume Next
     
    Do
        i = i + 1
        j = UBound(DB, i)
    Loop Until Err.Number <> 0
    Err.Clear
    ArrD = i - 1
     
    On Error GoTo 0
  3. 배열이 1차원일 경우 입력한 조건에 따라 고유값으로 추출할 Index를 생성합니다.
    If ArrD > 1 Then
        If UniqueCol = 0 Then
            For i = LBound(DB) To UBound(DB)
                For j = LBound(DB, 2) To UBound(DB, 2)
                    s = s & DB(i, j) & "|"
                    If Not Dict.Exists(s) Then Dict.Add s, i
                Next
            Next
        Else
            For i = LBound(DB) To UBound(DB)
                s = DB(i, UniqueCol)
                If Not Dict.Exists(s) Then Dict.Add s, i
            Next
        End If
        If UniqueOnly = False Then
            ReDim vArr(1 To Dict.Count, LBound(DB, 2) To UBound(DB, 2))
        Else
            ReDim vArr(1 To Dict.Count)
        End If
    GoTo Parse2D
  4. 배열이 2차원일 경우 입력한 조건에 따라 고유값으로 추출할 Index를 생성합니다.
    Else
        For i = LBound(DB) To UBound(DB)
            s = Dict(i)
            If Not Dict.Exists(s) Then Dict.Add s, i
        Next
        ReDim vArr(1 To Dict.Count)
    GoTo Parse1D
    End If
  5. Index를 참조하여 최종 고유값 목록을 생성합니다.
    Parse2D:
    For Each v In Dict.Keys
        i = Dict(v)
        If UniqueOnly = False Then
            For j = LBound(vArr, 2) To UBound(vArr, 2)
                vArr(a, j) = DB(i, j)
            Next
        Else
            vArr(a) = DB(i, UniqueCol)
        End If
        a = a + 1
    Next
    GoTo Final
     
    Parse1D:
    For Each v In Dict.Keys
        i = Dict(v)
        vArr(a) = DB(i)
        a = a + 1
    Next
    GoTo Final
  6. 최종 고유값 목록을 결과값으로 반환 후 명령문을 종료합니다.
    Final:
    Get_UniqueDB = vArr
5 5 투표
게시글평점
7 댓글
Inline Feedbacks
모든 댓글 보기
7
0
여러분의 생각을 댓글로 남겨주세요.x