PROGRAMMING WORKSHOP

프로젝트기성관리 |

테이블의 구성

데이타베이스개념이 있는 사람에게는 엑셀사용자들의 테이블을 보면
답답해진다..
분석하기 어려운 상태로 이런 저런 서식을 하면서 사용한다
아래의 그림과 같이 사용한다



실은 DB에서 정보를 뽑아서 엑셀의 테이블과 같이 프로그래밍적으로
재구성하는 것이 원칙이다
그러나 대개의 엑셀사용자들은 DB라는 것 없이
그냥 테이블을 위의 그림과 같이 구성하는 셈이다
대한민국의 자동화가 잘 자리를 잡았다면
테이블에서 필요한 정보를 마음대로 엑셀에서 뽑아서 용도에 맞는 테이블을
구성하여야 하는 것이 가장 바람직하지만, 자동화라고 하는 것에 대한
생각들이 별로 없다 보니..DB따로, 엑셀따로 , 따로, 따로 논다
회사에서 거창한 DB시스템을 만들어도 정말 실무자들의 엑셀활용상태를
감안하고 연동의 개념이 없다면..
실무엑셀사용자들은..시스템에 대하여..엿먹어라!!하고 즈이들 나름대로
엑셀화일을 뚝딱거려서 임시, 임시 자~알 사용한다
엑셀사용자들도 DB를 정보의 창고로 알고 SQL문으로 필요할때마다
뽑아서 본다면 되는 간단한 논리인데...스마트폰이나 갖고 놀줄알지..
개념이 꽝이다!!!
그래서 화일마다 SQL문으로 DB접근관련하여 많이 이야기하는 것이 공염불같지만
그래도 계속한다
그러니 이런 소루션을 만들려고 할때
엑셀개발자들은 현실을 무시하면 안된다
엑셀사용자들의 눈에 익숙한 것을 자동화하는 것이 좋다
그렇지 않고,,DB가 어떻구, 저떻구 떠들어 보았자..헛일이다
엑셀은 카메레온같이 변화무쌍하니까..그런 것을 최대한 잘 활용하는 것이
엑셀 프로그래밍이라고 할 수 있다

엑셀사용자의 입장에서는 대분류,중분류,,,모두 하나의 시트테이블에
죄다 때려 넣어야 직성이 풀린다..
테이블을 분리하고 어쩌구 해보았자..웃기지 말라고 한다
그러니 다 때려 넣고 하도록 하자..
작은 프로젝트에서는 하나의 통합문서에 죄다 때려 넣어도 부담없이
돌아갈 것이니까..

아무튼 사용자만족중심으로 가자, 그러기 위하여 질문하신분이
보내주신 사용하는 시트를 그대로 사용하도록 하자
이렇게 하지 않으면 사용자들이 낯섫어서 껄끄러워하니까..
UserForm을 좀더 변화를 주어 보자



WBS를 두면 레벨별로 하나씩 서식작업을 하여야 할 것이다
이것도 손이 가는 일이니, 한번에 되게 하자
그림과 같이 MultiPage콘트롤을 추가하여 두개의 페이지를
만들고 두번째 탭에서 편집을 위한 도구들을 추가하여 나가도록 하자
WBS열을 선택하고 WBS들여쓰기 버튼을 크릭하면 WBS의 레벨대로
작업명이 들여 쓰기가 되게 처리하기
필요에 따라 실제적인 작업과 제목작업을 색상별로 구분하고 싶을수도
있을 것이고, 추후 원하면 추가하고..
크래스모듈에서 버튼을 크릭할때 작업하는 내용을 크래스모듈에 작성하면 내용이 커진다
그래서 아래와 같이 작업하는 내용은 일반모듈시트에 작성하고
크래스모듈에서는 일반모듈시트의 프로시져를 호출만 한다면
쓸데없이 메모리상에 버튼마다 일일이 같은 프로시져가 계속 만들어지는
일이 없어지고 간단할 것이다

Option Explicit
Public WithEvents oBtn As MSForms.CommandButton

Private Sub oBtn_Click()
'modMain이란 모듈시트의 buttonClick이라는 프로시져를 호출하게 한다
modMain.buttonClick oBtn
End Sub

일반모듈상의 버튼크릭프로시져는 아래와 같이 아주 길어 질것이다
이것은 우선 WBS들여쓰기 편집용버튼에 대한 작업만 준 것이고
앞으로의 버튼마다의 하는 일에 따라서 아주 커지게 되는 것이다
그래서 이런 내용이 커질것을 개체속에 개체마다의 내용으로 만들면
성능에 부담감을 주게 된다는 것!!


'프로시져의 매개변수로 해당 버튼 개체를 전달한다
Sub buttonClick(oBtn As MSForms.CommandButton)
Select Case oBtn.Caption
    Case "WBS들여쓰기"
        If TypeName(Selection) <> "Range" Then
            GoTo Z
        Else
            Dim rWBS As Range
            Set rWBS = Selection
            If rWBS.Cells(1) = "WBS" Then
                If rWBS.Columns.Count > 1 Then
                    GoTo Z
                Else
                    If rWBS.Rows.Count = 1 Then
                        GoTo Z
                    Else
                        If MsgBox("WBS열의 오른쪽 제목열의 들여쓰기를 WBS에 의하여 진행하겠습니까?", vbYesNo) = vbYes Then
                            Dim rX As Range
                            Dim iLastLevel As Integer
                            For Each rX In rWBS.Cells
                                If rX <> "" Then
                                If iLastLevel < Len(rX) - Len(Replace(rX, ".", "")) Then
                                    iLastLevel = Len(rX) - Len(Replace(rX, ".", ""))
                                End If
                                End If
                            Next
                            For Each rX In rWBS.Cells
                                If rX <> "" Then
                                rX.Offset(, 1).IndentLevel = Len(rX) - Len(Replace(rX, ".", ""))
                                Else
                                    rX.Offset(, 1).IndentLevel = iLastLevel
                                End If
                            Next
                        End If
                    End If
                End If
            Else
                GoTo Z
            End If
        End If
    Case Else
        MsgBox "[" & oBtn.Caption & "] 각작업준비진행..."
End Select
Exit Sub
Z:
MsgBox "WBS라는 열머리가 선택된 하나의 WBS열을 선택후하세요" 
End Sub

별것도 아닌데 복잡해보일뿐이다
또한 위의 코드에서 중복되는 표현식이 있다
이것을 간단하게 처리해보시고..변수를 사용하면 된다
아래의 화일을 실행해보시면서, 추가할 것이 무엇이 있을까??
생각들 해보시면서 진행하도록 하자

***[LOG-IN]***