PROGRAMMING WORKSHOP

VSTO|
작업일정관리_4

작업에 대한 정보를 검증하고 정렬하여 그룹핑하여 배열속에 모아 두었다
이제는 열방향으로 날짜에 대한 테이블을 만들어야 할 것이다
개체화라는 개념을 조금씩 갖였으면 좋겠다
앞페이지의 작업들을 하나의 개체로 처리해서 배열속에 보관해 두었다
날짜를 그리기 위한 하나의 셀도 하나의 날짜관련정보를 담는 개체화를
시켜서 보관해 보려고 생각을 해보시는 것이 좋다



왜 복잡하게 개체화라는 것을 하지??
복잡하니까 개체화한다!! 라는 것이 답이다
그냥 개체같은 것 없이 생각 해보시고 카렌다를 그려 보시기 바란다
앞페이지에서 만든 배열속에서 프로젝트시작일자와 종료일자를 얻어서
이것을 한열에 하루씩으로 끊어서 만들어 보시기도 하시고
일주일씩 끊어서 만들어 보시기도 하시고..
잘 그려진다면 그냥 개체같은 것 생각없이 해도 된다..
물론 어떻게 해도 되기는 된다..
그러나 단순히 날짜만 표시하는 것이 아니고 완성후 왼쪽테이블의 작업테이블과
서로 값을 읽어가면서 그림을 그려야 한다는 것을 염두에 두고
위의 그림은 일주일단위로 브록을 만든 것이고..
우선 하루 단위로 그려 보시기를..



그림과 같이 4개의 변수가 우선 있어야 할 것이다
프로젝트시작일자
프로젝트종료일자
카렌다시작일자
카렌다시작일자
물론 하나의 타임브록(하나의 셀)에 하루씩 표현하다면
프로젝트시작일자나 카렌다 시작일자나 같을 것이다

그러나 일주일 단위로 하던가, 십일단위로 하던가 일정스케일을 다르게 할때는
프로젝트시작,종료일자와 카렌다시작,종료일자는 다르게 될 것이다
하루의 스케일로 하던 일주일로 하던, 4개의 변수를 준비하는 것이 좋겠다
또한 하나의 날짜를 나타내는 하나의 셀(Time Unit)는 아래의 그림과 같이



하나의 타임유닛을 개체로 만들어서 그림과 같은 정보를
보관하도록 하는 것이 좋은 프로그래밍방식이 될 수 있다

위의 것을 개체를 만들기 위한 VSTO uno-weekly 크래스모듈에서 사용한 코드는
아래와 같다
간트챠트에서도 사용하고 다른 챠트에서도 사용하는 것이라서
내용중에 이것은 뭐지???!!하는 것도 있겠지만..그냥 참고하시고
이 것과 유사하게 VBA에서 크래스모듈을 넣고 만들어 보도록 한다

Public Class clsTimeUnit
    Public datStart As Date
    Public datEnd As Date
    Public iMonth As Integer
    Public iYear As Integer
    Public sUnit As String

    Public dblAmount As Double
    Public iTasks As Integer

    Public sType As String
    Public sngWidthRate As Single
    Public rUnitCell As Excel.Range
	
    Public iDays As Integer
    Public sDays As String
    Public iActualDays As Integer
    Public dblAmountCalendarCell As Double
	
	Public oListOfWBSActualDatas As List(Of WBSChild)
	
    ReadOnly Property UnitWidth() As Double
        Get
            Return oGantt.dblDayWidth * iActualDays * (8.38 / 54)
        End Get
    End Property
    
    Public Class WBSChild
        Public sID As String
        Public dblAmount As Double
    End Class
	
End Class

흥미로운 것은 VB.Net에서는 크래스 모듈 속에 또 크래스모듈을 마음대로
작성할 수 있다는 것이다
그리고 Collectin 개체도 다양하다는 것
그냥 참고로 보시고..VB.Net에 대하여서는 uno-weekly에서 시리즈로 심도있게
계속 진행할 것이니 관심갖고 보시고
여기에서는 엑셀 VBA에서의 크래스모듈로 위의 내용을 수정하여
엑셀버전으로 만들자
언어는 좀더 편리하게 코딩을 하자는 의미에서 자꾸 발전하는 것이지
VBA에서 못할 것은 하나도 없다
기본이 되는 배열을 알면 모두 가능한 것들이니까..
또한 발전이라고 하는 것은 기본에 항상 바탕을 두고 발전해야
흔들림이 없고 확실한 개념을 유지하고 살 수 있다
그러니 VBA를 활실히 해 두면 모든 언어에 도전해도 문제 없는 것

새로운 정보를 만들기 위하여 기본정보테이블에 하나의 정보열을 추가하자
아래의 그림과 같이 하나의 정보를 추가함에 따라서 아주 많은 정보들이
재생산 된다



하나의 작업에 기간이라는 정보가 들어 옴에 따라서
전체프로젝트의 시작일자,종료일자, 각각 작업의 기간, 종료일자등이
만들어 질 것이고 이것을 처리하는 clsTask에서 정보를 담을 변수들을
좀더 만들어지고, 전역변수에서 전역적으로 사용할 변수를 준비하고
그리고 앞페이지에서 만든 각각의 프로시져에 이것을 처리할 코딩을 좀더 추가하고
(이번화일에 주석으로 추가된 코드를 표시하였으니 참고 하시고..)

이 작업을 하기전에 단순한 타임밴드를 그리는 것을
아주 기본적인 것을 uno_weekly_0742에 만들어 놓았다
이렇게 만드는 것은 그냥 그림만 그려 놓았을 뿐 인것이다



개체같은 것을 왜 만들어야 하는지 위의 것을 실행해보시고
생각을 해보시면 좀더 확실해 질 것이다
위의 것은 단순히 날짜를 일자별로 칸을 만들어놓은 것이다
각각의 날짜단위에 해당 날짜에 작업비가 얼마가 배정되어 있는지
해당날짜를 경유하는 작업들은 어떤 작업들이 있는지
이런 관련정보를 모두 해당날짜에 모아서 관리하게 되면
나중에 챠트를 그릴때, 혹은 다른 일정별 정보를 분석을 할때
모든것이 융통성있고,
다양한 표현을 쉽게 하는 것이 가능해 지는 것이다

아래와 같이 타임밴드의 하나의 일정유닛(Unit)을 표현하는
크래스 모듈을 만들고
프로젝트의 시작일자에서 부터 프로젝트의 종료일자까지 순환하면서
하나의 Unit에 몇일이 들어갈지를 지정한 만큼
(여기에서는 Unit하나에 우선 가장 기본인 하루가 들어가는 것으로 한다)

여러개의 Unit을 표현하는 정보의 구조를 만든 크래스모듈을
사용하게 되는 것이다
만들어지는 타임 Unit을 배열에 모아두게 된다



배열에 모아두면, 이 배열은 다양하게 활용할수 있게 되는 것이다
이 배열을 순환하면서 시트에 타임밴드 행을 그릴수 있고
필요하면 타임밴드 유닛별로 해당 작업명만을 골라낼수도
있을 것이고
해당 타임밴드에 자금 로드가 얼마나 걸리는지도 따져 볼수 있을 것이고
모든 작업의 쏘스가 되는 배열이 되는 것이다
VB.Net의 VSTO add-in에서는 좀더 지능이 높은 집합체를
사용하지만, VBA에서는 그런 다양한 집합체가 없다
그렇지만 모든 집합체의 원본인 배열만 잘 활용하면
실은 못하는 것이 없는 것이다

타임밴드를 만들기 위한 전역변수

Public iDaysInUnit As Integer --- 하나의 Time-Unit에 몇일짜리로 할것인가
Public oTimeUnits() As clsTimeUnit --- clsTimeUnit타입의 동적배열
Public datProjectStart As Date --- 전체 프로젝트의 시작일자
Public datProjectEnd As Date --- 전체 프로젝트의 종료일자
Public datCalendarStart As Date --- 전체 프로젝트의 카렌다 시작일자
Public datCalendarEnd As Date --- 전체 프로젝트의 카렌다 종료일자

전역변수는 실행이 시작될 때 초기화를 항상 잊지 말아야 한다
그렇지 않으면 두세번 실행할때 엉뚱한값이 만들어지는
원인이 된다

왜 개체를 만들어서 사용하라고 할까??
사용하고 싶은 동기부여를 일으키려고 이렇게 저렇게 생각해보게 된다
또한 이런 프로젝트는 개체를 이해하지 못하면 할 수 없다고 해도 과언이 아니다
물론 할수는 있지만 스스로 복잡해서 때려 치운다
복잡한 것을 어떻게하면 간결하게 할 것인가..
그래서 또 하나 개체를 활용하면 얼마나 편리하고 좋은지
그리고 구현하고 싶은 다양한 구현을 할 수 있는지
쌤플을 만들어 보자
개체를 집합체에 넣고 순환을 하면서 이런 저런 일을 해보는 것이고
세상의 일이란..
어떻게 하면 복잡하게 얽혀있는 일을 단순하고 눈에 팍 들어오게
할 수 없을까??라는 문제의식속에 살고
그래서 다양한 표현을 요구하게 되는 것이고
이런 다양한 표현을 자신의 상상력과 조합하여 엑셀프로그래밍을
할 수 있는 것이다



위의 그림은 TimeUnit개체를 만들고 TimeUnit속의 각속성에
해당 값을 주고..이것을 배열에 담아서 순환하면서
TimeBand를 그리려고 한 목적의 것을
다른 시각으로 개체속의 내용을 펼쳐 본 것이다

얼마던지 다른 시각으로 표현할수 있는 것이다
작업을 중심으로 해서 전체의 윤곽을 볼까??
날짜를 중심으로 해서 전체의 흐름을 볼까??
아니면 WBS그룹별로 그룹핑하여 볼까??
수도 없는 구현방법이 가능해 지는 것이고
어떤 일을 하는데 가장 눈에 보기 쉬워서 다음 작업에
대한 의사결정을 손쉽게 할수 있는 재능을 갖은 사람!!!
바로 그런 사람이 여러분, 엑셀프로그래머라고 할 수 있는 것이다

개체를 만들어서 배열이나 집합체에 담아두면
정보의 블랙박스가 되는 것이다
이것으로 떡도 해먹고, 술도 담궈먹고 과자도 해먹는 것이다
그래서 개체를 만들고 집합적으로 보관해두고 사용하는 목적인 것이다
떡해먹을때마다 새로운 정보 수집을 하거나
술담궈먹을때 마다 새로운 정보 수집을 하거나 할 필요가 없이
하나 만들어 놓으면 이렇게, 저렇게 써먹을 수 있는 것이다
그래서 개체와 집합체, 배열을 시도 때도 없이 떠드는 것이다
단순한 엑셀의 셀에 값을 주고 하는 일만 하는 수준에서 벗어나라는 의미에서!!!!
참으로 이런 개념을 잘 이해하게 되시면
우노 한테 술한잔 단단히 사야 하는 셈이다
세상을 보는 시각도 달라지는 것이고..

아무튼 그런 떡해먹는 방법중의 하나로서
위의 그림과 같은 내용을 준비한 블랙박스 배열을 순환하면서
만들게 되는 것이다

아래의 화일로 이렇게 , 저렇게 망가뜨려 보면서
각자의 표현해보고 싶은 방법대로 해보면 해볼수록
내공은 쌓인다!!


***[LOG-IN]***