Excel – VBA : 가계부 만들기1
안녕하세요 채랑이 아빠 프리아입니다. 오늘은 엑셀을 사용해서 가계부를 만들어 볼겁니다.그냥 엑셀을 사용해서 만드는 거라면 누구라도 만들수 있겠죠 ^^저희는 VBA가 추가된 가계부를 만들겁니다. VBA를 사용할 경우 간단하게는 자동으로 수식을 넣게 만들 수 도 있구요,가계부 입력할 내용을 팝업으로 띄워서 입력하게 만들수도 있습니다.두가지 모두 VBA를 사용하는 방법이라고 할 수 있습니다. 먼저 VBA를 사용하여 자동으로 수식을 넣는 방법을 알려드리겠습니다. 우선, 가계부 틀을 잡아야겠죠.틀은 다음과 같이 잡아보도록 하겠습니다. 심플하죠? 일반적으로 많이 볼 수 있는 형태로 잡았어요.자 이중에서 자동 수식을 걸 수 있을 만한 곳은 총 2곳입니다.No.와 잔액입니다.나머지는 다 입력해야지만 되는 항목들이죠. VBA를 걸 내용은 다음과 같습니다. – 일자, 입금, 출금, 비고 중에 값이 입력되면 수식을 자동 입력한다. 일단 우리가 알아야 하는 데이터는 2가지입니다.셀을 이동했을 때, 이전의 셀의 Row값과 Column값이죠. 일단 이전 셀의 Row값과 Column값을 입력할 전역 변수를 지정할 것입니다. 일단 Alt+F11을 눌러서 VBA 창을 띄우세요. 이렇게 보이면서 Sheet1이 선택되어 진것이 보입니다. 옆에 칸에다가 다음과 같이 입력합니다. Dim r, c As Integer Dim은 변수를 선언하는 구절입니다.변수의 이름은 r과 c이며, 타입은 정수입니다. r은 Rows의 약자이며, c는 Column의 약자입니다.이렇게 변수명은 자신이 알아보기 쉬운 것으로 하는 것이 좋습니다.다만, 너무 변수명을 디테일하게 잡으시면 에러가 발생할 수 있습니다.쉽게 말해 변수를 rows로 잡아버리면, VBA 명령어 중에 있는 Rows라는 명령어와 중첩이 되어버리기 때문에 구절 오류가 발생합니다.그래서 row_check나, r 등 단어+추가문구 또는 완전 약자의 형태로 잡으시는게 좋습니다.전 길게 쓰는게 싫어서 그냥 1글자로 퉁쳐요 ㅎㅎㅎㅎ. public나 private 문구 안이 아닌 밖에 Dim으로 선언한 변수의 경우 모든 하위 집단에서 사용할 수 있다는 장점이 있으며,하나의 명령어 집단이 완료되어도 해당 변수는 유지된다는 장점이 있습니다.(public나 private 구절안의 변수는 해당 명령어가 종료되면 변수가 사라짐)다만, 너무 많은 전역 변수를 사용할 경우 용량이 커지고 느려진다는 단점이 있습니다. 자, 이제 셀이 바뀌는 부분을 지정해 보겠습니다.명령어 입력창 위에 (일반)이라고 되어있는 부분의 선택창을 눌러서 Worksheet를 선택합니다.그러면 옆에 (선언)이라고 되어 있는 선택창이 자동으로 SelectionChange로 바뀌면서 밑에 Private 명령어 구문이 생기는 것을 볼 수 있습니다.(만약 (선언)이 그대로 있거나, 다른 명령어가 나온다면, SeletionChange를 선택해 주세요.) 위와 같은 창이 나온다면 일단 제대로 되고 있는 것입니다. 일단 셀이 바뀌면, 현재 셀을 어떻게 표현하는지 임시로 다음과 같이 문구 입력해서 테스트 해보시길 바랍니다. MsgBox “Rows : ” & Target.Row & ” / Columns : ” & Target.Column 입력하셨으며, 엑셀 시트로 가셔서 마우스로 여기저기 눌러 보시면 다음과 같은 창이 뜨는 것을 볼 수 있습니다. C5가 선택되었죠. 행은 5이며, 열은 C이니까 3입니다.정확하게 지금 선택한 셀의 값이 나오게 됩니다. 다만, 저희는 이전에 선택한 셀에 값이 바뀌었는지 확인해야 하므로, 이전 셀을 나타낼 수 있도록 변수를 이용해야 합니다.즉, 행과 열의 번호를 변수로 지정하여, 이전셀을 나타낼 것입니다.다음과 같이 입력하겠습니다. MsgBox “Privious – Rows : ” & r & ” / Columns : ” & c & Chr(13) & Chr(10) & “current – Rows : ” & Target.Row & ” / Columns : ” & Target.Column 중간에 chr(13) & chr(10)은 줄을 바꾸는 명령어 입니다.다음과 같이 된 것을 확인하셨으면, 또다시 엑셀을 이동해 보세요. 처음 이동시에는 이전 셀의 위치가 제대로 나오지 않습니다.당연히 값을 지정하지 않았으니까입니다. 하지만 2번째부터는 이전셀과 현재 셀을 정확하게 나타내는 것을 볼 수 있습니다.메세지창을 띄우고 r과 c의 값을 바꾸기 때문입니다. 즉 이전셀을 확인하기 위해서는 r과 c의 값을 지정하기 이전에 모든 명령어가 종료되어야 한다는 뜻입니다. 자 이제 필요한 내용을 채워보겠습니다.필요한 조건은 2가지입니다.첫번째는 이전 셀이 최상단의 제목이 아니어야 하며, 두번째는 A열과 E열이 아니어야 한다는 것입니다. 제목셀에 내용이 있다고, No.와 잔액에 다른 글자를 넣어버리면 큰일 나겠죠.그리고 A열과 E열은 수식이 들어가야 하는데 여기에 다른 값을 넣어도 안되겠죠.그런 것입니다. ㅎㅎㅎ 다음과 같이 내용 입력하겠습니다. 맨 위와 두번째 IF문은 첫번째 실행할 때, 행과 열값이 없으면 오류가 나기 때문에 기본값으로 1을 넣어 주었습니다.세번째의 IF문은 이전 셀의 행 값이 1보다 커야 하고, 열 값이 1(A열)과 5(E열)이 아니면서 이전 셀 값이 공백이 아닐 경우 실행하라는 내용입니다.즉, 1행이거나, A열이거나, E열이면 실행을 하지 않고, 또한 셀 값이 변경되지 않았으면 실행하지 않도록 설계한 것입니다.네번재 IF문은 r이 2일 경우인데요, 즉 이전 합계액이 없을 경우에는 입금값은 더하고 출급값은 빼고, 2이상일 경우 합계액에서 입금값은 더하고 출금값은 빼라는 명령어입니다. 이렇게 하면 간단한 가계부의 수식 자동 입력은 끝났습니다.테스트 해보도록 할께요. No.와 잔액에 자동으로 수식이 입력되었나요?생각보다 어렵진 않죠?일단 이 정도에서 중간 저장을 하겠습니다.여기서 주의할 점이 하나가 더 있습니다.바로…. 저장 파일형식을 매크로타입(.xlsm)으로 해야 된다는 것입니다. 매크로 사용 통합문서로 저장하지 않으면, 다음에 열때 매크로가 사라져 있는 기적을 보시게 될 것입니다. ㅎㅎㅎㅎ여기까지 작업한 파일은 아래와 같이 올려두었으니 참조하시기 바랍니다. 자 오늘은 여기까지 입니다.간단한 VBA인데도, 처음 설명하니까 시간이 길어지네요. 오늘도 좋은 하루 보내세요.