티스토리 뷰
■ 오류 종류
구문 오류 : 문법 오류
런타임 오류 : 프로시저 구동 중 발생하는 오류
※ 오류처리프로시져를 작성하여 에러를 처리하고자 한다면
VBE 옵션에서 [오류발생 시 무조건 중단] 해제 -> [ 처리되지 않은 오류 발생 시 중단 ] 선택
■ 오류처리 개념
VBA는 기본적으로 프로시저 구동 중 발생하는 런타임 오류에 대해서
VBA오류메시지 대화상자를 뛰운다. -------------------------------≫
일반 Excel사용자가 이런 에러 메시지창을 대하면 대처가 불가할 수 있으니
배포자가 에러를 내부적으로 처리할 필요가 있다
( 배포자가 작성한 메시지를 뛰우거나 에러처리 코드 실행 )
▶ VBA는 에러발생 시 발생에러를 Err 개체의 Number 속성에 저장
▶ Error함수를 이용하여 오류메시지를 반환 가능------------------≫
MsgBox "Error" & Err & " : " & Error(Err.Number)
MsgBox "Error" & Err & " : " & Error(Err) ' 동일 결과
■ 에러처리 방법
[ Test ]
빈 시트에서 Cells.SpecialCells(xlFormulas, xlNumbers).Select 프로시저 수행시 Err 1004 에러 발생
▶ 오류를 무시하고 프로그램을 계속 진행하다가 나중에 Err개체를 확인하여 적절히 조치함
: On Error Resume Next문은 에러발생 전에 위치시키고(주로 프로시저 시작 부분에 놓음),
에러처리는 끝에서 한다.
Sub 예러처리() On Error Resume Next Cells.SpecialCells(xlFormulas, xlNumbers).Select ' 이동옵션 : 수식-수 선택 => 숫자가 있는 셀만 선택 기능 ' 기타 코드 MsgBox "Error" & Err & " : " & Error(Err) End Sub |
Range객체.SpecialCells(Type, Value) - 홈>찾기 및 선택>이동옵션 : 지정Type만 선택 기능 |
▶ 오류를 처리하기 위하여 오류처리 루틴으로 이동 (Lable이용)
: On Error GoTo문은 GoTo문과 같은 기능이며, 에러 발생하여 레이블로 이동한다면
레이블 이후에 루틴은 모두 수행한다. 이 말은 에러가 발생하지 않아도 루틴 마지막에는
레이블 이후 코드가 실행되어 원치 않는 에러처리 메시지박스가 뜰 수 있다.
그러므로 레이블 이전에 Exit Sub 꼭 삽입해야 에러 미발생시 레이블이후 코드 미실행됨
Sub 예러처리() Cells.SpecialCells(xlFormulas, xlNumbers).Select On Error GoTo ErrorHandler ' 에러가 발생하여 레이블로 이동하라는 명령 ' 기타 코드 Exit Sub ErrorHandler: MsgBox "Error" & Err & " : " & Error(Err) 'Exit Sub문이 없을시 에러 미발생시도 수행됨 End Sub |
▶ On Error GoTo 0문을 이용하여 On Error Resume Next를 무력화
: 이문장 이전에 저장된 Err을 0(이전 까지는 에러가 발생하지 않은 것으로 처리)으로 만들고, 이후 발생한 Error는 VBA 에러처리 메시지를 뛰운다. ( 큰 프로젝트에서 계속 에러발생을 무시하지 않고자 할 때 사용 )
Sub 예러처리() On Error Resume Next Cells.SpecialCells(xlFormulas, xlNumbers).Select If Err = 1004 Then MsgBox "Error" & Err & " : " & Error(Err) End If ' 에러 처리가 필요시 On Error Resume Next 무력화 On Error GoTo 0 ' 기타 코드 (이후 코드에서 에러 발생시 vba에러메시지창 발생) End Sub |
※ 에러처리를 이용한 file open 상태 확인
Function FileCheck(FileName As String) As Boolean Dim Wb As Workbook Dim Chk As Boolean Chk = False On Error Resume Next Set Wb = Workbooks(FileName) If Err.Number = 0 Then FileCheck = True ' 파일이 open되지 않아 set 수행안되면 에러발생되어 True반환 On Error GoTo 0 End Function Sub aaa() If FileCheck("재무재표.xlsx") Then MsgBox ("File is Open") Else MsgBox ("File is not Open") End If End Sub |
[참조] Try ~ Expect ~ Finally 구현 (레이블이용 : Keyword이용 아님) Sub 예러처리() Try: On Error GoTo Except Cells.SpecialCells(xlFormulas, xlNumbers).Select GoTo Finally Except: MsgBox "Error" & Err & " : " & Error(Err) Finally: ' 무조건 실행되는 코드 End Sub |
'VBA' 카테고리의 다른 글
[Excel][VBA] Range개체 참조하기 (0) | 2021.11.20 |
---|---|
[Excel][VBA] VBA 기초 다지기 (0) | 2021.11.20 |
[Excel][VBA] 이름 정의 (0) | 2021.11.20 |
[Excel][VBA] 중복데이터 추출 (0) | 2021.11.17 |
InputBox를 이용하여 입력된 데이터 split하여 배열로 만들기 (0) | 2021.11.16 |
- Total
- Today
- Yesterday
- 배열
- 함수 프로시저
- function함수 예외
- 강제 재계산
- 사용자 정의 함수 재계산
- ProtectStructure
- 프로시저 호출
- 워크시트 함수 재계산
- Application.InputBox
- 함수 재계산
- 사용자 정의 함수 사용 예
- Screenupdating
- Option Compare Text
- vba
- 개체
- Excel
- 차트 레이블 추가
- WorkSheet Sort
- 참조
- 프로시저 작성 실전
- 적용 범위
- inputbox
- EnableCancelKey
- for each
- comment.text
- bubble sort
- 차트 서식변경
- Function Procesure
- 사용자 정의 함수
- 원본 데이터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |