Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim targetClasses As Integer
Dim startRow As Long
Dim studentCurClass As Integer ' 배정 기준이 되는 현재 반
Dim prevCurClass As Integer ' 반 변경 감지용
Dim mClass As Integer, fClass As Integer
Dim mDir As Integer, fDir As Integer
Dim excludeArr As Variant ' H2:K2 제외 항목 배열
Dim c As Integer
Dim nVal As String
Dim isExcluded As Boolean
Dim sortType As String
Set ws = ThisWorkbook.ActiveSheet
' --- 설정값 읽기 ---
targetClasses = ws.Range("E2").Value ' 편성할 목표 학급 수
studentCurClass = ws.Range("C4").Value ' 기준이 되는 현재 반 (A3 또는 C4 등 설정된 셀)
startRow = 11 ' 데이터 시작 행
sortType = ws.Range("A2").Value ' 정렬 기준 (이름순, 성적순, 생년월일순)
' 유효성 검사
If targetClasses <= 0 Then
MsgBox "편성할 반 수를 정확히 입력해 주세요.", vbExclamation
Exit Sub
End If
' 데이터 끝 행 찾기 (D열 기준)
lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
If lastRow < startRow Then Exit Sub
' 기존 배정 결과(F열) 초기화
ws.Range("F" & startRow & ":F" & lastRow).ClearContents
' 1. 제외 항목 배열화 (H2:K2)
excludeArr = ws.Range("H2:K2").Value
' 2. A2 조건에 따른 자동 정렬 로직 추가
' 정렬 범위: A열부터 P열(생년월일)까지 포함
With ws.Sort
.SortFields.Clear
' 공통 1순위: 성별 (E열) - 남여 구분을 위해 필수
.SortFields.Add Key:=ws.Range("E" & startRow), Order:=xlAscending
' 2순위: A2 셀 값에 따른 분기
Select Case sortType
Case "이름순"
' D열(이름) 올림차순
.SortFields.Add Key:=ws.Range("D" & startRow), Order:=xlAscending
Case "성적순"
' M열(총점) 내림차순
.SortFields.Add Key:=ws.Range("M" & startRow), Order:=xlDescending
Case "생년월일순"
' P열(생년월일) 올림차순
.SortFields.Add Key:=ws.Range("P" & startRow), Order:=xlAscending
End Select
.SetRange ws.Range("A" & startRow & ":P" & lastRow) ' 데이터 범위 (P열까지)
.Header = xlNo
.Apply
End With
' --- 배정 로직 시작 ---
prevCurClass = 0
' 시작 반 번호 및 방향 초기화 (남/여)
' (studentCurClass가 바뀌지 않는 batch 작업이라면 루프 밖에서 한 번만 계산해도 무방합니다)
mClass = ((studentCurClass - 1) Mod targetClasses) + 1
mDir = 1
fClass = (studentCurClass Mod targetClasses) + 1
fDir = 1
For i = startRow To lastRow
' N열 값 검사 (배열 비교)
nVal = Trim(ws.Cells(i, "N").Value)
isExcluded = False
If nVal <> "" Then
For c = 1 To UBound(excludeArr, 2)
If nVal = Trim(excludeArr(1, c)) Then
isExcluded = True
Exit For
End If
Next c
End If
' 제외 대상이 아닌 경우에만 ㄹ자 배정 진행
If Not isExcluded Then
' 성별에 따른 배정 (E열 기준)
If ws.Cells(i, "E").Value = "남" Then
ws.Cells(i, "F").Value = mClass
' 남자 ㄹ자 로직
If mDir = 1 Then
If mClass < targetClasses Then mClass = mClass + 1 Else mDir = -1
Else
If mClass > 1 Then mClass = mClass - 1 Else mDir = 1
End If
ElseIf ws.Cells(i, "E").Value = "여" Then
ws.Cells(i, "F").Value = fClass
' 여자 ㄹ자 로직
If fDir = 1 Then
If fClass < targetClasses Then fClass = fClass + 1 Else fDir = -1
Else
If fClass > 1 Then fClass = fClass - 1 Else fDir = 1
End If
End If
End If
Next i
MsgBox "[" & sortType & "] 기준으로 정렬 후 반 편성이 완료되었습니다!", vbInformation
End Sub