PROGRAMMING WORKSHOP

Financial Planning | 코드별 과거정보 재구성

회사의 과거정보가 있다
이것을 분석하여 미래계획을 세워나간다
과거정보도 모두 코드화가 되어있다
어떤 돈을 어떤 계정에서 썼는지 코드로 분류가 되어 있다
그런데 회사마다 조직마다 나름대로의 코드로 분류하여 관리한다
하지만 미래정보는 정제된 정해진 표준화된 코드로 지난 정보를
재분류하는 것이 계획은 세워가는데 기본작업이 된다



그림과 같이 표준화된 코드번호를 기존기록에 새로운 열을 삽입하고
코드와 코드명을 재입력후 나중에 또 이것만 뽑아낸 과거자료를
만들게 된다

이런 코드의 재분류작업은 재무관련뿐만 아니라 어느 산업에서나
필요한 작업일 것이다
실제작업에서는 잡다한 상세하고 상황에 따른 코드를 중구난방으로
부여하는 것이 일반적이다
이것을 필요에 따라 용도에 따라 재분류하여야 할 경우가 다양하다
그런 부분에서 활용하는 도구를 만들어보자
코드재부여를 하려니 일일이 별도로 만들어 놓은 코드표를
보면서 작업을 하려면 눈이 빠질일이고, 삽질이다
해당셀을 선택하면 표준코드목록이 나타나게 하고 싶은 것이다

목록을 나오는 도구를 무엇을 선택할까?
유효성검사로 목록이 나타나게 할까?
아니면 UserForm을 사용할까?
도구가 많으면 선택하기 힘들다
그러나 가능하다고 생각되는 것이 이 것 두개이니 별 큰 고민할 것없다
UserForm으로 하자

그럼 이제 사용하던 코드열의 옆을 선택하면 나타나게 할까..??
아니면 사용자가 지정한 범위에서 항상 나타나게 할까?
사용자의 의견은 대개가 사용자가 어떤 범위에서 사용하고 싶다고
범위를 지정할수 있게 하였으면 좋겠다고 한다
그럼 이것도 결정되었다
그런데 UserForm의 위치를 잡기가 참 까다롭다
그렇다고 API함수를 사용하여 정확한 현재 활성화셀(선택범위와
활성화셀은 다르다는 것은 아시겠고..)
의 바로 밑이나 옆의 위치를 잡는 다고 하는 것은 배보다 배꼽이 더크다
그러니 API함수같은 것 동원하지 말고
그냥 UserForm의 주어진 기능으로 최선을 다 하자
UserForm은 속성이 디폴트상태에서는 항상 워크시트의 정가운데
나타난다..
또한 UserForm이 뜬 상태에서는 시트를 선택할수 없다
UserForm을 죽여야 시트를 선택하게 된다
이 두가지 속성을 자유롭게 우선 하자



폼이 로드될때 프로그래밍적으로 속성을 주는 것도 좋지만
ShowModal속성은 적용할수 없다
이것은 디자인타임에 설정하여야 폼이 뜨기전에 정해져야 하는 것이기
때문에 그렇다, 그런 경우는 속성창을 활용하면 된다

속성같은 정보는 적용할 타이밍이 있는 것이다
원재료가 모두 들어간 다음에 정할 것이 있고
원재료가 다 섞인후에 정해줘도 될 것이 있는 것과 마찬가지다
물건 다 만든 다음에 바꿀수 있는 것이 있고 없는 것이
있는 것과 마찬가지다

아래의 그림과 같이 사용자가 범위를 선택한다



그럼 해당 범위내에 셀에 커서를 넣고 엔터키를 치면
목록이 화면왼쪽상단에 나타나게 한다
방향키로 코드를 선택하면 해당 코드가 선택된 범위에
자동입력된다



도구가 두개 생기는 셈이다
하나는 사용자범위 설정하는 도구(이 것은 다른 용도로도 많이 활용한다)
또하나는 코드목록이 나타는 도구

이 코너를 다 끝내면 다양한 업무에 활용할
다양한 도구를 모으게 될 것이다
업무소루션은 이런 도구를 또 각자 용도에 맞추어 조립하여
사용하면 개발 속도가 빨라질 것이고..그런 목적으로
이 코너를 진행하고 있는 것이다
최대한 떼어서 다른 곳에 쉽게 사용할 수 있는 모듈화를 한다

다시 작업내용을 정리하면
작업을 위하여서는 도구메뉴에 메뉴를 하나 삽입하여
이 메뉴를 크릭하면 코드재정의를 위한 범위설정작업을 위한
UserForm이 나타나는 용도

두개의 UserForm이 필요하겠다
하나는 사용자로 부터 어느 범위에 작업을 하겠다는 범위를 전달 받기위한 폼과
입력작업을 하기 위한 UserForm..
범위를 지정하는 작업은 지난 페이지에서 한 롤업썸의 범위설정폼을
그대로 공동으로 사용하는 것이 자원이 절약 되겠으나..
헷갈리면 곤란하니까..그냥 하나를 더 만들자

코드를 재정의하고 싶은 범위를 대화상자를 열어서
사용자가 범위를 정의한 후 폼을 닫으면
RefEdit 콘트롤에서 얻은 주소 범위를 어딘가에 보관하여야 한다
이럴때는 공동의 모듈시트의 변수에 보관하는 것이 좋을 것이다
그래야 다음 재정의작업을 위한 UserForm이 사용자가 어떤셀에
입력을 하려고 할때 변수의 범위인지 Sheet의 Change이벤트프로시져에서
알아내고 코드재정의용 폼을 아래의 그림과 같이 띄우는 씨나리오로 한다



Property 프로시져라고 하는 것이 있다
크래스모듈에서 속성값을 주고 받는 프로시져이다
이것은 크래스모듈에서 사용하는 것이지만 일반모듈시트에서도 사용되는 것이니까
사용하도록 하자
일반 함수와 뭐가 다르고 편리한지 알아 본다

일반 모듈시트에 Property Procedure를 사용하였다
이것은 물론 함수를 사용해도 된다
하지만 Property Procedure는 속성의 특징상 하나의 값을 주고 받는
간단명료하여서 관리하기 편리한 것이다

예를 들어서 어떤 표준코드테이블의 범위를 얻어오고싶다
아래와 같이 코드 시트명은 상수화시켜놓는 것이 좋고

Public Const SHT_CODE As String = "COA_CODE"

이것을 읽고 CodeRange라는 범위를 얻는 속성을 만들면

Property Get CodeRange() As Range
On Error Resume Next
Dim rX As Range
Set rX = Worksheets(SHT_CODE).Range("A1").CurrentRegion.Offset(1)
Set CodeRange = rX.Resize(rX.Rows.Count - 1)
End Property

위와 같은 경우는 언제나 에러가 날 소질이 있는 것이다
즉 워크시트상수명의 이름의 시트를 사용자가 삭제하였다면
시트가 있더라도 해당시트의 테이블이 A1셀을 기준으로 만들어지지 않았다면
결과값은 Nothing이 되는 셈이다
이것을 사용하고자하는 소비자(Consumer)즉 다른 프로시져는
읽어서 Nothing이면 메시지를 띄워야하는 것이 정상적인 씨나리오인셈이다

modMenu 모듈시트의 메뉴목록 상수를 아래와 같이 추가시키고

Const MENU_LIST_Tool As String = _
"작업도구:도구_A,도구_B,도구_C,도구_E,합계계정수식입력,계정재정의작업"

이메뉴를 크릭하면 실행되는 DoByMenuCall의 프로시져에 추가하고

Private Sub DoByMenuCall()
Dim sCap As String, sParentCaption As String
On Error Resume Next
sCap = CommandBars.ActionControl.Caption
sParentCaption = CommandBars.ActionControl.Parent.Parent.Caption
Select Case sParentCaption
    Case "분석작업"
             ...
             ...
             ...
    Case "시트이동"
             ...
             ...
             ...
    Case Else
        Select Case sCap
            Case "합계계정수식입력"
                ...
            Case "계정재정의작업"
                frmDefineCode.Show
        End Select
        
End Select
    
End Sub

위의 프로시져에 의하여 frmDefindCode 사용자정의 폼이 열리고
범위설정하여 해당 범위가 외부변수에 담기고
워크시트의 Change이벤트프로시져에서 해당 범위에 입력을 하는 것을
감지하게 되면 코드목록상자를 띄우게 되고 사용자는
코드목록상자의 폼이 뜨면서 위의 속성으로 갖여오는 범위 CodeRange를
찾아서 목록으로 채우고 나타나게 되고 목록에서
선택하면 해당 셀에 코드와 설명이 자동입력 되게 한다

셀에 계정과목중 일부 문자만 넣고 엔터를 쳤을때는
해당문자가 들어있는 계정과목만 나타나게 하거나,
스페이스바로 빈문자를 입력하고 엔터키를 치면 목록 전체가 나타나게 하고
방향키를 치면 목록이 계속 이동하면서 해당 값이 셀에 입력되고
입력후 ESC키를 치면 입력취소 되고
입력후 Enter키를 치면 입력된후 목록상자 닫히고
이런 오밀조밀한 작업이 필요할 것이다
그런 내용은 아래의 화일의 코드에 설명해 놓는 것이 좋을 것 같네요

***[LOG-IN]***