PROGRAMMING WORKSHOP

자재관리 | 좀더 정리하고 개선

STEP_20 ---------------------------------

스텝 20까지 오면서 모듈시트가 걸레가 되었다
실제로 한다면 정리,정돈하면서 하겠지만 설명을 붙여 가면서
하려니..본의아니게 걸레가 되었다
정리 정돈을 하고, 코드를 좀더 개선하도록 하자
프로그래밍을 하다가 잠시 다른 일에 쫓기다가 한참만에 다시
모듈시트를 잡고 다시 무언가 하려면 정신이 멍해진다
자기가 작성해 놓고, 자기도 헷갈린다
그래서 주석같은 것을 잘 달아두는 습관이 좋다
그리고 한참만에 할때는 무언가 다시 계속하려고 하지 말고
모듈시트의 모든 변수,상수들의 자원상태를 점검해 보는 습관이 좋다
변수,상수들을 점검하다 보면 처음 시작할때의 기억이 투명하게
머리속에 다시 그려지니까..계속하여 코딩할수 있는 두뇌의
상황이 세팅된다..
그런후 연속적으로 코딩을 하면 잠시 버렸다가 다시 와서 해도
별로 지장이 없다

어느 정도 작업이 안정되면(더 이상 기능상 변경이 없을 것같은..)
변수명,함수명등도 좀더 직관적으로 알기 쉽게 바꿔주게 되고
그러면서 좀더 간략하게 구성하게 된다

자원(Resources)이라는 개념을 잘 생각하시는 것이 좋다
WPF코너에서 가장 많이 사용되는 것이 이 자원(Resources)라고 하는 것이다
자원의 관리..
우리의 실생활에서는 사람자원, 돈자원, 장비자원,기타자재등등이
있을 것이지만 프로그래밍속의 세상은 모두
정보라는 자원하나만 존재하는 것이다
물론 정보의 성격이 자재,사랍,장비,시간등등이 있지만
자원이라는 개념을 절실히 갖으면 프로그래밍의 중심이 잡힌다
WPF는 발전된 언어라서 그렇게 발달했다..자원에 포커싱하는 것
자원을 관리를 잘 하는 것
그래서 WPF,윈도우폼,VSTO..얼핏보면 VBA와 뭔 관련이 있으랴 싶어서
거들떠보려고도 하지 않는 다면 문제다
그런 것을 통하여 개념을 계속 확장하여 나가야 하는 것이다
즐겁게..새로운 개념, 새로운 기술에서 영감을 얻어가면서
프로그래밍하는 흥분을 갖여야 파워가 생긴다

자원..하면 자원관리를 말하는 것이다
관리!!란 또 뭐냐????
예를 들어서 보고서 워크시트라는 새로만들어내는 자원이 있다치자
그런데 한번만 접근하면 될 것을
언제 만들었었나..언제 변수가 있었나???!!
또 만들어서 사용한다..이것은 관리가 잘 되고 있다고 할 수 없는 것이다
어느 정도 소루션이 자리를 잡으면
정보, 자원관리측면에서 잘 정리 정돈해 나간다!!라는 주제를
잃지 않으면 된다

자원관리라는 측면에서 좀더 정성을 드리는 코딩방법은
무엇이 있을까..
그것을 정리해보도록 하고..그림과 같이 자원목록을
한눈에 볼수 있으면 좋을 것이다



아마도 스텝 18정도 이후에 갑자기 이상한 에러들이 발생하거나..
되던 것이 안되거나 하는 것이 발생할것이다
왜이러지..
초보님들이 열심히 VBA를 하여 어느 정도 되었다 싶은 앞전의 스텝까지..
만족하였다가..악몽에 시달리는 부분이 걸리게 된다
이벤트프로시져의 신나는 활용이 악몽이 되는 것이다
이벤트프로시져에 이것 저것 기능을 넣다 보니까..
이것을 통제를 해 주지 않으면 선이 악이 되는 순간이 된다

예를 들어서
워크시트의 Activate이벤트프로시져에 무언가를 기능을 많이
넣어 놓았는데..
한 참 프로그래밍을 진행 하다 보니까..
어떤 시트를 무심결에

Dim shtX As Worksheet
Set shtX=SomeSheet
shtX.Activate

이 shtX는 단순히 활성화만 시키겠다는 의도였는데
이 Activate명령이 실행되는 순간...위에서 worksheet_Actviate이벤트
프로시져가 본의 아니게 실행되는 것이다
그래서 원하지 않는 결과를 나타내거나
혹은 보이지 않는 곳에서 쓸데 없는 짓을 수차례 반복하는
일이 벌어져 전체의 효율이 떨어지고..버벅거리게 되는 것이다
그래서 이런 순간이 되면..자신의 능력은 모르고
[VBA는 한계가 있군...!!]이라는 헷소리를 하게 된다
그래서..내공이 쌓이면 자연스럽게 아래와 같은 코딩을 하게 된다

Dim shtX As Worksheet
Set shtX=SomeSheet
Application.EnableEvents=False
shtX.Activate
Application.EnabelEvents=True

혹은 외부변수로 bStopEvent As Boolena으로 선언하고
이 변수를 활용하여도 좋고..

Dim shtX As Worksheet
Set shtX=SomeSheet
bStopEvent=True
shtX.Activate
bStopEvent=False

Sub 워크시트 활성화 이벤트프로시져()
If bStopEvent Then Exit Sub
...
...
...
...
End Sub

라고 하여 bStopEvent를 이벤트프로시져를 통제하는 스위치로
활용하여도 좋을 것이다
어떻게 하던 각자의 스타일..하지만 이것도 헷갈리게 되는 수가 있으니

Application.EnableEvents=False
이벤트프로시져를 작동하게 할 어떤 작업
Application.EnableEvents=True

라고 귀찮더라도 작성하는 습관이 좋을 것이고
그런데 문제는 어떤 메소드가 어떤 이벤트를 불러 일으킬지
예측하는 능력이 필요한 것이 선결 문제일 것이고
이 부분이 VBA와 엑셀의 내공을 쌓아야 할 부분인 것이다

즉 에러가 날것을 예측할수 있는 능력을 쌓아야 하고
이벤트가 발생할 것을 예측할수 있는 능력을 쌓아야 한다

또 초보일때 쩔쩔매는 것이

Application.EnableEvents=False
이벤트프로시져를 작동하게 할 어떤 작업(요부분에서 에러발생)
Application.EnableEvents=True


와 같이 에러가 발생하여 중단이 되었다
다시 실행하려고 하면 그동안 되던 많은 작업이
안된다
왜 그럴까??

Application.EnableEvents=True
라는 것이 실행되었어야 하는데..졸지에 중간에 에러가 나는 바람에
Application.EnableEvents=False
상태로 되어 있으므로 다시 실행이 되지 않는 것이다
그래서..항상 아래와 같이 에러처리를 해주는 습관이 필요한 것이다

On Error GoTo X
Application.EnableEvents=False
이벤트프로시져를 작동하게 할 어떤 작업(요부분에서 에러발생)
X:
Application.EnableEvents=True

중간에 에러가 나더라도 라벨 X로 이동하니까..
Application.EnableEvents=True
를 실행하고 끝나게 되는 것이다

프로그래밍을 하는 사람마다 코딩을 하거나
정리정돈하는 스타일이 다르다
어떤 것이 정답은 없다
효율이 좋고 , 보기 쉽고 ,중복되는 것이 없도록 작성하는 것이 요령이다
아래의 화일은
이해하기 곤란한 것도 있을수 있을 것이다
그러나..나름대로 일단계정리정돈을 하였으니 참고하시고
질문들 하시기 바란다

***[LOG-IN]***

위와 같이 작업을 위한 도구,
위의 작업도구에서 실은 빠진 것이 있다
청구를 한 자재가 언제 반입이 되었는지를 입력하는 장치가
있어야 한다
그것도 몇일날 여러개의 품목을 주문했는데
여러 품목중 몇개는 몇일날 반입하고, 나머지는 언제 반입되었는지의
구분된 기록이 있어야 제대로 되는 것일 것이다
청구한 것이 모두 같은 날 컴퓨터자동화편하게 한 날짜에
들어 오지는 않는다!! 절대로..
그렇게 딱딱 떨어지면 대한민국이 버얼써 통일이 되었을 것이다..하하!!

아무튼
작업을 하면서 발생한 정보를 보관하는 도구를 만든후 다음 작업은
무엇일까?
정보화마인드가 얼마나 충만한가??에 따라서 달라진다
프로젝트에 필요한 어떤 자재가 모두 물량이 몇개인데..
현재 들어온 량이 몇개라서 현재 몇 %정도가 반입이 되었는지
알고도 싶을 것이고..
어떤 품목이 가장 반입까지의 리드타임이 가장 긴가..??를
분석하고도 싶을 것이고
정보가 어느 정도 쌓인후의 분석작업이 필요한 그런 분석도구의
추가도 필요할 것이고..
또..
한 현장에서만 사용하는 도구를 전현장에서 정보를
공유하면서 사용한다면 좀더 훌륭한 도구가 되고, 이런것이
모여서 ERP가 되어야 실질적인 ERP가 될 것이고,
전체의 프로젝트관리가 되는 셈일 것이다
그런 공유된 작업을 위한 좋은 답이 VSTO가 될 수 있을 것이다
이 문제를 요청하셨건 분은 계속 추가작업에 대한 이야기를
주시면 또 씨리즈를 추가하여 나가게 될 것이다

STEP_21 ---------------------------------

스텝20에서 깨끗히 정리해서 우노가 하고 싶을대로
정리를 해서 올렸었다
디버깅없이 올려서 분명이 변수의 연결상에 문제가 있어서
작동이 안되는 것이 많이 발생하였을 것이다
경험많은 분들은..
또 정신줄 놓고 작업하셨군!! 하면서 수정을 하였을 것이나
다른 분들은 그렇게 수정하지 못하고 뭐야..!@# 안되잖아!!라고 하시는
그림이 보인다
의도적으로 스텝19이전에서 수정한 것은
UserForm이 매번 워크시트를 활성화할때마다 뜨거나
통합문서가 열릴때는 꼭 뜨게 하였었으나 이것은
청구품목을 더블크릭할때만 열리게 하였었다

사람마다 취향이 달라서..어떤 분은 항상 열리기를 바라고
어떤 분은 필요할때만 사용자의 요청에 의하여 열리는 것이 좋고..
그래서 각자 알아서 수정할수 있도록 하고 싶었던 것

아무튼 그런 저런 마음 안드는 것에 대한 메일이 있으니
좀더 손보도록 하자

스텝19까지 하였던 것을 좀 다른 방식으로 정리한..
기본적 컨셉을 보면..

Public Const DB_MAIN_FLDS As String = _
   "청구ID,업체명,발주일,입고일,현장명,공종명,팀명,청구자,핸드폰,메모"

위의 상수를 사용할때..

Sub ...()
...
...
Dim arrFlds As Variant
arrFlds=Split(DB_MAIN_FLDS,",")
Worksheets(1).Range("A1").Resize(,UBOUND(arrFlds))=arrFlds

...
...
End Sub

다른 방법으로 한다면

Property DBMainFields() As Variant
   DBMainFields=Split(DB_MAIN_FLDS,",")
End Property

Sub ...()
...
...
Worksheets(1).Range("A1").Resize(,UBOUND(DBMainFields))=DBMainFields

...
...
End Sub

여러곳에서 DB_MAIN_FLDS 상수를 배열로 변경하여
사용하게 된다면 위와 같이 배열만드는 공장(속성)을 세워놓고
필요할때마다 이곳을 호출하는 것이 경제적이고, 가독성이 좋다
이런 개념을 바탕으로 화일을 살펴보시고
편리하여 보이면 코딩스타일의 변화를 추구하시면 더더욱 발전!!
나중에 VSTO(VB.Net)등으로 확장하기 자연스러워지고..

***[LOG-IN]***

열심히 문제를 찾아서 또 메일 주시면 수정보완하여 올려 놓습니다!!
[청구편집시트]에서 버튼을 크릭하면
양식이 복사되어 새통합문서가 만들어지고..
정보가 옮겨지고 새통합문서가 저장되고 닫히는 과정이
스텝20이후의 화일에서 나타나지 않는 다고 하신다
분명히 잘 되는데..어쩐일인지 안된다고 하신다
어떤 경우의 수가 숨어있는지 궁금하다
이렇게 디버깅을 해보시기 바란다
프로그래밍을 어느 정도 한다고 하면서 디버깅을 잘 활용못하는
분들이 많다
한줄,한줄 따져 내려가면서 살펴보는 것이 중요하다
어느 줄에서 에러가 났는지!!!
에러가 나는 부분에서 그림판에 찍어서 보내주시면 좋겠다



디버깅도구는 프로그래머의 필수도구이다
항상 돌려보는 것을 게을리 하면 안된다
생각지도 않는 경우의 수를 찾는 유일한 방법이다
목록시트에서 값이 옮겨지면서 어떤 정보의 유효성때문에
중간에 에러가 나서 빠지기도 할 것이고..
다양한 경우가 숨어 있을 수 있다

STEP_22 ---------------------------------

경우의 수는 참 많다
질문하신 분이 청구서 화일이 정상적으로 나오지 않는다고 하신다
어라..잘 되는데..
그런데 따져 보니까..실수를 했다
(실은 따져 보려고 하지 않고 맞겠지..잘되겠지 하고 올렸다@#@$)
우선 청구서양식시트를 초기화를 우선 하지 않았다
이전 내용이 청구된 것이 10개라고 치면 이것이 양식에 기록이 되었다가
다음 번 청구는 5개라고 치면 5개는 이전 것이 그냥 묻어 있는 상태가 된다
항상..게으름이 원인이 된다
시작전..청소
종료후..청소 이것은 일상생활에서도 항상 떠드는 소리지만
이렇게 초기화에 게으르면 오류가 나게 되어있다
또한 양식시트는 목록을 16까지 처리할수 있고
만약 청구된 내용이 20개면 4개의 행이 삽입되어야 한다
이부분에서 처리상 현재 청구갯수와 양식의 준비된 갯수와의 계산에서
조건문을 하나 더 사용하지 않아서 빈탕이 되는 오류가 있었다
그것을 수정하여 올린다

그리고 통합문서의 OPEN 이벤트프로시져에서 여러가지가
실행될때 이것을 실행되지 않게 하고 싶다면
화일을 열때 SHIFT키를 누르고 연다
이것은 VBA를 바이패스하는 단축키이다

또 무엇이 잘못된 것이 있으면 질문 끊임없이 하시기를..!!

***[LOG-IN]***