엑셀을 사용하다 보면 여러 개의 항목을 조합해야 할 때가 있습니다. 예를 들어, A, B, C, D, E, F, G와 같은 항목 중에서 2개씩 또는 3개씩 묶어서 조합을 나열하고 싶을 때가 있죠. 이번 글에서는 엑셀 함수와 VBA 매크로를 활용해 조합을 만드는 두 가지 방법을 소개하겠습니다.
엑셀 동적 배열 함수로 조합 만들기 (간단한 방법)
엑셀의 최신 버전(엑셀 365, 엑셀 2021)에서는 동적 배열 함수를 사용해 간단하게 조합을 만들 수 있습니다. 별도의 매크로 없이도 함수를 활용해 빠르게 결과를 얻을 수 있는 방법입니다.
Step 1: TRANSPOSE로 데이터 전환하기
먼저, 가로로 나열된 데이터를 세로로 변환합니다. 예를 들어, A1:G1 범위에 A, B, C, D, E가 입력되어 있다고 가정해봅니다.
=TRANSPOSE(A1:G1)
이 함수는 가로로 입력된 데이터를 세로로 전환해줍니다. 결과적으로 A열에 A, B, C, D, E가 세로로 나열됩니다.
Step 2: TOCOL과 & 연산자로 조합 만들기
이제 본격적으로 조합을 만들어보겠습니다. 예를 들어, H1 셀에는 1개씩 조합한 결과, I1 셀에는 2개씩 조합한 결과를 나열할 수 있습니다.
1개씩 조합:
=TOCOL(A1:G1)
이 함수는 A1:G1의 항목을 그대로 나열합니다.
2개씩 중복 허용 조합:
=TOCOL(A1:G1 & TRANSPOSE(A1:G1))
이 함수는 A, B, C, D, E, F, G 항목을 두 개씩 조합한 결과를 나열합니다. 예를 들어:
- AA, AB, AC, AD, AE, AF, AG
- BA, BB, BC, BD, BE, BF, BG
2개씩 중복 없는 조합:
=UNIQUE(FILTER(A1:G1 & TRANSPOSE(A1:G1), A1:G1 <> TRANSPOSE(A1:G1)))
이 함수는 중복 없이 두 개씩 조합한 결과를 나열합니다. 예를 들어:
- AB, AC, AD, AE, AF, AG
- BC, BD, BE, BF, BG
3개씩 조합:
=TOCOL(A1:G1 & TRANSPOSE(A1:G1) & TRANSPOSE(A1:G1))
이 함수는 세 개씩 조합한 결과를 나열합니다.
3개씩 중복 없는 조합:
=UNIQUE(FILTER(A1:G1 & TRANSPOSE(A1:G1) & TRANSPOSE(A1:G1), (A1:G1 <> TRANSPOSE(A1:G1)) * (A1:G1 <> TRANSPOSE(A1:G1))))
이 함수는 중복 없이 세 개씩 조합한 결과를 나열합니다.
VBA 매크로로 조합 나열하기 (복잡한 조합에도 유용)
엑셀 함수만으로는 복잡한 조합(예: 3개 이상 묶기)을 만들기 어렵습니다. 이럴 때는 VBA 매크로를 활용하면 더 유연하게 조합을 나열할 수 있습니다.
Step 1: VBA 편집기 열기
- 엑셀 파일을 열고 **Alt + F11**을 눌러 VBA 편집기를 엽니다.
- 상단 메뉴에서 **삽입 > 모듈**을 클릭합니다.
Step 2: 아래 VBA 코드 붙여넣기
(중복 허용)
Sub GenerateCombinationsWithDuplicates()
Dim rng As Range
Dim arr() As Variant
Dim result() As String
Dim n As Integer, r As Integer
Dim i As Integer
Dim resIndex As Integer
' 데이터 범위 설정 (A1:G1)
Set rng = Range("A1:G1")
arr = Application.Transpose(rng.Value)
n = UBound(arr)
' 몇 개씩 묶을지 설정 (예: 2개씩)
r = Application.InputBox("몇 개씩 조합할까요?", Type:=1)
If r <= 0 Then Exit Sub
' 결과 저장 배열 초기화
ReDim result(1 To n ^ r)
' 조합 생성
resIndex = 1
Call CombineWithDuplicates(arr, r, "", result, resIndex)
' 결과 출력 (현재 선택된 셀 아래로 출력)
Dim outputCell As Range
Set outputCell = Application.ActiveCell.Offset(1, 0)
For i = 1 To resIndex - 1
outputCell.Offset(i - 1, 0).Value = Trim(result(i))
Next i
End Sub
Sub CombineWithDuplicates(arr As Variant, r As Integer, temp As String, result() As String, ByRef resIndex As Integer)
Dim i As Integer
If r = 0 Then
result(resIndex) = temp
resIndex = resIndex + 1
Else
For i = 1 To UBound(arr)
Call CombineWithDuplicates(arr, r - 1, temp & arr(i, 1), result, resIndex)
Next i
End If
End Sub
Step 2: 아래 VBA 코드 붙여넣기
(중복 없이)
Sub GenerateCombinationsWithoutDuplicates()
Dim rng As Range
Dim arr() As Variant
Dim result() As String
Dim n As Integer, r As Integer
Dim i As Integer
Dim resIndex As Integer
' 데이터 범위 설정 (A1:G1 범위에 항목 입력)
Set rng = Range("A1:G1")
arr = Application.Transpose(rng.Value)
n = UBound(arr)
' 몇 개씩 묶을지 설정 (예: 2개씩 조합하려면 r = 2)
r = 2
' 결과 저장 배열 초기화
ReDim result(1 To Application.WorksheetFunction.Combin(n, r))
' 조합 생성
resIndex = 1
Call CombineWithoutDuplicates(arr, r, "", 1, result, resIndex)
' 결과 출력 (현재 선택된 셀부터 출력)
Dim outputCell As Range
Set outputCell = Application.ActiveCell
For i = 1 To resIndex - 1
outputCell.Offset(i - 1, 0).Value = Trim(result(i))
Next i
End Sub
Sub CombineWithoutDuplicates(arr As Variant, r As Integer, temp As String, index As Integer, result() As String, ByRef resIndex As Integer)
Dim i As Integer
If r = 0 Then
result(resIndex) = temp
resIndex = resIndex + 1
Else
For i = index To UBound(arr)
Call CombineWithoutDuplicates(arr, r - 1, temp & arr(i, 1), i + 1, result, resIndex)
Next i
End If
End Sub
Step 3: 매크로 실행하기
- 출력하고 싶은 셀을 선택합니다. (예: H1 셀)
- **Alt + Q**를 눌러 VBA 편집기를 닫고 엑셀로 돌아갑니다.
- **Alt + F8**을 눌러 GenerateCombinationsWithDuplicates 또는 GenerateCombinationsWithoutDuplicates 매크로를 선택한 후 실행을 클릭합니다.
이제 선택한 셀(C2)부터 조합 결과가 출력됩니다.
결과 비교
엑셀 함수 | 간단하고 빠르게 조합 생성 가능 | 복잡한 조합(3개 이상)에는 제한적 |
VBA 매크로 | 복잡한 조합, 다단계 조합 모두 가능 | 초기 설정이 필요하고 VBA 사용 숙지 필요 |
마치며
- 간단한 2개 조합은 엑셀 함수로 빠르게 해결할 수 있습니다.
- 3개 이상 묶는 복잡한 조합이나 특정 규칙이 필요한 경우에는 VBA 매크로가 더 유용합니다.
상황에 따라 두 가지 방법을 적절히 활용해보세요! 😊
이 글이 도움이 되셨다면 댓글로 질문이나 의견 남겨주세요!
'엑셀공부' 카테고리의 다른 글
엑셀 정렬이 제대로 않될 때? 숫자가 텍스트로 저장될 때 해결 방법! (0) | 2025.02.13 |
---|---|
엑셀 SUMIFS, SUMPRODUCT를 활용하여 특정 담당자만 합산하기 (0) | 2025.02.13 |
엑셀 COUNTIF 함수 완벽 가이드 - 초보자를 위한 쉬운 설명 (0) | 2025.02.10 |
엑셀 텍스트 함수: LEFT, RIGHT, MID 함수로 문자 추출하기 (0) | 2025.02.07 |
엑셀 MATCH 함수와 INDEX함수로 데이터 위치 찾기 쉽게 배우기 (0) | 2025.02.07 |
댓글