EXCEL - VBA

구구단 만들기(6) (엑셀 VBA 디버깅 2)

별동산 2022. 12. 15. 08:54
반응형
구구단(최종).xlsm
0.06MB

나. 조사식 추가

지역 창에서도 변수의 변화 상태를 알 수 있지만, 아래와 같이 원하는 변수에 커서를 넣고 마우스 오른쪽 버튼을 누르거나, 디버그 - 조사식 추가 메뉴를 누르면


아래와 같이 단순히 변수의 변동 상태뿐만 아니라, '값이 True일 때 중단' 또는 '값이 변경될 때 중단'이란 옵션이 있습니다. 변수에 커서를 넣지 않고 조사식 추가를 누른 경우는 직접 변수를 입력해도 됩니다.


'값이 True일 때 중단'이란 옵션을 선택하려면 먼저 윗부분의 '식'이란 부분에 i=3 식으로 조건 식을 먼저 입력해야 하며, 입력 후 확인 버튼을 클릭합니다.


④ 그러면 화면 오른쪽 아랫부분에 조사식 창이 추가되면서 i=3 이란 수식이 추가됩니다. 지역 창에 보이는 i와 다릅니다.


⑤ 이제 실행 버튼을 눌러 매크로를 실행하면 i=3 란 조건식이 충족되는, 다시 말하면 i가 3일 때 해당 줄이 노란색으로 표시되면서 매크로 실행이 중단됩니다.

(코드 창)
i가 3으로 된 후 첫번째 행을 실행하기 위해 그 행으로 이동합니다.


(지역 창)
i가 3일 때 j는 10(9까지 실행하고 +1이 되기 때문에 10입니다), iRow는 3이지만, iCol은 7로 변한 것 등 변수의 상태를 알 수 있습니다. 여기서 iCol이 혹시 1이라면 같은 단에 계속 덧씌우게 되어 최종적으로는 9단만 표시됩니다.


(조사식 창)


⑥ 조사식 창에서 마우스 오른쪽 버튼을 눌러 조사식을 추가하거나, 편집, 삭제할 수도 있고, 계속 실행 또는 재설정(중지) 할 수도 있습니다.


⑦ 조사식 창에서 마우스 오른쪽 버튼을 눌러 조사식 편집 메뉴를 누른 후, 아래와 같이 'i=4'로 수식을 변경한 후 확인 버튼을 누르면


⑧ 조사식 창이 아래와 같이 변경됩니다.


⑨ 매크로 실행 시마다 최종 단수와 한 줄에 표시할 단수를 물어보므로
아래와 같이 Do ~ Loop문 2개를 마우스를 드래그하여 범위를 선택한 후 윗부분의 '주석 블록 설정'버튼을 눌러 주석 처리하고,


⑩ 윗부분에 iLastDan=9:iDisplayDan=4라고 변숫값을 대입해보겠습니다. 변숫값이 없으면 에러가 나기 때문입니다.


아래 화면을 참고하여 For j=1 to 9 ~ Next문 아래의 if문을 마우스로 드래그하여 범위를 잡은 후 '주석 블록 설정'버튼을 누르면,


아래와 같이 앞에 작은따옴표 표시가 행마다 삽입되어 해당 문장이 주석 처리됩니다.


매크로 실행 버튼을 누르면 아래와 같이 멈추는데,


화면 왼쪽 위 엑셀 아이콘을 눌러 엑셀 화면을 보면 2단 자리에 3단이 표시되고 있음을 알 수 있습니다. 다시 말해 iCol이란 변수가 증가하지 않고 계속 1이다 보니 같은 자리에 3단이 표시된 것입니다.

다. 간략한 조사식(Shift + F9)

아래 구문에서 iCol + 4를 범위로 정한 후
Shift + F9 또는 디버그 메뉴에서 '간단한 조사식' 메뉴를 클릭하면


아래와 같은 '간략한 조사식' 상자가 나오는데, 추가 버튼을 누르면


조사식 추가와 마찬가지로 조사식 창에 조사 식이 추가됩니다. 다른 점은 조사식은 '값이 true일 때 중단', '값이 변경될 때 중단' 등 옵션이 있는데, 이건 없다는 것입니다.

라. 커서까지 살행(Ctrl + F8)

'커서까지 실행'이란 커서가 있는 행까지 매크로를 실행하고 중단한다는 것입니다.
예를 들어 아래와 같이 for j문 맨 마지막 줄에 커서를 놓고 Ctrl + F8키를 누르면,


아래와 같이 커서가 위치한 곳을 노란색으로 표시하면서 실행을 중지하게 됩니다.


화면 위 왼쪽 엑셀 아이콘을 눌러 엑셀로 돌아가서 화면을 보면 아래와 같이 '2 단'이라는 제목과 2*1=까지만 실행된 상태이고, 아직 결괏값인 2는 표시되지 않은 상태임을 알 수 있습니다.


Visual Basic 버튼을 눌러 지역 창을 살펴보면 아래와 같습니다.


다시 한번 더 Ctrl + F8키를 누르면 아래와 같은 상태가 됩니다. 2*1의 결괏값이 추가로 표시됐고, 2*2=까지 표시되었습니다.

마. 중단점 설정/해제(F9), 모든 중단점 지우기(Ctrl + Shift + F9)

'중단점 설정'이란 코드 창 왼편 사이드 바에 중단 점을 표시하여 해당 줄 이전까지 실행하고 해당 줄에서 실행을 중단하는 기능입니다. '커서까지 실행'과 비슷한 기능이지만 커서가 아닌 중단점을 기준으로 한다는 점만 다릅니다.
중단점 설정은 F9키를 눌러도 되고, 사이드바를 마우스로 클릭해도 됩니다. 중단점이 설정되면 사이드 바에 고동색 동그라미가 표시되고, 해당 줄이 고동색으로 칠해집니다. F9키를 누르거나, 메뉴 클릭 또는 왼쪽 중단점을 클릭해서 중단점을 지울 수 있습니다.


매크로 실행 버튼을 누르면 중단점에서 실행을 중단하고, 다시 실행 버튼을 누르면 위의 경우에는 For ~ Next문을 한 바뀌 돈 다음 해당 중단점이 있는 부분에서 다시 멈춥니다.
왼쪽을 보면 i값이 2, j값이 0이었다가, 한 바퀴 돌면 i가 3, j가 10이 됩니다.


엑셀 아이콘을 눌러 엑세로 돌아가면 2단까지 실행하고, '3 단'이란 제목까지 실행했음을 알 수 있습니다. 위에서 말한 바와 같이 iCol 값을 변경하는 부분이 주석 처리되어 2단을 덮어쓰고 있는 상태입니다.


모든 중단점 지우기 (Ctrl + Shift + F9)
중단점은 여러 군데 설정할 수도 있고, 개별적으로 중단점 설정을 해제할 수 있는데, 모든 중단점을 한꺼번에 지우려면 디버그 - 모든 중단점 지우기 메뉴를 누르거나, Ctrl + Shift + F9 키를 누르면 됩니다.

3. 변숫값 확인하기 2 (디버그 메뉴 이외의 방법)

가. 해당 변수에 마우스 커서 갖다 대기

아래와 같이 iRow에 마우스 커서를 갖다 대면 iRow의 값이 그 아래 표시됩니다.


아래와 같이 VBA 내장 상수인 xlCenter에 마우스 커서를 갖다 대 그 값을 알 수도 있습니다.


마우스로 끌어서 범위를 지정하고 지정한 곳에 커서를 갖다 대면 수식의 결괏값이 나옵니다.

나. 직접 실행 창 활용

알고자 하는 부분을 복사한 후

? 표시를 하고, 그다음에 붙여넣기를 한 후 엔터키를 치면


값이 A3이라고 표시됩니다.

여기서 ? 는 print, 다시 말해 '화면에 결괏값을 표시하라'는 역할을 합니다. 따라서, ? 대신 print라고 써도 됩니다.

아래와 같이 길어도 상관없으며, 줄 어느 위치에서든 엔터를 치면 결과 값, A3*C3이 아래 줄에 표시되고, 그 전 결괏값은 그 아래로 내려갑니다.


직접 실행 창에서 수식을 수정한 후 엔터키를 쳐도 됩니다. 위 수식에서 (0,0) 부분을 앞, 뒤에서 지운 후 엔터키를 치니 $A$3*$C$3이라고, 앞 뒤에 $표시가 붙습니다.


중단점을 설정하고 매크로를 실행한 후,
Range(Cells(iRow, iCol), Cells(iRow, iCol + 4)).Merge를 복사하고,
? Range(Cells(iRow, iCol), Cells(iRow, iCol + 4)).address라고
Merge를 address로 수정하고 엔터키를 치면
아래와 같이 해당되는 셀 주소를 알 수 있습니다.
위와 같이 셀(범위)의 address 속성을 알아냄으로써 프시저가 어떤 셀(범위)을 처리하고 있는지 알 수 있습니다.


직접 실행 창에 수식을 입력한 후 엔터키를 쳤을 때


아래와 같은 에러가 난다면 프시저를 실행하지 않아 변수에 값이 안 들어갔기 때문입니다.


이 때는 해당 수식 줄 다음에 중단점을 설정하고


매크로 실행 버튼을 눌러, 중단점 이전까지 실행하도록 한 다음
직접 실행 창의 수식 줄에 커서를 놓고 엔터키를 치면 됩니다.


Cells(iRow + j, iCol)이라고 셀 주소 다음에 아무것도 없으면 .value가 생략되어 있는 것이므로, 해당 주소의 값을 표시하라는 것이 되고, 2가 표시되고 있습니다.

4. 무한 루프를 돌 때는 Esc 키를 연속적으로 눌러 중단

아래와 같이 주석 처리를 하면

Loop를 빠지는 부분이 없어 확인이나 최소 버튼을 눌러도 계속 '표시할 단수 알림 창'을 계속 띄워 무한 루프를 돌게 됩니다.

이 때는 Esc키를 계속 눌러 아래 화면이 나오도록 하고, 디버그 버튼을 누릅니다. 혹시 아래 화면이 잘 안 나오면 '표시할 단수'창을 VBA 화면이 아니라 엑셀 화면에 나오도록 한 상태에서 Esc키를 계속 누르시기 바랍니다.


그러면 에러가 있는 부분에 실행 줄이 생기는데, 원인을 찾아 수정하면 됩니다. 지금은 원인을 알고 있으므로 다음 줄의 주석만 제거하고 매크로 실행 버튼을 누르면 됩니다.

5. '중단 모드로 코드 실행 불가' 오류 발생 시

프로그램이 중단된 상태에서 작업을 하다가 다시 매크로 실행 버튼을 누르면 아래와 같이 '중단 모드에서는 코드를 실행할 수 없습니다'란 메시지가 나오는 경우가 있습니다. 이 때는 재설정 버튼을 눌러 매크로를 종료한 후 다시 실행 버튼을 누르면 됩니다.

6. 주석 처리로 잠시 실행에서 제외

코드가 복잡할 때는 에러가 날 것 같은 부분은 주석 처리한 후 실행하고, 에러가 없으면 주석 설정을 해제하는 식으로 블록별로 구분해서 원인을 찾아갈 수 있습니다.

7. 듀얼 모니터인 경우 화면 배치

화면이 2개인 경우 Visual Basic Editor 창을 끌어서 다른 모니터에 갖다 놓으면 왼쪽에는 엑셀 창, 오른쪽에는 Visual Basic Editor 창이 또는 그 반대로 동시에 보여, 매크로 실행 결과를 다른 모니터의 엑셀 화면에서 바로바로 확인할 수 있으므로 디버깅 하기가 훨씬 편합니다. 화면이 1개라면 엑셀 보기 버튼과 Visual Basic 버튼을 눌러 왔다 갔다 하면서 확인해야 하는 어려움이 있었는데, 이것이 한 방에 해결됩니다. 그러기 위해서는 약간의 투자가 필요합니다. 모니터 크기가 달라도 별로 불편한 점은 없습니다.

반응형