버그를 줄이는 노하우
'버그'란 '코드가 프로그래머의 의도대로 작동하지 않는 경우'를 말하며, 여기에는 논리적 오류(Logical errors)까지 포함된다고 지난 시간에 설명드렸습니다. 버그를 줄일 수 있는 Exceller만의 노하우를 전격(!) 공개합니다.
버그를 없애는(혹은 줄이는) 다섯 가지 방법
VB Editor의 [도구] -[옵션] 메뉴를 선택합니다. [편집기] 탭에서 [자동 변수 선언] 항목에 체크 표시를 해 두면 모듈을 삽입할 때마다 맨 위에 'Option Explicit'이라는 문장이 자동 삽입됩니다. 이제부터는 모든 변수를 사용할 때 미리 선언(Dim)을 하고 사용해야 합니다. 이렇게 하는 것이 처음에는 불편하다고 생각할 수 있지만 변수 이름과 관련된 입력 오류를 상당 부분 줄일 수 있습니다.
프로그래밍 세계에서는 '6개월만 지나면 자기 자신도 남'이라는 말이 있습니다. 코딩 시에는 조금 귀찮을 수 있지만 주석을 충실히 달아 놓으면 나중에 다시 살펴볼 일이 있을 때 큰 도움을 받을 수 있습니다.
엑셀의 도움말은 문제가 발생했을 때 가장 믿을 만한 지원군 중 하나입니다. 뭔가를 하긴 해야겠는데 어떻게 해야할 지 생각나지 않는다면 매크로 기록기를 통해 생성된 코드를 살펴보고 프로퍼티, 메서드를 도움말에서 찾아보는 습관을 들이세요.
코딩 시 들여쓰기 규칙을 사용하면 가독성이 높아져서 전체적인 구조를 파악하기 쉬워집니다.
엑셀에는 여러 가지 종류의 디버깅 툴이 있습니다. 처음 사용할 때에는 귀찮고 복잡해 보일 수 있습니다만, 다소의 시간을 투자하여 이들 도구의 사용법을 잘 익혀 놓으면 실전에서 많은 도움이 됩니다.
이번 시간에는 이 중에서 5번째 부분에 대해 집중적으로 살펴보려 합니다. 엑셀에는 여러 가지 디버깅 툴이 있어서 이것을 잘만 활용하면 버그를 바로잡는데 많은 도움이 됩니다.
디버깅 도구 1 ㅡ MsgBox, Debug.Print
가장 흔한 오류 중 하나는 변수에 프로그래머가 의도한 값이 지정되지 않는 것입니다. MsgBox 함수를 코드의 적당한 부분에 삽입하여 변수값을 살펴보면 이와 관련된 오류를 방지할 수 있습니다.
Sub MsgBoxFunction()
Dim iOffset As Integer
...............
MsgBox iOffset
...............
End Sub
이 프로시저를 실행하면 intOffset 변수값이 MsgBox에 표시됩니다. 물론 여기서의 메시지 박스는 임시로 삽입한 것이므로 디버깅 작업이 끝나면 제거해야겠죠?
MsgBox 함수 대신 Debug.Print 구문을 이용할 수도 있습니다. 앞에서 MsgBox 함수를 입력한 부분에 다음과 같이 입력해 보세요.
Debug.Print 변수이름
만약 '직접 실행 창'이 보이지 않으면 [보기] - [직접 실행 창] 메뉴를 선택하거나 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
CODE
MsgBox 함수나 Debug.Print문은 디버깅 도구라기보다는 디버깅 팁이라고 할 수 있습니다. 지금부터 본격적으로 엑셀의 디버깅 툴에 대해 살펴보겠습니다.
디버깅 도구 2 ㅡ 한 단계씩 코드 실행
실행하고자 하는 프로시저 내부에 포인터를 가져다 놓은 다음 F8 키를 눌러 보세요. 누를 때마다 프로시저가 한 줄씩 실행됩니다. 변수가 있는 부분에 마우스 포인터를 올려놓으면 그 변수에 현재 할당(assign)되어 있는 값을 알 수 있으므로 아주 편리합니다.
위와 같은 상태를 '중단 모드' Break Mode라고 합니다. 이 상태를 벗어나려면 표준 도구 모음에서 [재실행] 아이콘을 클릭하면 됩니다. 이 상태를 '실행 모드' Run Mode라고 부릅니다.
디버깅 도구 3 ㅡ 커서까지 실행
말 그대로 커서가 놓여져 있는 위치까지만 한 번에 실행합니다. 적당한 위치에서 마우스를 클릭하여 커서를 옮겨놓은 다음, Ctrl + F8 키를 누르거나 [디버그] - [커서까지 실행] 메뉴를 선택합니다.
디버깅 도구 4 ㅡ 중단점 설정
중단점 Break Point이란 프로시저가 실행되는 도중에 실행을 중지하도록 사용자가 지정해 놓은 위치를 말합니다. 개념적으로는 Stop 문과 비슷한데 마우스 클릭만으로 설정할 수 있다는 것과 워크북을 저장한 다음 다시 열 경우, 중단점은 저장되지 않는다는 점에서 차이가 있습니다. 중단점을 설정하는 방법은 네 가지 정도가 있습니다. 중단점을 설정하려는 행을 선택한 다음, 아래 방법 중 하나를 선택합니다.
- 코드 왼쪽에 있는 여백 표시줄 gray margin을 클릭한다.
- F9 키를 누른다.
- [디버그] - [중단점 설정/해제] 메뉴를 선택한다.
- 마우스 오른쪽 버튼을 클릭하고 [설정/해제-중단점] 메뉴를 선택한다(이것은 토글 키로, 중단점이 이미 설정되어 있다면 해제합니다).
어느 방법이든 중단점을 설정하면 위의 그림과 같이 여백 표시줄에 커다란 동그라미가 생깁니다. 중단점은 여러 곳에 설정할 수 있으며 설정을 해제하려면 중단점을 다시 한 번 클릭하면 됩니다. 설정된 중단점들을 한꺼번에 모두 제거하려면 Ctrl + Shift + F9 키를 사용합니다.
디버깅 도구 5 ㅡ 지역 창 활용
앞에서 '한 단계씩 코드 실행'할 때 F8 키를 사용한다고 했습니다. [보기] - [지역 창] 메뉴를 선택하면 지역 창이 표시됩니다. 이 상태에서 F8 키를 계속 눌러보면 각 변수에 값들이 어떻게 변하는지 알 수 있습니다.
순환문이 잘 이해되지 않으면 종이를 한 장 꺼내놓고 몇 번 로직을 돌려보라고 조언해 드린 적이 있지요? 지역 창을 사용하면 프로시저 내의 모든 변수값이 자동으로 나타나므로 그런 고생을 덜 수 있습니다.
디버깅 도구 6 ㅡ 조사식 창 활용
조사식 창 Watch Window을 이용하면 '직접 실행 창' 혹은 다른 방법을 통해 변수값을 일일이 확인할 필요 없이 변화되는 내용을 살펴볼 수 있습니다.
VB Editor에서 [디버그] - [조사식 추가] 메뉴를 선택하고 다음과 같이 지정합니다. 변수 j의 값이 5를 넘어가면 프로시저를 일시적으로 중지하라는 의미입니다.
[보기] - [조사식 창] 메뉴를 선택하여 조사식 창이 나타나도록 한 다음, WatchWindow 프로시저를 실행합니다. 변수 j의 값이 5를 넘어가는 순간 프로시저는 실행을 멈추게 되는데, 이 중단 모드에서 마우스 포인터를 변수가 있는 곳으로 가져가면 그때까지 변수들에 할당된 값을 보여줍니다.
이번 강의는 실무에 직접 도움되는 예제가 적어서 실망하는 분이 계실까요? 바쁘다고 무딘 날로 계속 톱질을 하는 것은 현명하지 않습니다. 당장은 시간이 좀 걸리더라도 잠시 걸음을 멈추고 날을 세우는 시간이 반드시 필요합니다.
디버깅 툴을 익히는데 투입하는 시간은 바로 무딘 칼날을 날카롭게 하기 위한 투자이며, 머지 않아 열 배 스무 배의 효과로 나타날 것임을 믿어 의심치 않습니다. Trust me~~