본문 바로가기

진리는어디에/VBA

[VBA] 디버깅(Debugging)

프로그램을 개발하다 보면 언제나 생각 처럼 동작해주지 않습니다. 왜 프로그램이 내가 원하는대로 동작하지 않는지 알아 보기 위해서는 디버깅이 필수적이지요. VBA를 이용해 아무리 간단한 매크로를 만들 때도 디버깅에 관해서는 예외가 없습니다. 이번 포스트는 VBA 디버깅에 관한 이야기를 해보도록 하겠습니다.

Debug.Print

전통적으로 가장 접근하기 쉬운 디버깅 방법은 내가 원하는 내용을 출력해보는 것입니다. VBA에서도 내가 궁금한 내용을 출력 해볼 수 있는 Debug.Print 라는 간단한 방법을 제공하고 있습니다.

아래는 워크북 개체의 프로퍼티들을 출력하는 간단한 샘플 코드입니다. 아래의 예제를 위해 'Example.xlsm' 이라는 엑셀 문서가 미리 만들어져 있다고 가정하겠습니다.

Public Sub PrintWorkbookProperties()

    ' 열려있는 워크북 개수 출력
    Debug.Print Workbooks.Count

    ' Example.xlsm 워크북의 전체 경로 출력
    Debug.Print Workbooks("Example.xlsm").FullName

    ' Example.xlsm 워크북의 워크시트 개수 출력
    Debug.Print Workbooks("Example.xlsm").Worksheets.Count

    ' Example.xlsm 워크북의 현재 활성화된 워크시트 이름을 출력
    Debug.Print Workbooks("Example.xlsm").ActiveSheet.Name

End Sub

Debug.Print로 출력되는 내용들은 '직접 실행 창'에 출력 됩니다. Ctrl + G를 이용하거나 메뉴 '보기 > 직접 실행 창'을 선택하면 프로젝트 에디터에 '직접 실행' 창이 추가 됩니다.

브레이크 포인트

전통적인 Debug.Print 방법이 접근은 쉽긴하지만 매번 보고 싶은 값이 있을 때 마다 코드를 수정 해주어야만 합니다. 그리고 특정 시점의 상태를 보고 싶지만 프린팅 방법은 처음 부터 끝까지 모든 내용을 출력해버리기 때문에 내가 원하는 시점의 상태를 찾기 힘듭니다. 이 때 유용하게 사용할 수 있는 도구가 '브레이크 포인트' 입니다.

  • 브레이크 포인트를 상태를 알기 원하는 코드 위치에 지정하면, 해당 포인트에 다달았을때 프로그램이 일시적으로 중단 됩니다.

멈추고 싶은 코드 라인에서 F9를 누르거나 빨간 박스로 표시된 부분을 클릭하면 브레이크 포인트가 설정 됩니다.

원하는 라인에서 F9를 누르거나 빨간 박스 영역을 클릭하면 좌측 처럼 빨간 점이 생성 된다.

브레이크 포인트가 설정 된 상태에서 프로시져를 실행하게 되면 해당 라인에서 진행을 멈추게 됩니다. 이때 내가 확인 하고 싶은 값을 가지고 있는 코드에 마우스를 올려 놓으면 값을 보여 줍니다. 아래 예에서는 FullName의 값을 확인하고 있습니다.

하지만 매번 값을 확인하기 위해 마우스를 드래그하는 것도 귀찮은 일입니다. 그래서 일반적으로 디버깅 할 때는 아래 메뉴의 빨간 박스로 표시된 '지역 창', '조사식 창'을 활성화 하여 해당 값들을 확인 합니다.

  • 지역 창 : 현재 위치에서 확인 가능한 모든 값들을 보여 준다.

  • 조사식 창 : 현재 위치에서 확인 가능하고 내가 지정한 값들만 보여 준다. 아래 예제에서는 Workbooks("Example.xlsm").FullName 코드를 드래그하여 조사식 창에 붙여 넣어 FullName 프로퍼티 안에 있는 값을 확인하고 있다.

디버깅 메뉴

브레이크 포인트에서 코드가 중단되고 다시 진행하기 위해서는 어떻게 해야 할까요? 바로 다음 줄로 진행하기 위해서는? 디버깅을 처음부터 다시 진행하기 위해서는? 

메뉴 바에 기본으로 디버깅 관련 단축 메뉴들이 있습니다. 위 단추 중 가장 자주 쓰이는 것은 삼각형 플레이 버튼입니다. 저 버튼을 누르면 디버깅이 시작됩니다만...익숙해 지시면 저 버튼을 매번 마우스로 클릭하는 것 보다 F5 단축키를 자주 사용 하게 될 것입니다.

  • 한 단계씩 코드 실행(F8) : 코드를 한줄 씩 실행합니다.
  • 프로시저 단위 실행(Shift + F8) : 프로시저 단위로 프로그램을 실행 합니다.
  • 프로시저 나가기(Ctrl + Shift + F8) : 프로시저를 끝까지 한번에 실행 해버리고, 프로그시져를 호출했던 부분으로 돌아갑니다.
  • 커서까지 실행(Ctrl + F8) : 현재 입력 커서가 있는 라인까지 프로그램을 실행 합니다.(마우스 커서가 아니에요)

NOTE - 디버깅 시 단축키를 쓰느냐 그렇지 안냐에 따라 생산성에 엄청난 차이가 있습니다. 디버깅 할 일이 자주 있으시다면 꼭 단축키를 외워서 사용합시다. 매번 메뉴 열고 클릭하고 그러면 시간 엄청 많이 잡아 먹습니다.

부록 1. 같이 보면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!