#해당 포스트는 전자책 '남보다 30분 일찍 퇴근하는 스케줄 관리 노하우'의 내용을 편집한 내용입니다. 자세한 내용은 아래의 링크에서 확인하실 수 있습니다. 전자책을 구매하시면 엑셀 프로그램 완성 파일이 함께 제공됩니다.
1. 크몽
2. 탈잉
https://taling.me/Talent/Detail/30285
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)입니다. 이 두 값의 차를 구하면 현재 내가 선택한 셀의 상대 위치의 파악이 가능해집니다.
'프로그래밍 > 엑셀(VBA) - 스케쥴 관리 프로그램 만들기' 카테고리의 다른 글
스케쥴 영역 만들기 (0) | 2022.11.17 |
---|---|
2. 바탕이 되는 시트의 프레임 잡기 (0) | 2022.11.07 |
1. 이 책의 마지막에 우리가 갖게 될 결과물 (0) | 2022.10.30 |
댓글