Vba 오류 유형: 디버깅 및 해결 방법
다른 프로그래밍 언어와 마찬가지로 VBA는 오류가 발생하면 운이 좋지 않으며 무슨 일이 있어도 오류를 처리해야 합니다. 잘못된 코딩, 불가능한 연산(예: 0으로 나누기) 또는 예상치 못한 오류 등 다양한 소스에서 발생할 수 있습니다.
이를 처리하는 가장 좋은 방법은 코드를 사용하여 얻을 수 있는 모든 가능한 결과를 잘 이해하는 것입니다. 선택한 셀에 있는 값을 사용하여 숫자의 제곱근을 계산하는 VBA 코드가 있는 아래 예를 살펴보세요.
Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub
하지만 활성 셀에 숫자가 아닌 값이 있으면 아래와 같이 런타임 오류가 발생합니다.

VBA의 오류 매개변수(오류 잡기)
VBA 옵션에서는 코드 작성을 시작하기 전에 오류를 처리하도록 설정을 구성할 수 있습니다. VBA 설정을 열려면 도구 ➤ 옵션 ➤ 일반 ➤ 오류 잡기로 이동하세요. 여기서는 세 가지 옵션을 사용할 수 있습니다.

- 모든 오류 시 중지 : 이 옵션을 활성화하면 VBA는 모든 종류의 오류 처리 기술을 사용한 경우에도 모든 유형의 오류에 대한 코드를 중지합니다.
- 변조 클래스 모듈 : 이 옵션을 사용하면 VBA는 어떤 기술로도 처리되지 않는 모든 코드를 중지합니다. 그리고 Userforms와 같은 개체를 사용하는 경우 해당 개체를 분할하여 오류가 있는 정확한 줄을 강조 표시합니다.
- 처리되지 않은 오류 중단 : 이는 오류 처리 기술을 사용하지 않는 모든 오류를 파악하고 처리되지 않은 모든 오류에 대해 코드를 중지하는 데 도움이 되는 기본 설정입니다. (그러나 사용자 양식과 같은 개체를 사용하는 경우 개체에서 오류를 일으키는 줄은 강조 표시되지 않고 해당 개체를 참조하는 줄만 강조 표시됩니다.)
VBA 오류 유형
VBA 오류를 이해하기 위해 이를 네 가지 범주로 나눌 수 있으며, 아래에는 이러한 유형의 오류에 대한 설명이 나와 있습니다.
1. 구문 오류
VBA 코드를 작성하는 동안 특정 구문을 따라야 하며 이를 무시하거나 제대로 작성하지 않으면 SYNTAX 오류(언어 오류라고도 함)가 발생할 수 있습니다. 이는 코드를 작성하는 동안 발생하는 오타와 같습니다.
VBA는 오류 메시지를 표시하여 이러한 오류를 보고하는 데 도움을 줍니다. VB 편집기에서 “자동 구문 검사”가 활성화되어 있는지 확인하기만 하면 됩니다.
도구 ➤ 옵션으로 이동하여 “자동 구문 검사” 상자를 선택하십시오. 이를 통해 SYNTAX 오류가 발생할 때마다 VBA는 오류 메시지를 표시합니다.

그러나 “자동 구문 검사”가 비활성화된 경우 VBA는 여전히 오류가 있는 코드 줄을 강조 표시하지만 오류 메시지를 표시하지 않습니다.
2. 컴파일 오류
이는 활동을 수행하기 위한 코드를 작성했지만 해당 활동이 유효하지 않거나 VBA에서 수행할 수 없는 경우에 발생합니다. 가장 좋은 예는 IF 문을 사용하는 일부 코드가 있지만 문 끝에 END IF를 추가하지 않아서 이 VBA를 실행할 때 컴파일 오류 메시지가 표시되는 경우입니다.

이 외에도 컴파일 오류의 다른 예가 있습니다.
- Next 없이 For 사용( For Next ).
- 끝을 선택하지 않고 선택합니다( 케이스 선택 ).
- “ Explicit Option ”을 활성화한 경우 변수를 선언하지 마십시오.
- 존재하지 않는 하위/함수를 호출합니다.
3. 런타임 오류
코드가 실행될 때 런타임 오류가 발생합니다. 코드가 숫자의 제곱근을 계산할 때 위에서 공유한 예를 기억하세요.

코드를 실행하는 동안 런타임 오류가 발생하면 코드가 중지되고 오류 대화 상자가 표시되며 이 오류 상자는 발생한 오류의 성격에 대해 설명합니다. 지정한 위치에서 통합 문서를 여는 코드를 작성했지만 해당 통합 문서가 누군가에 의해 이동되거나 삭제되었다고 가정해 보겠습니다.

따라서 코드를 실행하면 VBA는 이 위치에서 이 파일을 찾을 수 없기 때문에 런타임 오류를 표시합니다. 런타임 오류가 발생한 메시지에는 오류 원인을 이해하는 데 도움이 되는 이유가 설명되어 있습니다.

그리고 런타임 오류가 발생하면 코드 실행을 중지합니다. “디버그” 버튼을 클릭하면 이 오류가 포함된 코드 줄이 노란색으로 강조 표시되어 표시됩니다. 또는 “종료” 버튼을 클릭하여 코드 실행을 중지하고 오류 메시지를 닫을 수 있습니다.
4. 논리적 오류
이는 오류가 아니라 코드를 작성하는 동안 발생하는 오류입니다. 이러한 유형의 오류는 오류를 찾아 수정하는 데 때때로 문제를 일으킬 수 있습니다.
일부 코드를 작성하고 변수를 선언할 때 잘못된 데이터 유형을 사용하거나 잘못된 계산 단계를 사용했다고 가정해 보겠습니다. 이 경우 코드는 제대로 작동하며 이 오류를 쉽게 찾을 수 없습니다. 이런 종류의 문제를 처리하는 가장 좋은 방법은 각 코드 줄을 하나씩 실행하는 것입니다.
VBA에서 디버깅 도구 사용
VBA는 코드를 디버그하고 코드에서 버그를 제거하는 도구 세트를 제공합니다.
1. VBA 프로젝트 컴파일
Visual Basic Editor에는 코드를 완성한 후 즉시 사용할 수 있는 옵션이 있습니다. 이러한 컴파일 옵션은 코드의 각 줄을 분석하고 코드에 오류가 있는 경우 메시지 상자를 표시합니다.
참고: VBA 컴파일 옵션은 런타임 오류가 아닌 구문 및 컴파일 오류만 추적합니다. 이러한 오류는 코드가 실행될 때만 발생하기 때문입니다. VBA 프로젝트 컴파일을 사용하려면 ➤ 디버그 ➤ VBA 프로젝트 컴파일로 이동하세요.

“VBA 프로젝트 컴파일”을 실행하고 코드에 오류가 없으면 옵션이 회색으로 표시됩니다.
2. 각 코드 줄을 하나씩 실행합니다.
이것이 내가 하는 방법이다. 코드를 완성하면 한 줄씩 실행하여 오류가 있는지 확인합니다. 시간이 걸릴 수 있지만 모든 오류(구문, 컴파일 및 실행)를 해결하는 데 도움이 됩니다.
“디버그 도구 모음”에는 코드를 한 줄씩 실행하는 데 사용할 수 있는 “Step In” 버튼이 있습니다. 또는 F8을 눌러 한 줄을 실행한 후 다시 누르면 코드의 다음 줄을 실행할 수 있습니다.

“On ERROR” 문을 사용하여 VBA 오류 처리
코드를 확인하고 사용 가능한 모든 디버깅 방법에서 발생할 수 있는 오류를 찾는 것이 중요합니다. 그러나 가장 좋고 효율적인 방법은 오류를 처리하고 실행 시 코드를 완벽하게 만들 수 있는 오류 처리 지침을 만드는 것입니다. 이러한 진술을 살펴보겠습니다. VBA 코드에서 오류가 발생하면 이 오류를 처리하는 가장 좋은 방법은 다음과 같습니다.
- VBA가 오류를 무시하고 코드를 실행하도록 합니다.
- 오류가 발생하면 특수 명령 세트가 실행되도록 합니다.
두 솔루션 모두 “On Error” 문을 사용할 수 있습니다. 다음은 사용할 수 있는 4가지 “오류 시” 설명입니다. 이제 각 진술을 하나씩 살펴보겠습니다.
1. 실수했다면 다시 시작하세요
이 간단한 코드 줄을 사용하면 VBA는 오류 발생에도 불구하고 코드를 계속 실행할 수 있습니다. IDEA는 간단합니다. 실행 중에 오류가 감지되면 다음 코드 줄로 이동합니다.
아래 코드에는 두 줄의 코드가 있습니다.
- 첫 번째 줄은 A1 셀의 값이 25를 0으로 나눈 값임을 나타냅니다.
- 두 번째 줄에는 셀 값 A2가 10을 5로 나눈 값이라고 나와 있습니다.
이제 온라인에 있는 코드에 문제가 있습니다. 아시다시피, 어떤 것을 0으로 나누면 결과는 오류가 됩니다. 따라서 이 코드를 실행하면 VBA는 “런타임 오류 ’11’ 0으로 나누기”라는 오류 메시지를 표시하고 실행을 중지합니다.
그러나 코드 시작 부분에 “On Error Resume Next”를 추가하고 코드를 실행하면 VBA는 오류가 발생한 코드 줄을 무시하고 두 번째 줄을 계속 진행하여 해당 값을 셀 A2에 추가합니다.
Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub
따라서 어디에서나 오류가 발생하더라도 코드를 실행하려면 코드에서 “On Error Resume Next” 문을 사용하기만 하면 됩니다.
하지만 주의해야 할 사항이 한 가지 더 있습니다. 나중에 발생하는 오류만 무시한다는 것입니다.
5행에서 오류가 발생하고 8행에 “On Error Resume Next”를 추가했다고 가정하면 이 오류를 건너뛰지 않습니다. 따라서 가장 좋은 방법은 프로시저의 첫 번째 코드 줄에 추가하는 것입니다.
2. GoTo 0 오류가 발생한 경우
이는 오류가 발생하면 코드 실행을 중지하는 VBA의 기본 동작입니다.
음, “On Error GoTo 0″을 사용해도 코드에는 아무런 차이가 없습니다. VBA는 단순히 코드를 중지하고 오류 설명이 포함된 메시지를 표시합니다. 그렇다면 왜 그것을 사용하는 데 어려움을 겪어야합니까? 현명한 질문입니다. 위의 ” On Error Resume Next “에서 사용한 예를 사용해 보겠습니다.
이 코드에서는 오류가 발생할 때마다 VBA가 다음 코드 줄을 가져와 실행하므로 오류 메시지가 표시되지 않습니다. 하지만 코드에 더 많은 줄이 있고 코드에 오류가 있어도 해당 줄을 초과하고 싶지 않다고 가정해 보겠습니다.
따라서 두 번째 코드 줄 뒤에 “On Error GoTo 0″을 입력하면 오류가 발생할 때마다 오류 메시지를 표시하는 VBA의 기본 오류 처리기가 복원됩니다.
3. GoTo 오류가 발생한 경우 [라벨]
비상시에 갈 수 있는 건물 안의 장소를 생각해 보십시오. 마찬가지로 “On Error GoTo [Label]”을 사용하면 기본 코드에 별도의 코드 블록을 만들어 오류를 처리할 수 있습니다.
실제로 “On Error GoTo [Label]”은 오류를 처리하는 훨씬 더 좋고 편리한 방법입니다. 아래 코드에는 “On Error GoTo Oh!”가 있습니다. Error”라는 단어는 이제 이 줄 선언에서 “Oh!”라는 단어로 표시됩니다. 오류”가 레이블입니다.
레이블 이름으로 특정 시작이 있는 코드 끝을 보면 코드에 메시지가 있는 메시지 상자에 대한 코드가 있습니다.
이제 오류가 발생하면 어떻게 됩니까? VBA는 “오! Error”라고 표시되고 해당 레이블 뒤에 있는 코드 블록이 실행됩니다.
하지만 주의해야 할 것이 하나 있습니다. 오류가 발생하지 않으면 코드에 있는 레이블이 실행됩니다. 수행해야 할 두 가지 작업은 다음과 같습니다.
- 먼저, 코드 끝에 오류 태그를 추가했는지 확인하세요.
- 둘째, 오류 라벨 앞에 “Exit Sub”를 추가하세요.
이를 통해 두 가지 상황 모두에서 이점을 얻을 수 있습니다. 오류가 발생하고 VBA가 지정한 레이블로 전환되면 레이블 자체의 코드만 코드로 이동한다고 가정해 보겠습니다. 그리고 오류가 발생하지 않으면 레이블 앞에 있는 “Exit Sub” 문은 오류 레이블을 실행하지 않고 프로시저를 종료합니다.
4. GoTo 에러가 발생한 경우 -1
본 내용에 들어가기 전에, 여러분에게 한 가지를 공유하겠습니다. 코드에 오류가 발생하면 VBA는 이 오류 로그를 메모리에 저장하고 루틴이 완료될 때만 지워집니다.
오 VBA! 현재를 살아라
VBA 코드의 두 번째 오류를 처리하려면 VBA 메모리에서 첫 번째 오류를 지워야 합니다. 아래 코드에는 서로 다른 두 코드 블록의 오류를 처리하는 두 개의 “On Error GoTo [Label]” 문이 있습니다.
그러나 이 코드를 실행하면 두 번째 오류가 발생하면 VBA는 사용자가 설정한 레이블로 이동하지 않고 대신 “유형 불일치” 오류 메시지를 표시합니다.
Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
이 문제를 해결하려면 VBA가 저장소에서 현재 오류를 제거할 수 있도록 하는 “On Error GoTo -1″을 사용할 수 있습니다.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
이제 이 코드를 실행하면 “On Error GoTo -1″이 메모리에서 오류를 제거하고 VBA는 두 번째 문의 오류를 원하는 대로 처리합니다.
VBA에서 오류를 처리하려면 무엇을 더 알아야 합니까?
오류 처리 기술을 사용하는 것 외에도 오류를 더 잘 처리하는 데 사용할 수 있는 몇 가지 다른 방법이 있습니다.
개체 오류
코드를 실행하는 동안 오류가 발생하면 Err 개체를 사용하여 오류에 대한 세부 정보를 얻을 수 있습니다. Err 개체와 함께 사용할 수 있는 몇 가지 속성과 메서드가 있습니다. 하나씩 배워봅시다.
속성
Err 개체와 함께 사용할 수 있는 속성은 다음과 같습니다.
- Err.Number : 오류가 발생하면 Err 개체에 숫자가 저장됩니다. 아래 코드에서는 오류가 발생하면 메시지 상자에 오류 번호가 표시됩니다.
- Err.Description : 이 속성은 오류 원인을 이해하는 데 도움이 되는 오류 설명을 표시합니다.
- Err.Source: 이 속성은 오류가 발생한 프로젝트를 알려줍니다.
- Err.HelpContext: 이 속성은 도움말 파일의 오류에 대한 도움말 컨텍스트 ID를 반환합니다.
- Err.HelpContext: 도움말 파일 위치에 대한 문자열 값입니다.
일반적으로 오류 처리 기술을 사용하여 오류를 처리할 때는 코드에서 Err 개체를 많이 사용하지 않습니다. 하지만 아래는 이를 사용하는 간단한 예입니다.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1: MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description End Sub
위 코드를 실행하면 오류가 발생한 경우 오류 번호와 오류 설명이 포함된 메시지 상자가 표시됩니다.
행동 양식
Err Object를 사용하면 두 가지 방법을 사용할 수도 있습니다.
- Err.Clear: 이 방법은 VBA 메모리에서 오류 번호와 오류 설명을 지웁니다(오류를 완전히 재설정하지 않기 때문에 “On Error GoTo -1″과 다릅니다).
- Err.Raise: 이 방법을 사용하면 코드에서 의도적으로 런타임 오류를 생성 할 수 있으며, 따라야 할 구문은 다음과 같습니다.
Err .Raise [번호], [소스], [설명], [도움말 파일], [도움말 컨텍스트]
오류 처리에 대한 빠른 팁
다음은 VBA 오류를 더 잘 처리하는 데 사용할 수 있는 몇 가지 빠른 팁입니다.
- 오류가 발생하고 있음이 확실하고 오류가 있는 코드 줄을 건너뛰어도 괜찮고 다음 줄로 넘어가도 안전한 경우에만 “오류 시 다음 재개”를 사용하세요.
- 런타임 오류를 처리하는 가장 좋은 방법은 “On Error GoTo [Label]”과 함께 “Error Handler”를 사용하는 것입니다. 이렇게 하면 오류가 발생할 때마다 알림을 받게 되지만 불쾌한 오류 메시지는 표시되지 않습니다.
- 오류 처리기를 사용할 때마다 먼저 “Exit Sub”를 사용해야 합니다.
관련 튜토리얼
- VBA 오버플로 오류(오류 6)
- VBA 런타임 오류(오류 1004)
- VBA 인덱스 실행 오류가 범위를 벗어났습니다(오류 9).
- VBA 유형 비호환 오류(오류 13)
- VBA 메모리 부족 오류(오류 7)