PROGRAMMING WORKSHOP

Financial Planning | 새 코드별 과거정보 집계시트만들기 수익과 비용테이블

자산,부채,자본 테이블은 코드별로 정렬을 하여도 되었으나
수익과 배용은 코드별로 정렬을 원하지 않고
사용자가 지정한 대로 정렬을 했으면 한다
이런 경우가 많을 것이다
어떤 것은 코드의 순서대로 정렬이 되어도 좋겠지만
실무적으로 어떤때는 그런 입에 딱 맞는 상황이 되지 않는 경우가 많다
이것은 이것과 모아 주고,저 것은 또 어떻게 모아달라는 상황이
많을 것이다

아래의 그림과 같이 표준코드테이블에 특별한 조건열을 두어서
좀더 상황의 요구에 맞게 해주는 것이 좋을 것이다



몇개의 화일로 나누어서
4,5번 계정은 특별히 지정된 합계계정의 수식을 정의해 놓았고
예를 들면 43000 코드의 계정은 [41000-51000]
즉 41000계정값-51000계정값을 빼는 수식을 테이블에 만들어 넣어야 한다
문자열로 표현된 지정된 수식을 읽어서 해당되는 셀의 주소를 찾아서
정상적인 수식으로 조합하여 넣어주는 작업을 해보자

지정된 수식의 코드 번호를 찾아서 해당 셀의 주소를 수식편집하는데
조합하여야 하는데
[41000-43000+44000-45000]등과 같이 몇개가 지정될지 모른다
일일이 찾아서 만든다고 하면 자동화가 필요 없는 것이고
프로그래밍적으로 몇개의 코드번호가 조합되었는지 찾아서
알아서 수식을 조합하는 것이 바른 방법일 것이다
그리고 연산자도 +가 될지 -될지 모르는 것이고..
VBA의 내공이 있으면 자연스럽게 풀리는 것이고.
그렇지 않으면 깝깝한 노릇이고

함수 하나를 만들면..

Function getCodeCollection(sFormula) As Collection
Dim oCol As New Collection
Dim iX As Integer
Dim iLen As Integer
Dim sTemp As String
Dim sChar As String
For iX = 1 To Len(sFormula)
    sChar = Mid(sFormula, iX, 1)
    If IsNumeric(sChar) Then
        If sTemp <> "" And Not IsNumeric(sTemp) Then
            oCol.Add sTemp
            sTemp = ""
        End If
        sTemp = sTemp & sChar
    Else
        oCol.Add sTemp
        sTemp = sChar
    End If
Next
oCol.Add sTemp
Set getCodeCollection = oCol
End Function

sFormula라는 매개변수는 지정된 수식입력방법
[41000-43000+44000-45000] 이라는 문자열을 위의 함수에
전달하여 코드번호와 연산자를 구분하여 집합체를 만들면
간단하게 처리할 수 있게 될 것이다
코드번호가 몇개이던 연산자가 몇개이던 상관 없다

집합체를 위의 함수에서 받아서 아래와 같이 순환하면서
해당코드의 주소를 찾아서 실제 셀에 입력될 수식을 조합한다

'  위의 함수에서 oCode집합체를 받아서
Set oCode = getCodeCollection(Trim(sFormula))
'  수식을 연결하기 위한 변수를 "=" 로 초기화하고
sFormulaToWrite = "="
'  순환하면서
For Each varX In oCode
'  코드문자이면 해당 코드의 주소를 찾고
    If Len(varX) = 5 Then
        sFormulaToWrite = sFormulaToWrite & _
        rDest.Find(CStr(varX), , , xlWhole).Offset(, 2).Address(True, False)
'  아닌 것은 연산자..그냥 연결하면 되고
    Else
        sFormulaToWrite = sFormulaToWrite & varX
    End If
Next
'   위와 같이 연결한 수식을 해당 셀에 써넣고
With rTargetCell
    .Formula = sFormulaToWrite
    .Interior.ColorIndex = 39
'   나머지 열방향으로 각년도별 셀에 붙여 넣는다
'   그래서 주소형식은 열방향 상대, 행방향 절대 Address(True,False)
    .Copy Union(.Offset(, 1), .Offset(, 6), .Offset(, 7))
End With

***[LOG-IN]***