본문 바로가기

코딩/엑셀,VBA

[엑셀/VBA] Option Explicit(명시적 선언 사용하기)

반응형

 

  엑셀 VBA에는 option Explicit(명시적 선언)이라는 구문이 있다. 요약해서 설명하자면, 다른 프로그래밍 언어와 마찬가지로 변수를 사용하려면 변수명이 무엇인지, 변수의 타입이 무엇인지에 대한 정의가 있어야 한다. 이를 '변수 선언'이라한다. 엑셀 VBA에서 option Explicit(명시적 선언 구문)을 작성해주면 사용하는 변수에 대해서는 모두 타입이 정의되어있어야 한다.

 

  이를 설명하기 위해 엑셀의 묵시적 선언과 명시적 선언을 먼저 이해해보도록 하자.

 

 

1. Implicit declaration(묵시적 선언 : 변수 선언을 하지 않는 경우)

 

 

  예시를 보며 이해해보자. 먼저 명시적 선언 구문이 없을 때 어떤 식으로 변수에 값이 저장되는지 확인해보도록 하겠다. 아래 코드는 a라는 변수에 100을 저장하고 메시지박스로 a를 출력하는 구문이다.

 

 

<코드>

Sub test()

 a = 100
 MsgBox a 
 

End Sub

 

<결과>

 

 

  위 코드에서 'a = 100'이라는 부분이 변수 선언일까?? 아니다. a라는 변수에 100이라는 값을 저장하긴 하지만 a라는 변수를 선언한 것은 아니다. 이를 Implicit declaration(묵시적 선언)이라고 한다.

 

  VBA에서 a라는 변수를 정수 타입으로 선언하는 방법은 'Dim a as integer' 코드로 작성해야 한다. 하지만, 위 코드에는 이 변수 선언 부분이 없다. 디버깅을 통해 a의 형식을 확인해보자.(아래 이미지) 

 

 

< Variant/Integer >

 

 

  a의 형식을 확인해보면 'Variant'라는 부분으로 정의되어 있다. 'Variant'는 변수의 타입과 관계없이 모든 데이터를 저장할 수 있다. a의 값을 a=100이 아닌 a="test"라는 문자열로 변경하여 출력해보면 아래와 같이 Variant/String으로 변경된 것을 확인할 수 있다.

 

 

< Variant/String >

 

 

 

2. Explicit declaration(명시적 선언 : 변수 선언을 하는 경우)

 

 

  그럼 이번엔 a라는 변수를 정수 타입으로 선언해보도록 하겠다. 아래 코드와 같이 'Dim a as integer'라는 코드를 추가할 것이다.

 

 

<코드>

Sub test()
 Dim a As Integer #정수타입 변수 선언
 a = 100
 MsgBox a
 

End Sub

 

 

  결과는 위와 동일하므로 생략하고 디버깅 모드에서 a의 형식이 어떻게 되는지 확인해볼 것이다.(아래 이미지)

 

 

< Integer >

 

 

  결과를 확인해보면 위 변수 선언이 없는 경우와 형식의 차이가 있다. 변수 선언이 없을 경우에는 Variant/Integer로 표기가 됐지만 지금은 Integer로만 표기되어 있다. 차이는 Variant는 a라는 변수에 들어가는 값에 따라 달라지는 형태지만 Integer로만 표기되어 있다면 a에는 정수 타입의 값만 입력될 수 있다.

 

  테스트를 위해 위 코드에서 a = "test"로 바꾸어 출력해보면 아래와 같이 '13' 런타임 오류가 발생한다. 에러의 이유는 a가 정수타입으로 선언이 되었는데 문자열 데이터를 저장하려고 했기 때문이다.

 

 

'13' 런타임 에러

 

 

 

3. Option Explicit 구문(무조건 명시적 선언)

 

 

  엑셀 VBA에서 명시적 선언이란 해당 코드에서 사용하는 변수라면 모든지 변수 선언을 해야된다는 구문이다. 1번에 변수선언을 하지 않을 경우의 코드에 option Explicit라는 구문을 코드 상단에 추가해보았다.

 

 

<코드>

Option Explicit #명시적 선언

Sub test()

 a = 100
 MsgBox a
 

End Sub

 

<결과>

< 명시적 선언 후, 변수 선언을 하지 않을시 >

 

 

  위 코드를 실행해보면 결과 이미지와 같이 컴파일 오류가 발생한다. 사용하는 변수가 정의되지 않았기 때문이다. 따라서, Option Explicit(명시적 선언) 구문을 사용한 코드라면 무조건 Dim a as integer라는 변수 선언이 들어가야 정상적으로 동작한다.

 

 

<코드>

Option Explicit #명시적 선언

Sub test()
 Dim a As Integer
 a = 100
 MsgBox a
 

End Sub

 

 

  명시적 선언을 사용하는 이유는 복잡한 프로그램을 만들 때, 코드를 정확하게 작성하기 위한 것이다. 코드가 많아지면 변수 데이터가 꼬일 확률이 높은데 명시적 선언이 되어있지 않으면 어떤 부분에서 문제가 되는지 찾기 어렵다. 따라서, 간단한 프로그램이야 암시적 선언으로 해결할 수 있지만, 복잡한 프로그램을 만들 때는 명시적 선언을 꼭 활용하도록 하자.

728x90