<엑셀VBA 입문 17강> 변수를 같은 이름으로 사용하면 섞일까? (지역변수와 전역변수)

<엑셀VBA 입문 17강> 변수를 같은 이름으로 사용하면 섞일까? (지역변수와 전역변수)

서로 다른 함수에서 동일한 이름의 변수를 사용할 때 어떻게 될까요?

어떤 분이 질문해주셔서 써봅니다.

프로그래밍에서는 각각의 함수 안에서만 사용하는 변수를 [지역변수] 라고 합니다.

여러 함수가 공통으로 사용하는 변수를 [전역변수] 라고 합니다.

이는 <변수를 어디에 선언하느냐>에 따라 결정되는데요.

Function 블록 (Function ~ End Function) 안쪽에 [Dim 변수명]이 존재한다면 지역변수(함수마다 달리 사용)가 됩니다.

함수 바깥쪽(소스코드 최상단)에 Dim 변수명이 존재한다면 전역변수(여러 함수 공통으로 사용)가 됩니다.

1. 지역변수 예제

지역변수 예제는 다음과 같습니다.

Func1 함수와 Func2 함수를 차례로 호출하는 매크로입니다.

Sub Macro1()

‘ Macro1 Macro

‘ 바로 가기 키: Ctrl+k

Call Func1
Call Func2

End Sub

‘——————–

Function Func1()

‘함수 안쪽에 변수 선언
Dim aa

aa = aa + 1
MsgBox (“첫번째 값 : ” & aa)

aa = aa + 1
MsgBox (“두번째 값 : ” & aa)

End Function

‘——————–

Function Func2()

‘함수 안쪽에 변수 선언
Dim aa

aa = aa + 1
MsgBox (“세번째 값 : ” & aa)

aa = aa + 1
MsgBox (“네번째 값 : ” & aa)

End Function

위 매크로의 실행결과는 1, 2, 1, 2 순으로 메시지가 표시되게 됩니다.

 

함수마다 Dim aa 로 변수를 새로 설정해줬으므로, 함수 안에서 사용하고, 함수가 종료되면서 해당 변수는 버려지게 됩니다.

일회용이라고 생각하시면 될듯 합니다.

결과적으로 다시 실행해도 1, 2, 1, 2 가 표시됩니다.

2. 전역변수 예제

다음으로 전역변수의 예입니다.

지역변수 예제를 기본으로 하지만, 이번에는 함수 바깥쪽(최상단)에 변수를 선언해보겠습니다.

‘함수 바깥쪽(최상단)에 변수 선언. 즉, 전역변수로 선언.
Dim aa


Sub Macro1()

‘ Macro1 Macro

‘ 바로 가기 키: Ctrl+k

Call Func1
Call Func2

End Sub

‘——————– 

Function Func1()

aa = aa + 1
MsgBox (“첫번째 값 : ” & aa)

aa = aa + 1
MsgBox (“두번째 값 : ” & aa)

End Function

‘——————– 

Function Func2()

aa = aa + 1
MsgBox (“세번째 값 : ” & aa)

aa = aa + 1
MsgBox (“네번째 값 : ” & aa)

End Function

이번 매크로의 실행결과는 1, 2, 3, 4 순으로 메시지가 표시되게 됩니다.

최상단에 선언된 Dim aa 를 여러 함수가 공유하고 있습니다. 또한 함수가 종료되어도 해당 변수는 버려지지 않고 보존됩니다.

결과적으로 처음 실행하면 1, 2, 3, 4 가 표시되고,

다시 실행하면 5, 6, 7, 8 이 표시되고,

또 다시 실행하면 9, 10, 11, 12 가 표시됩니다.

3. 지역변수와 전역변수의 혼용(같이 사용)

별로 추천하지 않는 방법이지만, 지역변수와 전역변수를 같이 사용할 수 있습니다.

예를 들면, Func1 함수는 전역변수를 사용하고, Func2 함수는 지역변수를 사용할 수 있습니다.

예제코드는 아래와 같습니다.

‘함수 바깥쪽(최상단)에 변수 선언. 즉, 전역변수로 선언.
Dim aa


Sub Macro1()

‘ Macro1 Macro

‘ 바로 가기 키: Ctrl+k

Call Func1
Call Func2

End Sub

‘——————– 

Function Func1()

aa = aa + 1
MsgBox (“첫번째 값 : ” & aa)

aa = aa + 1
MsgBox (“두번째 값 : ” & aa)

End Function

‘——————– 

Function Func2()

‘Func2 함수만 함수 안쪽에 변수 선언. 즉, 지역변수로 선언.
Dim aa

 

aa = aa + 1
MsgBox (“세번째 값 : ” & aa)

aa = aa + 1
MsgBox (“네번째 값 : ” & aa)

End Function

이번 매크로의 실행결과는 1, 2, 1, 2 순으로 메시지가 표시되게 됩니다.

다시 실행하면 3, 4, 1, 2 가 표시되고,

또 다시 실행하면 5, 6, 1, 2 가 표시됩니다.

4. VBA 변수 선언시 주의사항

VB/VBA 는 사실 변수를 선언하지 않아도([Dim 변수명] 코드를 쓰지 않아도) 변수를 사용할 수 있습니다.

다른 프로그래밍 언어와의 차이점입니다.

(예를 들어, C, C++, JAVA 에서는 변수 선언 없이 변수를 사용하면 오류가 발생합니다.)

VBA 에서는 변수 선언 없이 변수를 쓰면 그냥 지역변수로 인식됩니다.

하지만 이 방법은 권장하지 않습니다.

처음에 변수를 선언하지 않고 사용했을 때는 자동으로 지역변수로 처리되니 편하고 좋은데,

오랜 시간이 지나 이 사실을 깜빡하고 이미 사용했던 변수명을 전역변수로 선언한다면,

지금까지 지역변수로 동작했던 변수들이 전역변수화 되면서 생각하지 못한 버그가 발생하게 됩니다.

그러므로 지역변수를 꼭 [Dim 변수명]으로 선언 후 사용해주시기 바랍니다.

이어지는 글 <엑셀VBA 입문 18강> indexOf 함수의 확장 https://blog.naver.com/bb_/221650929713