엑셀 고유값 추출 매크로 :: Get_UniqueDB 함수 사용법 총정리
엑셀 Get_UniqueDB 함수 목차 바로가기
요약
엑셀 Get_UniqueDB 함수는 배열의 특정 열번호 또는 전체열을 참조하여 고유값을 추출하는 엑셀 사용자 지정 함수입니다.
명령문 구문
DB = Get_UniqueDB ( 배열, [열번호], [고유열반환] )
사용된 인수 및 변수 알아보기
인수 | 설명 |
배열 [Variant] |
고유값을 추출할 배열입니다. |
열번호 [Long, 선택인수] |
고유값을 참조할 열 번호입니다. 열번호가 없을 경우 모든 열을 참조하여 고유값을 판단합니다. |
고유열반환 [Boolean, 선택인수] |
TRUE일 경우 선택된 열만 결과값으로 반환합니다. FALSE일 경우 배열의 모든 열이 결과값으로 반환됩니다. 기본값은 TRUE 입니다. |
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [엑셀VBA함수] Get_UniqueDB 함수예제파일
상세 설명
엑셀 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번째 열을 참조하여 고유값을 반환합니다.실전 사용 예제
- 제품 목록 DB에서 구매처의 고유값 반환하기
'DB 구조 : 제품ID | 구매처 | 제품구분 | 제품명 Dim DB As Variant DB = Get_DB(ThisWorkbook.Worksheets("제품목록")) DB = Get_UniqueDB(DB, 2) '구매처의 고유목록이 DB로 반환됩니다.
- 제품 목록 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
명령문 동작원리 단계별 알아보기
- 명령문에 사용할 변수를 선언하고 값을 저장합니다.
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")
- 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
- 배열이 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
- 배열이 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
- 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
- 최종 고유값 목록을 결과값으로 반환 후 명령문을 종료합니다.
Final: Get_UniqueDB = vArr
- 제품 목록 DB에서 구매처의 고유값 반환하기