컴활1급 실기 ‘엑셀 프로시저’가 도대체 뭐지? (2)
1. 저번 강좌 요약
저번 포스트에서 엑셀 프로시저에 대해 대강 배웠다. 엑셀 프로시저란 다음과 같다. 엑셀에 VBA라는 프로그래밍 언어가 연동되어 있는데, 이를 통해 짠 프로그램이 바로 엑셀 프로시저다. 엑셀 프로시저를 코딩하려면 Alt+F11키를 눌러서 VBA화면으로 들어가면 된다.
1번 문제는 버튼을 클릭하면 폼이 열리게 만들면 되는거였다. (1)VBA화면에서 (2)해당 시트를 더블클릭->코딩창이 뜬다 (3)좌측박스(개체)를 cmd버튼으로 (4)우측박스(행위)를 click으로 바꾼후 (5)해당 Sub안에 ‘폼이름.show’ 라고 코딩하면 되었다.
2. 문제 2번 풀고 어떻게 공부할지 생각하기
② 폼이 초기화(Initialize)되면 [C4:C20] 영역의 값이 콤보상자(cmb차종)의 목록에 나타나도록 설정하시오
문제에 힌트가 들어있다. 폼의 초기화(Initialize)라는 거다.
즉, (1)VBA화면에서 (2)차종검색화면 폼을 더블클릭 (3)좌측박스 UserForm (4)우측박스 Intialize 로 선택하면 된다. 그럼 아래와 같이 Sub가 하나 생긴다. Sub라는 건 실행의 한 단위를 뜻한다.
|
Private Sub UserForm_Initialize()
End Sub |
Private Sub와 End Sub 사이에 내용을 집어넣으면, UserForm(폼)이 초기화(Initialize)될 때
폼의 초기화란 폼이 열릴 때, 와 비슷한 말이다.
그리고 폼의 콤보박스를 눌러보자. 콤보박스란 화살표를 누르면 리스트가 쭉 떠서 고를 수 있게 되는 컨트롤을 말한다. 찾아서 클릭했는가? 그럼 속성창(좌측 하단)에 이름이 ‘Cmb차종’이라고 쓰인 걸 볼 수 있다. 이 콤보박스의 목록을 C4:C20 영역으로 설정해주면 된다는거다.
그 명령어는
Cmb차종.RowSource = “c4:c20”
이다.
즉,
|
Private Sub UserForm_Initialize() Cmb차종.RowSource = “c4:c20” End Sub |
으로 써넣으면 2번 문제가 풀린다.
그럼 이와 똑같은 문제가 나오면 좋겠지만, 다른 문제가 나오면 어떡하냐고? 이걸 다 외워야하냐고?
다 외우면 좋겠지만, 실은 그냥 하다보면 알게 된다.
다른 문제가 나와도 대충 풀 수 있다.
한 번 코딩창에서 Cmb차종. 까지 써보고 멈춰보라.
보다시피 명령어를 안 외워도 선택할 수 있게 만들어져 있다.
그렇기에 본인은 콤보박스에 딸린 명령어들을 모르지만 얼마든 코딩할 수 있다.
우선 앞에 아이콘 모양을 보자.
초록색 상자 아이콘과 회색 손이 문서를 잡은 아이콘이 있다. 이를 초록 아이콘, 회색 아이콘이라고 부르자. 초록색은 명령이고, 회색은 속성이다.
|
(1) 초록 아이콘 : 명령
Additem의 초록 아이콘이 보이는가? additem이라는 명령이다. 초록색 아이콘은 오른쪽에 “블라블라” 를 써서 코딩하면 된다. 다시 말해서 초록 아이콘들은 cmb차종.xxx “블라블라” 식으로 써야한다. 또는 cmb차종.xxx “블라블라”, “블라블라” 또는 cmb차종.xxx “블라블라”, “블라블라”, “블라블라” … 등등.
additem이 뭔지 유추해볼까? 그건 말 그대로 아이템을 추가하는 명령일 가능성이 높다. 아마 콤보박스 리스트에 아이템 1개를 추가할 때 쓰는거지. 한번 additme까지 쳐보고 스페이스바를 한 번 눌러봐라. 놀랍게도 그다음에 뭘 써야하는지 알려준다. 이렇게 명령어 속에서 써야하는걸 인자라고 한다. 인자가 2개인 명령이고, 지금 보고 있듯이 VB가 자동으로 알려준다. []로 묶여있는 부분은 써도 그만 안 써도 그만이란거다. 특이하게 인자 2개가 다 []로 묶여있네.
첫번째 인자 [pvargitem]은 뭘까? pvarg가 뭔진 모르지만 그냥 item이름을 쓰면 되는거같다. “새로운 아이템”이라고 써보자. [pvargindex]는 뭘까? VB에서 index란 보통 숫자(순서)를 말한다. 아마 5를 쓰면 6번째 칸에 들어가지 않을까. []가 있으니 생략해도 무방하다.
cmb차종.additem 이라고만 쓰면 빈 칸이 하나 추가될거다. cmb차종.additem “새로운 아이템” 이라고 쓰면 새로운 아이템이라는 칸이 하나 추가될거다. cmb차종.additem “새로운 아이템”, 5 이라고 쓰면 6번째에 추가되겠지. (프로그래밍의 모든 숫자 시작은 0 이기 때문이다. 0,1,2,3,4,5)
직접 실행해본 건 아니지만 틀림없이 이럴 것이다. 볼 것도 없다.
다시 한 번 Cmb차종. 까지만 입력하고 리스트업이 뜨면 초록 아이콘을 좀 더 찾아보자. clear, cut, copy.. 이런건 (1)비우고, (2)잘라내고 (3)복사하기 정도가 될거다. 유추할 수 있음을 여실히 알 수 있다.
회색 손이 문서를 집고 있는 아이콘이 보이는가? 이런 것들은 컨트롤의 속성이다. (1)컨트롤을 클릭하고 (2)좌측 하단의 속성창에서 얼마든 수정할 수 있는 것들이다. |
|
(2) 회색 아이콘 : 속성
속성은 명령어가 아니라서 인자가 없다. 그냥 그 자체로 쓰인다. 예를 들어 msgbox cmb차종.backcolor 이렇게 쓰면 그냥 백칼라가 뭔지 메시지로 뜬다. 굳이 인자 없어도 동작한단 얘기다.
다만 오른쪽에 “= 블라블라”를 써넣어서 수정할 수 있다. cmb차종.backcolor = “블라블라” 이렇게 쓰면 된다. backcolor니까 블라블라에는 색상이 들어가겠지?
예컨대 autosize, 이런건 안 봐도 글자 수에 따라 사이즈 조절을 해줄거다. 개체명.autosize=true로 쓰면 되겠지. backcolor는 배경색깔, bordercolor는 테두리색깔… 얼마든 유추할 수 있으며 많이 쓰이는 건 금방 기억하게 된다.
다만 우리가 배운 rowsource는 속성이니까 회색 아이콘일거다. rowsource가 왜 속성이냐고? 콤보박스의 기본 모양이 비어있는 건 이상하잖아. 색상, 테두리, 글자 같은 건 기본 모양에 해당하기 때문에 속성인거다. 그게 없으면 화면에 가시적으로 표시가 안되잖아. 콤보박스의 기본 로우 데이터들은 당연히 속성에 미리 입력할 수 있을거다. 지금 당장 (1)콤보박스를 클릭하고 (2)속성창에서 (3)rowsource를 찾아 거기에 아이템1, 아이템2, 아이템3 식으로 입력할 수 있다. 하지만 문제에서 요구하는데 폼이 초기화됐을 때니까
Private Sub UserForm_Initialize() Cmb차종.RowSource = “c4:c20” End Sub
이렇게 넣는 것뿐이다. 원래 속성칸에서 수정가능하다. |
근데 그럼 회색과 초록을 구분해서 외워야하나요? 아니. 전~혀. 그냥 자연히 알게 될 뿐더러 굳이 구분할 필요없다. 편하게 가도 된다.
그냥 개체에 대한 이해만 있으면 된다. 볼까? Combo박스는 아마 이런식으로 될거다.
처음에 속성으로 테두리, 색상, 글자크기, 로우 데이터 정도를 정해두고, 나중에 개체명.additem이나 개체명.removeitem으로 리스트를 추가하거나 제거하면서 쓰면 되는거다.
Text박스는 어떨까.
역시 속성으로 테두리, 색상, 글자크기, 기본 글자(디폴트값)가 있을거고 나중에 개체명.xxxx 로 속성을 바꾸거나 명령을 할 수 있을거다. 속성이랑 명령은 역시 점찍거나 스페이스바 눌러서 리스트가 나오면 그 중에 적당히 선택하면 된다.
그러니까 어떤 속성이나 명령이 있을지 대충 모양에 따라서 각이 나오지 않나. 대충 어떤게 있을지를 아니까 적당히 골라쓸 수 있는거다. 유가릿?
3. 문제3번 풀고 어떻게 공부할지 생각하기
③ <차종검색화면> 폼의 차종(cmb차종) 콤보상자에서 검색할 차종을 선택하고 <검색> 버튼(cmb검색)을 클릭하면 워크시트의 [표1]에서 해당 데이터를 찾아 폼의 대여코드(text코드), 차종(text차종), 연료(text연료), 연비(text연비), 출시년도(text출시년도), 1일대여료(text대여료)컨트롤에 표시되도록 프로시저를 작성하시오.(ListIndex 사용).
길어서 어려워보이는데 별 것도 아니다.
콤보상자에서 차종을 선택해서 검색을 누른다. 그러면 엑셀의 데이터가 폼에 옮겨진다는 얘기다. ListIndex를 사용하라고 했으니 안 쓰면 감점이다.
리스트인덱스라니, 아무리 봐도 콤보박스에 밖에 쓸데가 없다. 커맨드버튼이나 텍스트가 무슨 리스트가 있겠어?
그러니까 Cmb차종.ListIndex 로 쓰면 된다.
만약 당신이 첫번째 칸을 고르고 있다면 Cmb차종.ListIndex 는 0의 값을 가지고, 두번째 칸을 고르고 있다면 1의 값을 가질거다.
msgbox cmb차종.listindex 로 시험해봐라. 지금 몇 번째 칸을 고르고 있는지 나올거다.
혹은 cmb차종.listindex = cmb차종.listindex + 1 뭐 이딴식으로 쓰면 다음칸이 골라지겠지 뭐. 속성을 바꾸는거니까 말이다.
(참고로 귀찮아서 시험 안해본 관계로 안될 수도 있다는 점 유의바람. 하지만 리스트 어딘가에 당신이 생각하는 기능이 다 있다)
그럼 이제 코딩을 해볼까.
폼의 화면은 아래와 같다.
각 컨트롤들의 이름을 알아보자. (1)폼에서 각 컨트롤을 클릭하고 (2)속성창을 보면 된다. 이름은 보통 알기 쉽게 되어 있다.
여기서 차종, 검색결과 같은건 레이블(label)이라고 하는데 여기까지 이름 알 필요는 보통 없다.
내용은 이렇게 쓰면 된다.
Private Sub Cmd검색_Click()
참조행 = Cmb차종.ListIndex + 4
Text코드 = Cells(참조행, 2)
Text차종 = Cells(참조행, 3)
Text연료 = Cells(참조행, 4)
Text연비 = Cells(참조행, 5)
Text출시년도 = Cells(참조행, 6)
Text대여료 = Cells(참조행, 7)
End Sub
코딩창에서 좌측상자는 cmd검색, 우측상자는 click으로 하면 “cmd검색이라는 컨트롤을 클릭했을 경우”라는 조건이 된다. 그게 “Private Sub Cmd검색_Click()”과 같은 말이지 뭐.
그래서 각 텍스트박스에 셀값을 넣어보자. 간단하다. 텍스트개체명.text = cells(x값, y값) 이렇게 쓰면 된다. 그냥 텍스트개체명 = cells(x값, y값) 으로 써도 된다.
시트 그림을 다시 보여주겠다. 이제 코딩 내용이 이해가 될 것이다.
예컨대 당신이 모닝을 고르면, Listindex는 0이다. 그 경우 셀 (4,2) (4,3) (4,4) (4,5) (4,6) (4,7)을 폼에 옮겨와야 한다.
당신이 소나타를 고르면 Listindex는 1이다. 그 경우 셀 (5,2) (5,3) (5,4) (5,5) (5,6) (5,7)을 폼에 옮겨와야 한다.
그러니 뭐… Listindex가 n이면 (n+4,2) (n+4,3) … (n+4,7)이 될게 자명하다.
그러니 n+4를 변수에 넣는다. 다시 말해 Listindex + 4를 변수에 넣는거다.
그리고서 시트상의 셀 (해당변수,2) (해당변수,3) … (해당변수,7)을 폼에 옮겨오면 된다. 그렇다면 변수란 무엇인가? 변수란 어떤 내용을 저장하는 그릇같은거다. 다만 항상 변할 수 있기에 변수라고 한다.
이 쪽에 가면 내가 쓴 변수강좌가 있다. http://blog.naver.com/bb_/70168830526
4. 마치며..
엑셀 프로시저는 프로그램을 짜는거고, 몇 번 해보다 보면 별로 어렵지 않다. 원리를 기억하고 있으면 위기 상황에서도 차근히 방법을 고민할 수 있다. 게다가 문제에 힌트들이 있으니 놓치지 말 것.
참고로 컴활1급 실기는 컴퓨터로 채점하기 때문에, 결과만 나온다고 해서 점수가 나오는 게 아니다. 깔끔하게 코딩하는 습관을 들이도록 하자.