PROGRAMMING WORKSHOP

Skip Navigation Links. Skip Navigation Links.

Financial Planning |메뉴시스템_1

회사마다, 공공기관마다 골머리를 싸메고 그려대는 것이 향후 사업계획이다
과거 정보를 바탕으로 미래정보를 계획해 보는 것..
이것은 개인이나 회사나 마찬가지다..
이럴 경우에는 어떨까..
저럴 경우에는 어떨까..
다양한 변수를 시나리오별로 꾸며서 넣어보고 결과를
비교하고 의사결정을 해나가는 도구로서의 엑셀은 ..
그 것 자체가 엑셀이다
가장 중요한 것은 들어오는 돈과 나가는 돈이 균형을 잡을때
기업이나 인간이나 행복해 진다
회사나 개인이나 미래의 그림이 또한 확실하게 그려져야 열정이 생긴다
계획은 어디까지나 계획이지만 그림을 계속 그려가는 것이 인간의 삶이다
어렇게 따져보고,저렇게 따져보고..

아무튼..

어떤 기업의 중장기 재무전략수립의 프로그래밍파트를 지원하다 보니
다양한 부산물들이 많이 나온 것들을 같이 공유하는 것이 좋을 것 같아서
올려 보도록 하게 되었다

꼭 재무에 관련된 내용도 아니니 다른 산업에 종사하시는 분들고
잘 챙겨 보시기 바란다
재무관련내용이 숫자도 많고 좀 복잡한 것중 하나라서 쌤플로 삼은 것 뿐이니
[재무]소리가 나와서..에이 이것은 나와 상관없네 하지 마시기 바란다

모듈별로 범용으로 활용하기 좋게 쪼개서 올려 보도록 하였다
흐름에 대한 순서는 없다..
아마도 회사의 기획전략팀이나,회계팀이나 어떤 부분을 자동화하여야겠는데..
하는 것들이 입맛에 맞게 한입에 쏙 들어가는 모듈들이 되었으면 좋겠다

업무로직은 모두 아는데 VBA로 자동화시키려면 어떻게 하나?
그런 문제들이다

구현하는 방법은 아주 다양할 것이다
엑셀의 파워를 여러분의 계획과 표현을 다양하게 응용하는데
도움이 되었으면 좋겠다

우선 위와 같은 소루션은 시트한장 달랑 표현되는 그런 것이 아닐것이다 시트가 여러장 되고
백업되는 데이타를 다른 통합문서를 참조하여야 할 경우도 있고
외부 DB를 참조하여야 하는 경우도 있을 것이다
그러니 이런 소루션을 만들어 보는 것이 WorkShop의 당초취지였던지라
아주 좋은 주제가 될 것이다
또한 재무전략이라는 이름이라서 혹시..이것은 내가 만들고자 하는
소루션과는 다른데..라고 생각하면 잘못
제목과 포커싱은 Financial Planning 에 맞추었지만 내용은 모든 엑셀프로그래머들이
활용할수 있는 내용이 될 것이고..각자의 산업에 응용하시면 된다
모두 같은 맥락의 것이니 모두 관심갖고 차근 차근 모듈을 모아서
여러분이 참여하는 소루션에 엑셀파워를 한껏누리시기 바란다

시트가 여러장 되고, 일을 하는 것도 다양하고
이것을 어떻게 정리 정돈하고 꾸려 갈것인가..
VBA초보때는 시트마다 버튼도 달고 ActiveX콘트롤도 삽입하고
난리를 치지만..큰 소루션을 만들때는 모두 헛질이다.
좀 규모가 있는 소루션은 데이타관리가 가장 중요하다
눈에 보이는 멋진 모양은 최종적인 결과물에만 필요한 것이지
실제 작업을 하는 부분들은 시트가 최대한 깨끗해야 한다
또한 통합문서 자체가 쓰레기가 쌓여있지 않은 청정한 상태를
유지하려고 노력하여야 한다
이것이 소루션의 효율을 높이는 길이다

엑셀이 제공하는 가장 간편한 전체의 흐름을 잡아줄수 있는 도구는
메뉴시스템이다
2007메뉴가 아니라도 2003버전의 메뉴시스템을 만들어서 전체를
관리하는 시스템을 기본을 하는 것이 가장 가볍다
2003버전의 메뉴는 2007이후의 리본시스템에서도 실행되는 것이고..
그 메뉴시스템을 위한 모듈을 만들어 보도록 하자
혹은 Navigation System이라고도 할 수 있을 것이고..

메뉴는 개발하면서 수시로 바뀌게 된다
그래서 특히 메뉴시스템을 준비하고 있어야 전체의 흐름을 놓치지 않는다

모듈시트를 한장 삽입하시고
modMenu
라고 모듈시트를 한장 준비하자
이렇게 준비하여 놓으면 이런 시스템은 어떤 소루션이나 공통이다
나중에 다른 소루션을 만들때도 이 모듈을 그래로 떼어다가 사용하면 되니까..
modMain 이라는 모듈시트에

Option Explicit
Const MENU_LIST_Ana As String = "분석작업:분석_A,분석_B,분석_C,분석_E,분석_F,분석_G"
Const MENU_LIST_Rep As String = "보고서:보고서_A,보고서_B,보고서_C"
Const MENU_LIST_Navi As String = "시트이동:준비_1,준비_2"
Const MENU_LIST_Tool As String = "작업도구:도구_A,도구_B,도구_C,도구_E"
Const PROJ_NAME As String = "FP_SYSTEM"
Public oCurrentSheets As Collection

라고 상수와 전역변수를 만든다
위의 상수는 메뉴가 확장되거나 축소되거나 할때마다 문자열의 값만
바꿔주면 될 것이다
그리고 프로시져를 아래와 같이 만든다
각자 화일을 다운 받기 전에 직접 만들어 보시면 더욱 좋고

Sub CreateMenu()

Dim oMainBar As CommandBar
Dim oTopPopUp As CommandBarPopup
Set oMainBar = CommandBars(1)
oMainBar.Reset
Set oTopPopUp = oMainBar.Controls.Add(MsoControlType.msoControlPopup, , , , True)
oTopPopUp.Caption = PROJ_NAME

CreateSubMenu oTopPopUp, MENU_LIST_Ana
CreateSubMenu oTopPopUp, MENU_LIST_Rep
CreateSubMenu oTopPopUp, MENU_LIST_Navi
CreateSubMenu oTopPopUp, MENU_LIST_Tool

End Sub

위의 것은 콘트롤 하는 프로시져이고
CreateSubMenu 라는 섭프로시져로 실제 메뉴를 만드는 작업 프로시져가 되겠다

Private Sub CreateSubMenu(oTop As CommandBarPopup, sList As String) Dim oPopUp As CommandBarPopup, varX As Variant Dim shtX As Worksheet On Error Resume Next Set oPopUp = oTop.Controls.Add(MsoControlType.msoControlPopup) oPopUp.Caption = Split(sList, ":")(0) If oPopUp.Caption = "시트이동" Then Set oCurrentSheets = New Collection For Each shtX In Worksheets With oPopUp.Controls.Add(MsoControlType.msoControlButton) .Caption = shtX.Name .FaceId = Int(Rnd() * 500) + 20 .OnAction = "DoByMenuCall" oCurrentSheets.Add shtX.Name End With Next Else For Each varX In Split(Split(sList, ":")(1), ",") With oPopUp.Controls.Add(MsoControlType.msoControlButton) .Caption = varX .FaceId = Int(Rnd() * 500) + 20 .OnAction = "DoByMenuCall" End With Next End If End Sub

위의 메뉴시스템을 메뉴에 삽입생성하는 타이밍은 통합문서가 열릴때 한다
아래와 같이 ThisWorkBook 통합문서모듈시트의

Private Sub Workbook_Open() modMenu.CreateMenu End Sub

와 같이 하여 통합문서의 Open 이벤트프로시져에서 modMain모듈시트의
CreateMenu를 호출한다...아래와 같이 만들어졌다



시트이동의 경우는 시트가 삽입이 되거나 삭제가 되면 자동으로
업데이트가 되게하여 현재 통합문서상의 유효한 시트만 나타나게 한다

이 것을 위하여 Sheet의 Activate이벤트프로시져에 한줄
추가 시키면 될 것이다

Private Sub Workbook_SheetActivate(ByVal Sh As Object) If modMenu.oCurrentSheets Is Nothing Then GoTo X If modMenu.oCurrentSheets.Count <> Worksheets.Count Then X: modMenu.RefreshShtNaviCommandButtons End If End Sub

역시 ThisWorkBook 개체의 모듈의 SheetActivate로 하여야
특정한 시트에 한하지 않고 전체시트를 콘트롤 할 수 있게 된다
시트를 삽입하거나 삭제 하면 메뉴가 자동으로 업데이트되는 것을
볼 수 있을 것이다

이렇게 간단하게 제공되고 사용자정의할수 있는 메뉴시스템을
놓아두고..이런 저런 버튼을 시트마다 진열하는 것은
효율을 떨구게 된다
가장 가벼운 방법이니 습관적으로 사용하시는 것이
좋은 소루션을 만들어가는 습관이 된다

위와 같이 만드는 방법의 기초실력은..

1)문자열로 배열을 자유롭게 만들수 있다
2)메뉴시스템을 구성하는 개체의 개념을 안다(외울 필요는 없다..개념을 알면 된다)
3)통합문서단위의 이벤트프로시져를 이해하고 활용하여야 한다

또한 만들었으면 항상 청소도 할 줄 알아야 한다 위와 같은 메뉴는 특정소루션에만 필요한 것이지 다른 작업을 할때 존재하고 있어 보았자 군더더기다 프로그래밍은 만들줄 알고, 없앨줄 알아야한다 계속 진행중....

***[LOG-IN]***