PROGRAMMING WORKSHOP

자재관리 | 모여진 정보의 분석,보고서

STEP_23 ---------------------------------

엑셀은 정보의 편집,입력도구이기도 하지만 핵심은 분석도구이다
즉 지금부터하는 것이 엑셀의 꽃인 셈이다
회사나 조직의 메인DB써버(정상적으로 꾸며진)의 자료를 마음대로
뽑아서 보고서도 꾸미고,분석도 하고
과거정보를 바탕으로 향후몇년간의 계획도 수립하고
과거정보를 바탕으로 다양한 케이스스터디 시뮤레이션도 돌리기도 하고
대쉬보드같은 것을 만들어 현황을 한눈에 보는 것도 구성하기도 하고
무궁무진한 일을 하는 셈이다

메인DB써버가 아닌 지금끼지 만들어온 엑셀도구로 정보가 많이 모여졌다 치고
분석이나 보고서를 꾸미는 것을 해보도록 하자
문제를 제안하셨던 분의 보고서중 일부는 아래와 같다



본래는 mdb 데이타베이스화일에 정보를 모아두고 이것을 끌어서
분석을 하여야 하지만..정보가 채워진 것이 없으므로
보내주신 과거엑셀데이타를 갖고 해보도록 하자

이런 보고서를 만들때
프로그래밍적으로 수식을 입력하여 주는 것이 좋다
그냥 값만 만들어주면 워낙 궁금증,의심증이 많은 상사나
관련자들은 이것이 어디서 나온 값이냐..
근거가 뭐냐..시비를 걸게 되어 있으니
프로그래밍적으로 수식을 만들어서 넣도록 하는 것이 좋다

대개 그림과 같이 ERP등 메인시스템에서 받아온 원시자료를
최종결과물(분석이나 요약보고서등)을 만들기 위하여
중간 정리시트를 만들어서 사용하게 될 것이다



이런 과정이 수식이 복잡하게 엮여서 이루어지게 된다
VLOOKUP,SUMIF,SUMPRODUCT,INDEX,MATCH 등등의
참조함수가 주로 사용될 것이고

VBA와 워크시트함수를 적절히 활용하여 주어진 원시쏘스에서
원하는 최종결과물로 만들어 보도록 하자

최종결과물에 품목에 대한 대분류별로 집계를 내고 싶은데..
ERP에서 제공받은 원시쏘스에는 대분류코드나 대분류명이 없고
제품명만 표현되어 있다
그래서 밤을 패고 삽질을 하는 경우가 많을 것이다
눈을 까뒤집고, 원시시트의 품목을 보고 코드번호를 부여하는 것이다
아주 흔한 현장에서의 엑셀 작업이다
또한 이렇게 입력하는 사람마다 분류방식은 제각각일수도 있을 것이다
그래서 밤을 세우는 것이다

이런 작업을 수시로 하였을 것이니
실은 이전에 하였던 코드분류수작업 내용을 보고
대분류코드와 해당되는 제품명을 찾아내서 두고 두고 사용하면
좋지 않을까???

그림과 같이 과거에 수작업을 하였던 테이블에서
대분류코드와 해당코드의 제품명을 찾아내어 테이블을 만들어두면
이것을 참조하여 새로운 작업을 할때 코드부여를 자동화시킬수 있을 것이다



아래 화일에 과거 손작업으로 일일이 대분류코드를 제품명을
식별해 가면서 입력하였던 내용을 [대분류코드테이블]을 만들어 본다
이것을 새로 작업하는 [원본]시트에 다음 화일에서 적용해보자

***[LOG-IN]***

STEP_24 ---------------------------------

과거정보를 통하여 [대분류코드]테이블을 만들었다
이제 새로 어떤 기초정보를 갖고(대분류코드가 없는)작업을 하기 위하여
[대분류코드]를 읽어서 기초테이블에 코드를 부여하는 작업을 하게 될 것이다
그것을 해 보도록 하자
STEP_23에서 만든 [대분류코드]태이블에 필요한 것을 좀더
편집을 해도 될 것이다
새로운 품목을 넣어보기도 하고 어떤 품목에 대하여서는
다른 대분류코드로 옮기기도 하고
이런 것이 사람이 해야 할 일 일 것이다
사람이 해야 할일과 컴퓨터가 할일을 구분못하면 현대인이 아니다
그런데 아마도 컴퓨터에게 시킬 일을
꽤나 열심히 일을 한다고 앉아서 밥을 죽이고 있는 사람도
많이 있을 것이다

ERP에서 자료라고 넘겨 받은 테이블은 중간에 빈열도 있고
대분류코드라는 이름의 휠드도 없다
테이블의 빈열들도 없애고 코드도 부여하고 하여
다음작업을 위한 원본의 정리정돈작업도 같이 하도록 하자



액샐프로그래밍작업에 있어서 테이블에 접근하는 것은
기본중의 기본적인 작업이다
초보님들이 쉽게 생각했다가 곤욕을 치루는 것이기도 한 일이다
Worksheet.UsedRange
라고 하면 어떤 범위를 얻어 올까???
아쉽게도 UsedRange로 얻어낸 범위는 빈행이나 빈열을 많이
포함하는 경우가 많다
이전에 사용하였던 흔적이 있는 것도 현재 정보가 있는 것으로
인식하는 좀 바보스러운 속성이다
그렇다고 테이블의 시작되는 셀이 A1이라고 하여
Range("A1").CurrentRegion
이라는 속성으로 범위를 얻어 오면
중간에 빠진 열이 있거나 행이 있을때는 떨어진 이후의 정보에는
접근하지 못한다
그래서 실수 하지 않는 좋은 방법은 좀 귀찮지만
Worksheet.UsedRange
속성으로 테이블을 크게 하나 얻어내어
마지막 열과 마지막 행으로 부터 순환하면서
진정으로 정보가 있는 행이나 열까지 찾아내는 것이 옮은 방법이다
초보님들이 생각할때
뭘 이렇게 , 왜 이렇게 복잡하게 하지..!@#@
라고 의아해 하는 부분이 되는 것이다
까마귀가 백로의 뜻을 모르는 것이다

또한 테이블범위를 보면 숨겨진 행,숨겨진 열도 많다
이런 것도 활짝 열어 놓고 작업후 정리하여야 할 것이다

외부변수를 사용할때
모듈시트를 수정하고 추가하고 하다보면
외부 매개변수가 빈값으로 초기화 된다는 점..
외부 매개변수사용을 할때 항상 검증을 하고 다음 작업을 하는
습관이 좋다

아래 화일에서 테이블원본의 청소작업을 하도록 하자

새로 이씨리즈를 보시는 분들은 마음이 급하여 절대로 중간에서
화일을 보시면 정신만 사납거니와
아무것도 얻지 못합니다
처음 이 문제를 제기할때의 컨셉을 우선 공유하신후 차근차근
보셔야 자신의 것이 됩니다
워크샵의 각각의 시리즈들, 모두 마찬가지 입니다
하나의 시리즈를 적극적으로 자신의 것으로 만들면
나머지 시리즈들은 점점 쉬워집니다
그러면서 프로그래밍언어가 자연스러워 집니다

***[LOG-IN]***

STEP_25 ---------------------------------

정보작업을 할때 아래와 같은 컨셉을 갖는 것이 좋다



다양하게 널려 있는 불규칙한 정보에서 댐박에 결과물을 갖여 오는 것보다는
다양한 결과물을 의식한 논리를 구성하여
중간 집계 표준화된 테이블등을 먼저 구성하는 것이
전체가 구조적으로 안정된 모습을 유지하게 된다
실은 그것이 체계적 정보구조를 유지하는 DB가 되겠지만
일반적인 변화무쌍한 업무에서 그렇게 체계적이지 못하다
표준화된 DB스러운 테이블을 만드는 습관이 좋을 것이다
그런이유에서 엑셀의 현장적응력과 유연함이 꽃을 피우게 되는 것이다

프로시져가 여러개 매크로 상자에 나타나게하는 것 보다는
버튼에 연결되어야 하는 프로시져 하나만 나타나게 하는 것이 좋다



그렇지 않으면 사용자가 쓸데 없이 이런 저런 프로시져를
실행해 보게 된다면 예상치 못한일이 발생할수 있을 것이다

대분류코드에 해당 하는 품목문자열정보에서
원본의 품목을 찾아서 있으면 해당 대분류코드를 부여하는 작업인데
이때 ..범위의 Find메소드를 사용할 것인가
아니면 콤마로 구분된 문자열을 배열화하여 이것을 순환하면서
찾아낼 것인가..다양한 방법이 생각날 것이지만
항상 문자열로 처리하는 것을 우선 생각하는 것이
가장 빠르고 가장 안정적이다

***[LOG-IN]***