두달간의 당직 근무계획서를 작성하는 구문.
조건1. 직원그룹은 모두 한번씩은 중복없이 근무를 서야한다.
조건2. 당직선 직원은 다음날 근무에서 제외한다.
중복없이 고유값을 가져오거나 랜덤하게 숫자를 섞을 때는 Collection 이 참 편하다.
더보기
Option Explicit
Sub 근무계획서()
Dim Col As Collection
Dim Vall: Vall = [g5:g9]
Dim n&, rowC&, Cnt&, i&, color&: color = 1
Dim rngX As Range: Set rngX = [b5]
Do
haja:
Set Col = New Collection '= 컬렉션 선언
Do Until Col.Count >= 5 '= 중복되지 않은 컬렉션 아이템이 5개 될때까지
'= 무한 반복
On Error Resume Next
n = WorksheetFunction.RandBetween(1, 5) '= 1부터 5까지 랜덤한 수를 가지고 옴
Col.Add Vall(n, 1), CStr(n) '= 중복되지 않는다면 차례대로 컬렉션에 추가
If rngX(0, 1) = Col(1) Then GoTo haja '= 당직 근무후 바로 다음날 당직을 피하기 위한 구문
On Error GoTo 0
Loop '= 중복되기 않은 5개의 컬렉션 아이템이 추출될때 까지 반복
For i = 1 To Col.Count '= 컬렉션 아이템을 셀에 출력하기 위한 구문
'= 컬렉션은 배열로 한번로 가져오는 구문이 없어서 순차적으로 가져와야 한다.
rowC = rowC + 1 '= 전체 날짜 카운팅
If rowC = 63 Then Exit Do '= 63일 이면 / 각 월이 31일씩 있으니 63일이라는 뜻은 2달이 넘어가기에 종료
If rowC = 32 Then Set rngX = [d5] '= 32일 이면 / 한달이 넘어갔을 때 출력자리를 옮기기 위한 구문
rngX = Col(i) '= 해당셀에 컬렉션을 순차적으로 출력
rngX.Interior.ColorIndex = 15 - (color * (1)) '= 셀의 색상의 순차적으로 표현하기 위한 구문
Set rngX = rngX.Offset(1) '= 셀의 위치를 다음 칸으로 이동
Next i
color = color * (-1)
Loop
[b4].CurrentRegion.Borders.LineStyle = 1
End Sub
'VBA' 카테고리의 다른 글
[VBA] 매출을 정렬해보자(Feat. ArrayList, RegExp) (0) | 2022.12.13 |
---|---|
[VBA] 배열의 위치를 출력해보자 (0) | 2022.12.12 |
[VBA] 부서별 매출정리(feat.이중 딕셔너리 + 병합) (0) | 2022.12.08 |
[VBA] 중첩배열이란..... (0) | 2022.12.08 |
[VBA] 영역의 테두리만 색상을 입혀보자 (0) | 2022.12.08 |
댓글