PROGRAMMING WORKSHOP

VSTO|
작업일정관리_2

사용자가 입력한 내용을 검증한후
하나의 행, 즉 하의 작업명을 clsTask라는 크래스모듈에서 개체를 만들어
하나의 행(하나의 작업)정보를 필요한 계산결과정보들을 포함하여 하나의 clsTask 개체에 넣고
이 개체들을 배열에 집합을 시켜 놓는 것 까지 하였다
그러는 과정에서 전체 프로젝트의 시작일자와 종료일자, 총금액등의 프로젝트레벨의
정보도 만들어 내게 되었다
그런데 아래의 그림과 같이 사용자가 작업을 그냥 생각나는대로 입력하다 보니까
순서가 제 멋대로 되었다



이것을 사용자에게 순서를 다시 정리하시고 하세요!! 한다면 불친절한 소루션이고
프로그래밍적이지 못하다, uno-weekly 에드인에서 순서를 뒤죽 박죽 바꿔놓고 해보신 분들은
뭔 이야긴지 아실 것이다

프로그래밍적으로 읽어서..
WBS별로 정렬을 하여 처리하여 주는 것이 착한 소루션일 것이다
엑셀의 정렬방법으로는 WBS가 있고, ID는 WBS와 관련없이 독립적으로 유일한
값만 갖고 있도록 하였었으니, ID로 정렬을 하면 WBS는 망가지고
WBS별로 정렬을 하고 WBS상의 하위작업은 해당 WBS로 위치를 바꾸어주어야 할 것이다
이것을 잘 하시면, 프로그래밍의 내공이 쌓이는 좋은 훈련이 될 것이다
뒤죽박죽 위치를 바꿔 놓고 정렬을 하여 표현해 보시기 바란다

이 작업에 선행하여 하여야 할 중요한 일이 있다
WBS의 부모레벨입장에서 자식들의 정보를 읽어서
자신의 시작일자와 종요일자와 금액의 합계등의 정보를 만들어야 한다
예를 들어서 아래의 그림과 같이



상위레벨의 WBS 작업명이 시작일자와 종료일자는 자식레벨의 가장 빠른 날짜와
가장 늦은 날짜를 계산하여 자신의 시작일짜와 종료일짜로 만들어 주어야 한다
WBS 계층레벨이 3단계일수도 있고, 5단계일수도 있을 것이다
그러려면 계산을 어떻게 해야 하나..
자신의 자식을 WBS코드를 읽어서 찾아야 할것이고..머리가 회~앵 해지는 상태가 될 것이다
이것을 프로그래밍적으로 어떻게 계산하지..
Tree구조의 정보의 말단의 정보를 분석하여 바로 윗레벨의 정보로 하고
또 그 위의 레벨은 다음 레벨의 것을 분석하여 하여야 하고..
골때리는 상황이 된다
이 부분에서 도전정신 빡시게 무장하고 나서야 한다
재귀용법이 필요한 단계다
자식레렙을 부르고 그 자식이 또 자식이 있으면 또 부르고
또 있으면 또 부르고...자식이 없을때까지 같은 작업을 반복하게 된다

재귀용법의 예제로서 가장 많이 사용되는 Factorial값을 구하는 함수를 보자
4의 Factorail 값은 4*3*2*1 이다
하나씩 내려가면서 곱하기를 한 값이다
만약 100의 Factorial값을 구할라치면 100*99*98*...이것을 종이에 연필로
풀면 되겠지만..컴퓨터는 뭐에 써먹나..이럴때 써먹지
아래 함수를 실행해보시기 바란다

Function fact(dblNum As Double) As Double If dblNum = 1 Then fact = 1 Else fact = dblNum * fact(dblNum - 1) End If End Function

함수가 자신을 다시 호출한다..이것을 Recursive(재귀)용법이라고 하고
이것을 이해하면 아주 많은 문제를 풀수 있게 된다
이 용법으로 가장 상위레벨을 보내서 하위레벨을 찾고, 하위레벨이 또 자식레벨의 것이
있으면 또 ..또...또...이런 식으로 최하위레벨까지 간후 다시 위로
말아서 올라오게 되는 셈이다
이렇게 하나의 로직을 세팅하면 레벨이 3단계던,5단계던 상관없이 계산이 되는 것이다
중요한 것은 아래의 그림과 같이, 어느 단계에서 조건이 맞으면 중단하는 로직이
반드시 들어있어야 할 것이다..그렇지 않으면 돌다가 지쳐서 컴퓨터가 꺼질 것이다



본래의 테이블로 하면 이해하고 복잡할수 있으니까..요점만 빼어내어서
이해하기 편하게 예제를 하나 만들어 보자
아래의 코드를 실행하면

Sub createDummyWBSTbl() Dim iX As Integer, iY As Integer, iZ As Integer Dim iRow As Integer Dim sTemp As String With Worksheets.Add.Range("A1") .Resize(, 4) = Array("WBS", "ID", "TASK", "StartDate") For iX = 1 To 5 iRow = iRow + 1 .Offset(iRow) = "'" & iX .Offset(iRow, 1) = "'" & iRow .Offset(iRow, 2) = T For iY = 1 To 5 iRow = iRow + 1 .Offset(iRow) = "'" & iX & "." & iY .Offset(iRow, 1) = "'" & iRow .Offset(iRow, 2) = T For iZ = 1 To 5 iRow = iRow + 1 .Offset(iRow) = "'" & iX & "." & iY & "." & iZ .Offset(iRow, 1) = "'" & iRow .Offset(iRow, 2) = T .Offset(iRow, 3) = DateAdd("d", Int(Rnd() * 300), Date) Next Next Next Dim rTable As Range Set rTable = .CurrentRegion With rTable .Font.Name = "맑은 고딕" .Font.Size = 10 .Columns.AutoFit .BorderAround xlSolid .Borders(xlInsideVertical).Weight = xlHairline .Borders(xlInsideHorizontal).Weight = xlThin ActiveWindow.DisplayGridlines = False .Sort .Rows(1).Cells(3), xlAscending, , , , , , xlYes End With End With End Sub Function T() Dim sX As String Dim iX As Integer For iX = 1 To 3 sX = sX & Chr(Int(Rnd() * 20) + 65) Next T = sX End Function Function Q() Q = Int(Rnd() * 5) + 1 End Function

아래의 왼쪽 그림과 같이 테이블이 만들어진다



이것을 WBS별로 정렬하면 오른쪽 그림과 같이 자~알 된다
그냥 엑셀의 정렬기능으로 해보시면 된다
이것을 이렇게 정렬 하려고 하면 더 이상 풀 문제가 없다
Gantt챠트를 그린다고 치면 빠른 날짜가 먼저 위에 나타나는 것이 상식이다
그러니
문제는 날짜별로 빠른 순서대로 WBS별로 그룹핑하여 날짜빠른 순서로
위에서 부터 아래로 정렬하고 WBS해당 자식들도 물론 같이 그룹핑되게
정렬해 보라는 문제이다!!
이렇게 그룹핑하면서 당연히 해당 WBS의 상위 WBS의 시작날짜를
하위 WBS자식들의 시작날짜를 읽어서 계산해 낼수 있을 것이다
한번 도전 해보시고..이것을 풀고 이해하여야 다양한 확장을 해 나갈수 있다
우노가 용쓰고 예제를 만든 성의를 보아서 꼭 풀어 보시기를...^ ^
아마도 풀었다면 다음 작업도 혼자서 스스로 확장가능할수 있을 것이다

아래의 화일에는 위와 같이 만든 기본테이블의 정보를 읽고
아래의 그림과 같이 WBS별로 그룹핑한 내용을
도형으로 구현해 본 모듈을 담고 있다..



재귀용법으로 그룹핑하는 내용을 풀은 것을 잘 관찰해 보시기 바랍니다..

***[LOG-IN]***

아래의 그림과 같이 하위레벨의 날자를 검색하여 상위레벨작업의 시작날짜를
찾는 작업을 다음 화일에 정리되었다



***[LOG-IN]***