본문 바로가기
VBA

[VBA] 근무계획서 만들기

by 일등미노왕국 2022. 12. 9.

두달간의 당직 근무계획서를 작성하는 구문.

 

조건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



 

근무계획서.xlsm
0.02MB

 

댓글