-
Excel 매크로 (VBA) - 020. 런타임 에러 처리 (2)Excel/Excel 매크로 2022. 9. 13. 20:20728x90
전체 목차
- 001. 특정 행을 복사하여 삽입하기
- 002. 선택하여 붙여 넣기 기능 정리
- 003. 변수/Assignment/Loop/비교
- 004. 데이터가 있는 셀의 범위 알아내기
- 005. 데이터 시트(쉘) 순회하기
- 006. 셀 병합 하기
- 007. 변수에 저장되어 있는 데이터 확인하기 (디버그 기능)
- 008. 정렬하기 (Sort)
- 009. 버튼 컨트롤 (Excel Form vs. ActiveX)
- 010. 콤보 상자 컨트롤 (Excel Form vs. ActiveX)
- 011. 확인란/옵션단추 컨트롤(Excel Form vs. ActiveX)
- 012. 스핀단추 컨트롤(스피너, Excel Form vs. ActiveX)
- 013. 자동필터(Auto Filter)
- 014. 함수(function) (전편)
- 015. 함수(function) (후편)
- 016. 중복 데이터 제거하기
- 017. 텍스트 나누기 (공백, 특수문자)
- 018. Vlookup으로 데이터 조회하기(주식 종목 코드 조회)
- 019. 런타임 에러 처리 (1)
포스트 목차.
01. 에러발생 함수
02. Err 과 Erl
03. 사용자 정의 에러
04. 런타임 에러 코드
01. 에러발생 함수
VBA 코드를 통해 런타임 에러를 발생시키는 것이 가능하다.
Error ( [에러번호] )
에러번호는 생략가능하며, 에러의 종류를 식별하는 숫자를 뜻한다.
에러번호 14는 "문자열 공간이 부족합니다"라는 에러를 의미한다. 해당 에러를 강제로 발생시키려면
Error(14)를 VBA 코드에 추가하면 된다.
주요 런타임 에러 번호에 대해서는 이 포스팅의 마지막 부분에서 다룰 예정이다.
02. Err 과 Erl
Err 객체는 에러가 발생했을 때, 에러에 대한 여러가지 처리를 도와주는 객체이다.
다양한 프로퍼티와 메소드를 가지고 있는데 본 포스트에서는 이중 일부를 소개하려고 한다.
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/err-object
1) Err객체의 Number 프로퍼티를 이용하면 발생한 에러의 에러번호를 알 수 있다.
2) Err객체의 Raise 메소드를 이용하면 에러를 발생 시킬 수 있다.
3) Err객체는 최근에 발생한 에러의 정보를 담고 있는데, Err 객체의 Clear 메소드를 통해 해당 정보들을 초기화 할 수 있다.
Erl 함수는 에러가 발생한 위치를 알려주는 함수이다.
https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.information.erl?view=net-6.0
에러 발생 함수와 Err 객체 및 Erl 함수를 이용하여 간단한 Sub 프로시저를 작성해보자.
1234567891011121314Sub errorGen()'에러가 발생하면 Error01 레이블로 이동하여 처리할 것을 명시10 On Error GoTo Error01:'에러번호 13번을 강제로 발생20 Error (13)Error01:'에러 번호와 에러 설명을 출력하는 메시지박스 실행30 MsgBox (Err.number & ":" & Err.Description)'에러가 발생한 곳의 라인번호(레이블)을 출력하는 메시지 박스 실행40 MsgBox (Erl)End Subcs 에러번호 13번 (형식이 일치하지 않습니다)를 강제로 발생시킨 후에, 메시지 박스를 통해 에러번호, 에러설명을 출력하고, 에러가 발생한 레이블을 출력하는 예제이다.
명령어 앞에 있는 숫자들은 Error01:과 같이 명령어의 위치에 대한 이름을 지정하는 레이블이며, 평소에는 대부분의 경우 생략하지만, Erl 함수를 사용하기 위해 이번 예제에서는 추가했다.
실행 결과 첫번째 메시지 박스에는 13:형식이 일치하지 않습니다가 출력되며, 다음 메시지 박스에는 20이 출력된다. 20은 Error (13)이 실행된 곳의 레이블이다.
03. 사용자 정의 에러
Err 객체의 Raise 메소드를 이용하면 에러를 발생시키는 것이 가능하다.
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/raise-method
Raise 메소드의 파라미터는 다음과 같다.
number: Long 타입의 정수이며, 에러 번호를 의미한다. (필수 파라미터)
source: 문자열이며, 에러가 발생한 객체나 응용의 이름을 기록한다. (옵션)
description: 문자열이며, 에러에 대한 설명이다. (옵션)
helpfile: 도움말 파일이 있는 경로 (옵션)
helpcontext: 도움말 파일에서 사용될 에러 식별용 아이디 (옵션)
사용자가 따로 에러를 정의할 때는 number 파라미터에 vbObjectError 이라는 상수와 사용자 정의 에러번호를 더한 값을 사용한다. 사용자 정의 에러번호는 513~65535 사이의 값을 사용하면 된다.
123456789101112131415Sub errorGen2()'에러가 발생하면 Error01 레이블로 이동하여 처리할 것을 명시10 On Error GoTo Error01:'사용자 정의 에러(에러번호 1000번)를 강제로 발생20 Err.Raise number:=vbObjectError + 1000, Description:="강제발생"Error01:'에러 번호와 에러 설명을 출력하는 메시지박스 실행30 MsgBox (Err.number & ":" & Err.Description)'에러가 발생한 곳의 라인번호(레이블)을 출력하는 메시지 박스 실행40 MsgBox (Erl)End Subcs 사용자 정의 에러 (에러번호 1000번 & 강제발생으로 에러설명을 정했음)를 강제로 발생시킨 후에, 메시지 박스를 통해 에러번호, 에러설명을 출력하고, 에러가 발생한 레이블을 출력하는 예제이다.
명령어 앞에 있는 숫자들은 Error01:과 같이 명령어의 위치에 대한 이름을 지정하는 레이블이며, 평소에는 대부분의 경우 생략하지만, Erl 함수를 사용하기 위해 이번 예제에서도 추가했다.
실행 결과 첫번째 메시지 박스에는 -2147220504:강제발생이 출력되며, 다음 메시지 박스에는 20이 출력된다. 20은 Err.Raise가 실행된 곳의 레이블이다. vbObjectError의 값이 -2147221504이기 때문에 해당 값에 1000을 더한 -2147220504가 에러 번호로 사용되었다.
04. 런타임 에러 코드
기존에 엑셀에서 정의하고 있는 런타임 에러 코드와 에러 설명이 어떤 것인지 조회하는 Sub 프로시저를 작성해보자.
위의 그림 처럼 시트를 하나 만들고 A열에는 숫자를 적당히 순서대로 채워준다. 여기서는 100까지만 채우겠다.
함수를 하나 정의해보자. 정의하려고 하는 함수는 에러번호를 입력 받았을 때 이에 상응하는 에러설명을 반환하는 함수다.
함수에 대해 자세히 알아보고 싶다면 이전 포스트를 참고하자
https://eggdrop.tistory.com/28
https://eggdrop.tistory.com/29
1234567891011Function getRuntimeErrorDescription(number) As String'에러가 발생할 경우 Error01:로 이동On Error GoTo Error01:'입력받은 파라미터 number로 에러Error (number)Error01:'에러가 발생하면 Err.Description을 반환getRuntimeErrorDescription = Err.DescriptionEnd Functioncs 에러를 강제로 발생시키고 Err 객체를 이용하여 에러 설명(Description)을 반환하는 함수이다.
위의 함수 또한 에러처리가 완변하게되어 있지는 않다. number에 숫자 외에 다른 값이 들어가면 다른 에러가 발생할 것이다.
이번에는 위의 함수를 사용하여, A열에 있는 에러 코드에 대해서 에러 설명을 B열에 출력하는 Sub 프로시저를 작성해보자.
12345678910111213141516Sub fillUpErrorDescription()'1행 부터 시작을 위해 1저장startRow = 1'1열의 마지막 데이터가 있는 행 번호 구하기lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row'시작행부터 마지막행까지 수행For i = startRow To lastRow'A열에 있는 숫자 가져오기number = ActiveSheet.Cells(i, 1).Value'A열에 있는 값이 숫자인 경우만 실행If IsNumeric(number) Then'getRuntimeErrorDescription함수를 이용하여 Description을 구하기ActiveSheet.Cells(i, 2).Value = getRuntimeErrorDescription(number)End IfNext iEnd Subcs 위의 Sub 프로시저를 실행한 결과는 다음과 같다.
위의 그림 처럼 에러번호와 에러설명이 출력되는 것을 확인할 수 있다. 응용프로그램 정의 오류 또는 개체 정의 오류로 표기되는 에러는 VBA에서 정의되지 않은 에러라고 볼 수 있을 것이다. 더 많으 에러에 대한 정보가 알고 싶다면, A열의 값을 0부터 512까지 늘리면 비주얼 베이직에서 정의하고 있는 에러들을 볼 수 있을 것이다.
주요 에러들은 다음 링크를 참조하자.
https://chejunkie.com/knowledge-base/common-runtime-error-codes-vba/
728x90'Excel > Excel 매크로' 카테고리의 다른 글
Excel 매크로 (VBA) - 022. 로또 번호 생성기를 만들어 보자 (0) 2022.11.05 Excel 매크로 (VBA) - 021. 인풋박스 (InputBox) 사용 방법 (0) 2022.09.14 Excel 매크로 (VBA) - 019. 런타임 에러 처리 (1) (0) 2022.09.12 Excel 매크로 (VBA) - 018. Vlookup으로 데이터 조회하기 (주식 종목 코드 조회) (4) 2022.09.11 Excel 매크로 (VBA) - 017. 텍스트 나누기 (공백, 특수문자) (1) 2022.09.08