EXCEL - VBA

구구단 만들기(5) (엑셀 VBA 디버깅 1)

별동산 2022. 12. 14. 08:50
반응형

완성된 버전만 보니 프로그램이 에러가 발생하지 않은 듯 하지만 처음에는 2단 자리에 계속 9단까지 써지고, 9단까지뿐만 아니라 200단까지 확장하면서 변수가 어떻게 변하는지 체크도 해보면서 작업을 했습니다. 프로그램 과정에서 일어났거나 일어날만한 내용에 대해 정리해 보겠습니다.

구구단(최종).xlsm
0.06MB

 

1. '변수 미 정의' 오류

 

개발도구 - Visual Basic - 도구 - 옵션에서 '변수 선언 요구'에 체크를 하면 Module 맨 윗부분에 'Option Explicit'란 구문이 추가되므로, 변수를 선언하지 않으면 에러가 납니다. 물론 여기에 체크를 하지 않으면 변수를 선언하지 않더라도 에러 메시지가 나지 않기 때문에 불편함이 없을지는 모르지만, 프로그램의 정확성을 보장하기는 어렵습니다.

예를 들어

Dim i As Integer, j As Integer 'i는 구구단 앞 숫자, j는 구구단 뒷 숫자

라고 해야 하는데,

Dim i As Integer 'i는 구구단 앞 숫자

라고 j란 변수를 정의하지 않고 아래 빨간 선으로 표시한 '매크로 실행'버튼을 클릭하면

아래와 같이 j에 커서가 위치하면서, '변수가 정의되지 않았습니다'라는 에러 메시지 창이 나타납니다.

 

그러면 j 변수를

Dim i As Integer, j As Integer

와 같이 i 변수 뒤에 선언하거나,

Dim j As Integer

라고 별도로 선언하면 문제가 해결됩니다.

2. 변수 값 확인 하기 1 (디버그 메뉴)

Visual Basic - 디버그 메뉴를 보면 아래와 같이 '한 단계씩 코드 실행, 커서까지 실행, 조사식 추가, 간략한 조사식, 중단점 설정/해제, 모든 중단점 지우기 메뉴가 활성화되어 있습니다.

 

가. 한 단계씩 실행(F8)

매크로를 실행하면 순식간에 모든 코드가 실행되다 보니, 변숫값이 어떻게 바뀌는지 화면이 어떻게 변하는지 알기가 어렵습니다. 이런 경우에 사용할 수 있는 기능이 '한 단계씩 실행'이란 기능입니다. F8키를 누르면 코드가 한 줄씩 실행되기 때문에 변수의 변화 및 실행 결과 등을 단계별로 살펴봄으로써 어디서 문제가 발생하는지 찾을 수 있습니다.

실제로 해보겠습니다.

프러시저(sub 프로시저명()부터 end sub 까지를 서브 프로시저라고 합니다) 안에 커서를 놓고, F8키를 누르면

 

① 'sub 구구단( )' 줄이 노란색으로 칠해지고, 왼쪽에 오른쪽 화살표 키가 표시되어, 처리할 줄임을 알려 줍니다.

 

지역 창을 보면 아무것도 실행한 것이 없으므로 변수가 0 또는 Empty로 초기 상태임을 알 수 있습니다.

 

※ Visual Basic Editor 환경 설정에 대해서는 아래 글을 참고 바랍니다.
https://lsw3210.tistory.com/143

 

② 다시 F8키를 누르면 Application.ScreenUpdating = False 란 부분으로 이동하고, 다시 F8키를 누르면 iRow = 3 이란 부분으로 이동하고,

 

③ 다시 F8키를 누르면 iRow = 3을 실행하고, iCol = 1이란 부분으로 이동합니다.

 

④ 따라서 지역 창을 보면 iRow의 값이 3으로 변했고, 아직 iCol은 변함이 없습니다.

 

⑤ 다시 F8키를 누르면 iCol = 1이란 부분도 실행되고, 다음으로 이동합니다. 따라서, 변수 iCol의 값까지 바뀌게 됩니다.

⑥ 다시 F8키를 눌러봅시다. 그러면 최종 단수와 한 줄에 표시할 단수를 입력받는 창 2개가 나오는데, 값을 수정하지 않고 확인 버튼을 눌러 넘어가겠습니다.

 

⑦ Cells.Delete 란 부분으로 이동합니다.

 

지역 창을 보면 i, iLastDan, iDisplayDan의 변수 값이 달라진 것을 확인할 수 있습니다.

 

⑧ 엑셀 보기 버튼을 눌러 엑셀로 가봅시다.

 

⑨ 엑셀로 가보면 아직까지는 Cells.Delete 가 실행되지 않아 구구단이 그대로 표시되고 있습니다.

 

⑩ Visual Basic 버튼을 눌러 VB Editor 모드로 전환합니다.

 

 F8키를 눌러 Cells.Delete를 실행합니다. 그리고, '엑셀 보기' 버튼을 다시 엑셀로 돌아가면 엑셀의 기존 내용이 모두 지워진 것을 알 수 있습니다.

 

 VIsaul Basic 버튼을 눌러 VB Editor 모드로 전환하고, 다시 F8키를 누릅니다.

그러면 For i = 2 To iLastDan 줄이 실행되어 i에 2가 대입된 것을 확인할 수 있습니다.

 

 다시 F8키를 누르면 Range(Cells(iRow, iCol), Cells(iRow, iCol + 4)).Merge 줄이 실행되며,

엑셀 보기 버튼을 눌러 엑셀을 보면 A4에서 E4까지 셀 병합이 되었음을 알 수 있습니다.

 

 다시 VB Editor 창으로 돌아와서 F8키를 계속 눌러 With ~ End With 구문을 실행하고, 엑셀을 보면 "2 단"이란 글자가 입력되고, 가운데 정렬 및 글씨가 굵게 변경된 것을 확인할 수 있습니다.

뒷부분은 각자 해보기 바랍니다.

[Application.Inputbox 처리]

① 2개의 Application.Inputbox문이 있는데, 첫 번째 Applicaiton.Inputbox만 남겨 놓기 위해 Do부터 두 번째 Loop까지 마우스 왼쪽 버튼으로 끌거나 Shift 키를 누른 상태에서 아래 화살표 키를 눌러 범위를 잡고 '주석 블록 설정'버튼을 누르고, 코드 창 아무 데나 클릭합니다.

 

② 그러면 아래와 같이 줄마다 ' 표시가 들어가면서 주석 처리되어 녹색 글자로 보입니다.

 

③ 이제 첫 번째 Application.Inputbox만 주석 블록을 해제하기 위해 그 줄 아무 데나 마우스를 클릭하여 커서를 넣습니다. 잘 안 보이지만 빨간 선안에 커서가 있습니다.

 

④ '주석 블록 해제 버튼'을 누릅니다.

 

⑤ 그러면 첫 번째 Application.Inputbox 줄만 아래와 같이 주석이 해제됩니다.

 

⑥ 이제 F8키를 Application.Inputbox 창이 실행되어 '최종 단수를 물을 때"까지 계속 누릅니다.

 

⑦ '확인'버튼이 아닌 '취소'버튼을 눌러보겠습니다. 그러면 아래와 같이 iLastDan의 값이 False인데도

 

⑧ 프로그램이 멈추지 않고, Cells.Delete를 실행하기 위해 이동합니다.

 

⑨ 그렇다면 iLastDan의 값이 False 일 때의 처리가 필요합니다. 그냥 매크로를 끝낼 수도 있고, 아니면 계속 최종 단수 입력을 받을 수도 있습니다.

⑩ 매크로를 끝내려고 하면 먼저 if부터 end if까지 주석 블록을 해제하고, <> 표시를 =으로 바꾸고, Exit Do를 End로 바꾸면 됩니다.

 

 계속 F8키를 눌러 다시 '최종 단수' 입력 창이 나오도록 하고, 취소 버튼을 누릅니다. 그러면 아래와 같이 if 문으로 이동합니다.

 

 다시 F8키를 누르면 iLastDan이 False이므로 if문이 충족되어 다음 줄로 이동합니다.

 

 다시 F8키를 누르면 아까와 달리 Cells.Delete 문을 실행하지 않고 매크로 실행이 종료됩니다.

 

이런 식으로 F8키를 눌러 한 줄씩 구문의 실행결과와 변수의 변화 상태를 확인하면서 프로그램의 잘못된 점을 찾아내고 수정할 수 있습니다.

길어 지므로 2개로 나누도록 하겠습니다.

 

※ 11 이후의 원문자는 아래 사이트를 참고하였습니다.

https://cocatv.tistory.com/208

반응형