Exceller Home > VBA 강좌 > VBA 입문강좌

Exceller's VBA 입문강좌

- 최초 작성일 : 2008-06-18
- 최종 수정일 : 2008-06-18
- 강좌 읽음수 : 21,931회
- 자료 작성자 :


- 강좌 제목 : 버그를 줄이는 5가지 방법 및 엑셀의 디버깅 툴

그냥 한번 읽고 지나치기는 아까운 책을 한권 읽었습니다. 아프가니스탄 출신의 미국 이민자인 할레드 호세이니가 쓴 <천 개의 찬란한 태양>이 바로 그것입니다.

탈레반, 차량 폭탄 테러, 바미안 석불 파괴, 차도르... 등 긍정적인 것보다 그렇지 않은 것이 먼저 떠오르는 아프가니스탄. 여자에 대한 편견이 가장 심한 그곳에서 첩의 자식으로 태어난 마리암은 자라고, 버림받고, 결혼하고, 또다시 버림받는 존재가 됩니다. 평생을 소외된 삶을 살다가 마지막에 또 다른 첩(라일라)의 자식을 위해 목숨을 던짐으로써 처음이자 마지막으로 자신의 존재감을 깨닫게 된다는 줄거리입니다.

'천 개의 찬란한 태양'은 카불의 아름다움을 노래한 17세기 페르시아 시인 사이브에타브리지의 시 "카불"에서 따온 것이라고 합니다.

...지붕 위에서 희미하게 반짝이는 달들을 셀 수도 없고 / 벽 뒤에 숨은 천 개의 찬란한 태양들을 셀 수도 없으리...

'천 개의 찬란한 태양'이 의미하는 것이 정확히 무엇인지는 모르겠지만 아마도 "모성"을 상징한 것이 아닌가 짐작해 봅니다. "감동적인 소설의 경우, 토를 달면 달수록 그것에서 느껴지는 감동을 제대로 전달하기는커녕, 오히려 독서를 방해하기도 한다."고 하므로 더 이상의 설명은 달지 않겠습니다(실은 그럴 능력도 없답니다. ^^;;). 여러분도 기회가 되면 꼭 한번 읽어보시기 바랍니다.


예제 파일 내려받기


'버그'란 '코드가 프로그래머의 의도대로 작동하지 않는 경우'를 말하며, 여기에는 논리적 오류(Logical errors)까지 포함된다고 지난 시간에 설명드렸습니다. 버그를 줄일 수 있는 Exceller만의 노하우를 전격(!) 공개합니다.

버그를 없애는(혹은 줄이는) 다섯 가지 방법

1. 'Option Explicit'문을 사용합니다.
VB Editor의 '도구-옵션' 메뉴를 선택합니다. '편집기' 탭에서 '자동 변수 선언' 항목에 체크 표시를 해 두면 모듈 시트를 삽입할 때마다 맨 위에 'Option Explicit'이라는 문장이 자동 삽입됩니다. 이제부터는 모든 변수를 사용할 때 미리 선언(Dim)을 하고 사용해야 하므로 불편하다고 생각할 수 있지만 변수 이름과 관련된 입력 오류를 상당부분 줄일 수 있습니다.

2. 주석(Comments)을 가급적 많이 사용합니다.
프로그래밍 세계에서는 '6개월만 지나면 자기 자신도 남'이라는 말이 있습니다. 코딩 시에는 조금 귀찮을 수 있지만 주석을 충실히 달아 놓으면 나중에 다시 살펴볼 일이 있을 때 큰 도움을 받을 수 있습니다.

3. 도움말과 매크로 기록기를 항상 활용합니다.
엑셀의 도움말은 문제가 발생하였을 때 가장 믿을만한 지원군 중 하나입니다. 뭔가를 하긴 해야겠는데 어떻게 해야할 지 생각나지 않는 경우, 매크로 기록기를 통해 생성된 코드를 살펴보고 프로퍼티, 메서드를 도움말에서 찾아보는 습관을 들이세요.

4. 들여쓰기(Indentation) 규칙을 적용합니다.
코딩 시 들여쓰기 규칙을 사용하면 가독성이 높아져서 전체적인 구조를 파악하기 쉬워집니다.

5. 엑셀의 디버깅 툴을 적극 사용합니다.
엑셀에는 여러 가지 종류의 디버깅 툴이 있습니다. 처음 사용할 때에는 귀찮고 복잡해 보일 수 있습니다만, 다소의 시간을 투자하여 이들 도구의 사용법을 잘 익혀 놓으면 실전에서 많은 도움이 됩니다.

이번 시간에는 이 중에서 5번째 부분에 대해 집중적으로 살펴보려 합니다. 엑셀에는 여러 가지 디버깅 툴이 있어서 이것을 잘만 활용하면 버그를 바로잡는데 많은 도움이 됩니다.

가장 흔한 오류 중 하나는, 변수에 프로그래머가 의도한 값이 지정되지 않는 것입니다. MsgBox 함수를 코드의 적당한 부분에 삽입하여 변수값을 살펴보면 이와 관련된 오류를 방지할 수 있습니다.

Sub MsgBoxFunction()
    Dim intOffset As Integer
    ......
    MsgBox intOffset
    ......
End Sub

이 프로시저를 실행하면 intOffset 변수값이 MsgBox에 표시됩니다. 물론 여기서의 메시지 박스는 임시로 삽입한 것이므로 디버깅 작업이 끝나면 제거해 주어야겠죠.

MsgBox 함수 대신 Debug.Print 구문을 이용할 수도 있습니다. 앞에서 MsgBox 함수를 입력한 부분에 다음과 같이 입력해 보세요.

Debug.Print 변수이름

MsgBox 함수를 삽입한 경우에는 프로시저가 중간에 중단되면서 사용자가 '확인'이나 '취소' 등의 버튼을 눌러주어야 하는 반면, Debug.Print문의 경우에는 직접 실행 창(Immediate window)에 지정한 변수값을 표시하고 다음 라인을 계속 수행합니다. 뿐만 아니라 2개 이상의 변수를 직접 실행 창에 나타낼 수도 있습니다.

Debug.Print intOffset, intX, intY

만약 '직접 실행 창'이 보이지 않으면 '보기-직접 실행 창' 메뉴를 선택하거나 <Ctrl+G> 키를 눌러보세요.

다음 코드를 실행하면 현재 워크북에 있는 시트의 이름들이 '직접 실행 창'에 표시됩니다.

Sub DebugPrint()
    Dim wrkBook As Workbook
    Dim shtSheet As Worksheet
    Dim i As Integer

    Set wrkBook = ActiveWorkbook

    For i = 1 To wrkBook.Sheets.Count
        Debug.Print Worksheets(i).Name
    Next i
End Sub

앞에서 설명드린 MsgBox 함수나 Debug.Print문은 디버깅 도구라기보다는 디버깅 팁이라고 할 수 있습니다. 지금부터 본격적으로 엑셀의 디버깅 툴에 대해 살펴보도록 하죠.

한 단계씩 코드 실행

실행하고자 하는 프로시저 내부에 포인터를 가져다 놓은 다음 <F8> 키를 눌러 보세요. 누를 때마다 프로시저가 한 줄씩 실행됩니다. 변수가 있는 부분에 마우스 포인터를 올려놓으면 그 변수에 현재 할당(assign)되어 있는 값을 알 수 있으므로 아주 편리합니다.

위와 같은 상태를 '중단 모드(Break Mode)'라고 합니다. 이 상태를 벗어나려면 표준 도구 모음에서 '재실행()' 아이콘을 클릭하면 됩니다(이 상태를 '실행 모드(Run Mode)'라고 부릅니다).

커서까지 실행

말 그대로... 커서가 놓여져 있는 위치까지 한번에 실행합니다. 적당한 위치에서 마우스를 클릭하여 커서를 옮겨놓은 다음, <Ctrl+F8> 키를 누르거나 '디버그-커서까지 실행' 메뉴를 선택합니다.

중단점 설정/해제

중단점(Break Point)이란 프로시저가 실행되는 도중에 자동으로 실행을 중지하도록 사용자가 지정해 놓은 위치를 말합니다. 개념적으로는 Stop 문과 비슷한데 마우스 클릭만으로 설정할 수 있다는 것과 워크북을 저장한 다음 다시 열 경우, 중단점은 저장되지 않는다는 점에서 차이가 있습니다. 중단점을 설정하는 방법은 네 가지 정도가 있습니다. 중단점을 설정하려는 행을 선택한 다음,

  • 코드 왼쪽에 있는 여백 표시줄(gray margin)을 클릭한다.

  • <F9> 키를 누른다.

  • '디버그-중단점 설정/해제' 메뉴를 선택한다.

  • 마우스 오른쪽 버튼을 클릭하고 '설정/해제-중단점' 메뉴를 선택한다(이것은 토글 키로, 중단점이 이미 설정되어 있다면 해제합니다).

어느 방법이든 중단점을 설정하면 위의 그림과 같이 여백 표시줄에 커다란 동그라미가 생깁니다. 중단점은 여러 곳에 설정할 수 있으며 설정을 해제하려면 중단점을 클릭하면 됩니다. 설정된 중단점들을 한꺼번에 모두 제거하려면 <Ctrl+Shift+F9> 키를 사용합니다.

'지역' 창 활용

앞에서 '한 단계씩 코드 실행'할 때 <F8> 키를 사용한다고 설명드렸지요? '보기-지역 창' 메뉴를 선택하면 '지역' 창이 표시됩니다. 이 상태에서 <F8> 키를 계속 눌러보면 각 변수에 값들이 어떻게 변하는지 알 수 있습니다.

예전에 순환문이 잘 이해되지 않으면 종이를 한 장 꺼내놓고 몇 번 로직을 돌려보라고 조언해 드렸었지요? '지역' 창을 사용하면 프로시저 내의 모든 변수값이 자동으로 나타나므로 그런 고생을 하지 않아도 됩니다.

'조사식 창' 활용

'조사식 창(Watch Window)'을 이용하면 '직접 실행 창' 혹은 다른 방법을 통해 변수값을 일일이 확인할 필요 없이 변화되는 내용을 살펴볼 수 있습니다.

VB Editor 상태에서 '디버그-조사식 추가' 메뉴를 선택하고 다음과 같이 지정합니다. 변수 j의 값이 5를 넘어가면 프로시저를 일시적으로 중지하라는 의미입니다.

'보기-조사식 창' 메뉴를 선택하여 '조사식' 창이 나타나도록 한 다음 WatchWindow 프로시저를 실행합니다. 변수 j의 값이 5를 넘어가는 순간 프로시저는 실행을 멈추게 되는데, 이 중단 모드에서 마우스 포인터를 변수가 있는 곳으로 가져가면 그때까지 변수들에 할당된 값을 보여줍니다.

이번 강좌는 실무와 직접 도움되는 예제가 적어서 별로 도움이 안된다고 생각하는 분이 계실지도 모르겠습니다. 바쁘다고 무딘 날로 계속 톱질을 하는 것만큼 어리석은 일이 또 있을까요. 당장은 시간이 좀 걸리더라도 잠시 걸음을 멈추고 날을 벼르는 시간이 반드시 필요합니다.

디버깅 툴을 익히는데 투입하는 시간은 바로 무딘 칼날을 날카롭게 하기 위한 시간이며, 언젠가 열 배·스무 배의 효과로 나타날 것임을 믿어 의심치 않습니다. Trust me~~


Previous

Next

Copyright ⓒ 2008 아이엑셀러 닷컴. All rights reserved.