이 페이지에서
구문
= Get_UniqueDB ( 배열, [열번호], [고유열반환] )
인수구분
형식 설명
배열
필수
Variant
고유값을 추출할 배열입니다.
열번호
선택
Long
고유값을 참조할 열 번호입니다.
열 번호가 없을 경우 모든 열을 참조하여 고유값을 판단합니다.
고유열반환
선택
Boolean
TRUE 일 경우 선택된 열만 결과값으로 반환합니다. 기본값은 TRUE 입니다.
FALSE 일 경우 배열의 모든 열이 결과값으로 반환됩니다.
마스터 코드
복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요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 함수로 시트 범위를 배열로 받아온 뒤 이 함수를 사용합니다.
Raw 데이터의 고유값을 추출하면서 해당 고유값 열의 왼쪽열이나 오른쪽 열을 같이 출력하고 싶으면 어떻게 해야 할까요?
raw 배열로 전체 범위를 입력 후, 고유값을 비교할 열 번호를 입력해보세요.
아래 SortArray 함수를 한번 사용해보시겠어요? :)
https://www.oppadu.com/%ec%97%91%ec%85%80-sortarray-%ed%95%a8%ec%88%98/
감사합니다.