VBA Macro/VBA Excel

[엑셀 VBA] 가능한 모든 조합 나열하기

루아흐뉴마 2020. 5. 18. 00:20
반응형
  • 개인적으로 필요해서 SPSS의 집단별 통계 기능을 엑셀로 만들고 있는 중이다.
  • 이 매크로는 그 과정의 시작 단계라 할 수 있겠다.
  • 집단별 변수값에 따라 만들 수 있는 모든 조합을 나열한다.
  • 예를 들어, 성별 변수가 남/여, 지역 변수가 서울/수도권/비수도권으로 구분되어 있다면,
  • 남-서울, 남-수도권, 남-비수도권, 여-서울, 여-수도권, 여-비수도권 항목을 모두 나열하는 기능이다.
  • 사용방법: 1) 조합을 산출할 영역을 지정한다. 2) 매크로를 실행한다. 3) 끝
  • 코딩은 공부하는 차원에서 컬렉션을 사용했는데, 그냥 배열변수를 써도 무방하다.


매크로 Output

 




VBA Code

 
Option Explicit  
Option Base 1  
Sub every_case()  
Dim oCol() As New Collection  
Dim rngSel As Range  
Dim i As Long  
Dim j As Long  
Dim k As Long  
Dim m As Long  
Dim totalComb As Long  
Dim crit As Double  
Set rngSel = Selection '선택영역 설정  

totalComb = 1


'////// 컬렉션에 데이터를 담는 과정; 배열을 써도 무방함
  For j = 1 To rngSel.Columns.Count '열 갯수만큼 루프
    ReDim Preserve oCol(j) '열 갯수만큼 컬렉션 동적 생성
    For i = 2 To rngSel.Rows.Count '행 갯수만큼 루프; 열머리가 없다면 1부터 시작하도록 변경
      If Not IsEmpty(rngSel.Cells(i, j)) Then '비어있는 셀은 제외
        oCol(j).Add Item:=rngSel.Cells(i, j) '각 컬렉션에 삽입
      End If
    Next i
    totalComb = totalComb * oCol(j).Count     '조합해야 할 개수 산출
  Next j
  
  '////// 결과물을 보여줄 시트 생성
  With Sheets.Add(, Sheets(Sheets.Count)) '결과를 출력할 시트 생성
    .Name = "result"
  End With
  
  '////// 조합을 뽑는 과정
    crit = totalComb
  For j = 1 To rngSel.Columns.Count
    For m = 1 To totalComb / crit
      For k = 1 To crit
        Sheets("result").Cells(crit * (m - 1) + k, j) = oCol(j)(1 + Int((k - 1) / (crit / oCol(j).Count)))
      Next k
    Next m
    crit = crit / oCol(j).Count
  Next j
  
End Sub

 



매크로 실행 동영상

 

매크로 예시파일

 

every_case.zip
다운로드

 

 Copyright (2020) Ruahneuma. All Rights Reserved.

 

반응형