프로그래밍/엑셀(VBA) - 스케쥴 관리 프로그램 만들기

자동으로 마일스톤을 그려보자

*%$@$#@ 2022. 11. 30.
728x90
반응형

#해당 포스트는 전자책 '남보다 30분 일찍 퇴근하는 스케줄 관리 노하우'의 내용을 편집한 내용입니다. 자세한 내용은 아래의 링크에서 확인하실 수 있습니다. 전자책을 구매하시면 엑셀 프로그램 완성 파일이 함께 제공됩니다.

1. 크몽

https://kmong.com/gig/265163

 

내게 최적화 된 스케쥴 관리 프로그램 개발 방법을 알려 드립니다. | 15000원부터 시작 가능한 총

12개 총 작업 개수 완료한 총 평점 5점인 조화로운블랙의 전자책, 직무스킬 전자책 서비스를 7개의 리뷰와 함께 확인해 보세요. 전자책, 직무스킬 전자책 제공 등 15000원부터 시작 가능한 서비스

kmong.com

2. 탈잉

https://taling.me/Talent/Detail/30285

 

남보다 30분 일찍 퇴근하는 스케쥴 관리 노하우 | 탈잉

한번 할당된 업무는 절대 놓치지 않는 방법을 공유드립니다. 많은 직장인들이 하루에도 끊임없이 추가되고 종료되는 업무의 홍수속에서 살아갑니다. 최첨단 IT 시대에 다양한 스케쥴 관리 프로

taling.me

 

I.       VBA 프로그래밍

1.    자동으로 마일스톤을 그려보자

스케쥴 관리 프로그램에서 마일스톤은 시각적으로 전체 업무를 파악할 수 있도록 해주는 중요한 장치 중 하나입니다. 첫번째로 구현할 자동화 코드는 업무별로 작성되는 시작, 종료 날짜에 따라 자동으로 마일스톤을 그려주는 매크로입니다. 먼저 전체 코드의 구성은 다음과 같습니다.

 

Sub 일정채우기()
 
    Dim planWrksht As Object
    Dim planTable As ListObject
 
    Dim curRowNum As Integer
   
    Dim srtDate As String
    Dim endDate As String
    Dim srtDateColNum As Integer
    Dim endDateColNum As Integer
   
    Dim firstColNum As Integer
    Dim lastColNum As Integer
 
    Dim i, j As Integer
   
    Dim Ans As Long
   
    Dim srtWeekDay As String
    Dim endWeekDay As String
    Dim weekDay As String
 
       
    Set planWrksht = ActiveWorkbook.Worksheets("업무종합")
    planWrksht.Activate
    Set planTable = planWrksht.ListObjects(1)
    
    curRowNum = ActiveCell.Row - planTable.HeaderRowRange.Row
   
    srtDate = Format(planTable.ListColumns("시작"). _
            DataBodyRange(curRowNum), "mm-dd")
    endDate = Format(planTable.ListColumns("종료"). _
            DataBodyRange(curRowNum), "mm-dd")
   
    srtDateColNum = planTable.ListColumns(srtDate).Range.Column
    endDateColNum = planTable.ListColumns(endDate).Range.Column
   
    srtWeekDay = Cells(planTable.HeaderRowRange.Row - 1, srtDateColNum).Value
    endWeekDay = Cells(planTable.HeaderRowRange.Row - 1, endDateColNum).Value
   
    If srtDate = "" Then
        MsgBox "시작날짜 없음"
        Exit Sub
    ElseIf endDate = "" Then
        MsgBox "종료날짜 없음"
        Exit Sub
    End If
   
    If srtDate > endDate Then
        MsgBox "시작날짜가 종료날짜보다 뒤에 있습니다."
        Exit Sub
    End If
   
    If srtWeekDay = "" Or srtWeekDay = "" Or srtWeekDay = "" Then
        Ans = MsgBox("시작일이 쉬는날입니다. 계속 설정합니까?", _
            vbYesNo, "시작일 쉬는날 알림")
            If Ans = vbNo Then
                Exit Sub
                'No 선택 sub 종료
            End If
    End If
   
    If endWeekDay = "" Or endWeekDay = "" Or endWeekDay = "" Then
        Ans = MsgBox("종료일이 쉬는날입니다. 계속 설정합니까?", _
            vbYesNo, "종료일 쉬는날 알림")
            If Ans = vbNo Then
                Exit Sub
                'No 선택 sub 종료
            End If
    End If
   
    firstColNum = planTable.ListColumns("01-01").Range.Column
    lastColNum = planTable.ListColumns("12-31").Range.Column
   
    For i = firstColNum To lastColNum
        If planTable.ListColumns(i).DataBodyRange(curRowNum). _
            Interior.ColorIndex = 43 Then
            Ans = MsgBox("기존의 완료 일정이 있습니다. 일정을 재설정 하시겠습니까?", _
            vbYesNo, "기존 일정 알림")
            If Ans = vbNo Then
                Exit Sub
                'No 선택 sub 종료
            End If
        End If
    Next i
   
    Range(planTable.ListColumns(firstColNum).DataBodyRange(curRowNum) _
    , planTable.ListColumns(lastColNum).DataBodyRange(curRowNum)).Select
   
    Selection.Interior.Pattern = xlNone
    Selection.Value = Null
   
    For j = firstColNum To lastColNum
   
        ' 해당 일자의 요일이 , , (공휴일)이면 회색으로 표시하고 일정을 작성하지 않는다.
        weekDay = Cells(planTable.HeaderRowRange.Row - 1, j).Value
       
        If weekDay = "" Or weekDay = "" Or weekDay = "" Then
            planTable.ListColumns(j).DataBodyRange(curRowNum). _
Interior.ColorIndex = 15
        Else
            If j >= srtDateColNum And j <= endDateColNum Then
                planTable.ListColumns(j).DataBodyRange(curRowNum).Value = 1
                planTable.ListColumns(j).DataBodyRange(curRowNum). _
Interior.ColorIndex = 44
            End If
        End If
    Next j
End Sub

 

  다음부터는 개별 단위로 구분하여 코드를 상세 설명하도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim planWrksht As Object
Dim planTable As ListObject
 
   Dim curRowNum As Integer
   
   Dim srtDate As String
   Dim endDate As String
   Dim srtDateColNum As Integer
   Dim endDateColNum As Integer
   
    Dim firstColNum As Integer
    Dim lastColNum As Integer
 
    Dim i, j As Integer
   
    Dim Ans As Long
   
    Dim srtWeekDay As String
    Dim endWeekDay As String
    Dim weekDay As String

 

제일 먼저 사용하는 변수의 데이터 타입을 결정합니다. 굳이 처음부터 정의할 필요는 없으며, 더욱이 변수의 자료형을 정의하지 않더라도 프로그램이 동작하는데 문제가 발생하지 않습니다. 하지만 데이터를 더욱 명확히 정의하기 위해서 변수를 정의하는 습관은 꼭 필요합니다. 각각의 변수의 세부적인 내용은 후에 해당 변수를 사용하는 시점에서 자세히 설명하도록 합니다.

 

1
2
3
4
5
Set planWrksht = ActiveWorkbook.Worksheets("업무종합")
    planWrksht.Activate
    Set planTable = planWrksht.ListObjects(1)
    
    curRowNum = ActiveCell.Row - planTable.HeaderRowRange.Row

 

스케쥴 관리 프로그램이 작성된 시트와 그리고 그 안에 삽입된 표를 향후 참조하기 위하여 정의하는 영역입니다. 앞서 정의한 바와 같이 planWrksht Object 형으로 그리고 그 안에 삽입된 표는 planTable이라는 이름으로 ListObject 형으로 정의되었습니다.

1번 행에서는 현재 워크북에서 업무종합이라는 이름의 시트를 찾아 planWrksht라는 이름의 변수로 참조합니다. 만약 사용자가 다른 이름의 시트를 사용했다면 업무종합 이라는 이름 대신 사용자가 원하는 이름으로 대체할 수 있습니다.

3번 행에서는 앞서 정의한 planWrksht라는 시트 안에 있는 ListObject들 중 가장 첫번째 객체를 참조하는 뜻입니다. 현재 우리는 시트 안에 하나의 표 밖에는 생성하지 않았기 때문에 다음과 같이 작성하여도 문제가 발생하지 않습니다.

5번 행에서는 표 안에서 현재 커서가 위치하고있는 activeCell의 행 번호를 계산하는 것입니다. 우리가 생성한 표는 A1 셀부터 시작하지 않기 때문에 표 안의 데이터 중 몇 번째 행인지를 파악하기 위해서는 전체 시트에서 활성화 된 셀의 행 번호에서 현재 표의 헤더의 행 번호를 뺀 값으로 파악이 가능합니다. 그림으로 표현하면 다음과 같이 이해할 수 있습니다.

 

 

 

위의 예시에서 현재 C6 셀이 선택이 되어 있습니다. 이 중 우리가 알고 싶은 값은 표 안에 데이터 중 몇 번째 행의 정보인가(3번째)입니다. 이를 파악하기 위해서는 두가지 값이 필요한데 하나는 전체 시트에서 C6행의 절대위치로의 행번호(6)이며, 두번째 정보는 표의 헤더가 몇 행부터 시작하는지에 대한 정보(3)입니다. 이 두 값의 차를 구하면 현재 내가 선택한 셀의 상대 위치의 파악이 가능해집니다.

728x90
반응형

댓글