메뉴
실무 위키VBA 코드Get_UniqueDB

Get_UniqueDB

Function

배열의 특정 열 또는 모든 열을 참조해 고유값만 추출하는 VBA 사용자 지정 함수입니다.

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

마스터 코드

복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요
Module1 · 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

활용 예제

제품 목록 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_DB 함수로 시트 범위를 배열로 받아온 뒤 이 함수를 사용합니다.
댓글 7
5 (5개 평가)
정철영
정철영 2021.05.06 11:56
감사합니다 열심히 배워서 잘 활용 해보겠습니다
kweon****
kweon**** 2022.03.22 13:40
안녕하세요,
Raw 데이터의 고유값을 추출하면서 해당 고유값 열의 왼쪽열이나 오른쪽 열을 같이 출력하고 싶으면 어떻게 해야 할까요?
오빠두엑셀
오빠두엑셀 작성자 2022.03.23 04:51
안녕하세요.
raw 배열로 전체 범위를 입력 후, 고유값을 비교할 열 번호를 입력해보세요.
정세미
정세미 2024.01.05 13:55
추출한 고유값을 정렬하려면 어떻게 해야할까요? (한글로 오름차순 혹은 고유값이 지정되어있어서 사용자가 지정한 순서대로..)
오빠두엑셀
오빠두엑셀 작성자 2024.01.05 16:19
안녕하세요.
아래 SortArray 함수를 한번 사용해보시겠어요? :)
https://www.oppadu.com/%ec%97%91%ec%85%80-sortarray-%ed%95%a8%ec%88%98/
감사합니다.
b****
b**** 2024.04.23 10:14
감사합니다!
강민준🤗
강민준🤗 2024.08.11 12:19
좋은 강의 감사합니다.
스크랩 완료