Sub 변수덧셈1()
Dim a As Integer, b As Integer, c As Integer, d As Integer, sum As Integer
a = 10
b = 20
c = 30
d = 40
sum = a + b + c + d
MsgBox (sum)
End Sub
'위와 소스코드가 100% 동일하지만 매크로명은 변수덧셈2
Sub 변수덧셈2()
Dim a As Integer, b As Integer, c As Integer, d As Integer, sum As Integer
a = 50
b = 60
c = 70
d = 80
sum = a + b + c + d
MsgBox (sum)
End sub위와 같이 소스코드가 100% 동일한 것이, 매크로명 이름만 서로 다릅니다.
그런데 각 매크로에 정의되어 있는 변수명 a, b, c, d 는 동일합니다.--> 문제가 있는건가요?
변수덧셈1 에 있는 변수명 a, b, c, d
변수덧셈2 에 있는 변수명 a, b, c, d 이렇게 같아요.
저는 매크로명이 다르니까, 그 안에 정의되어 있는 변수명 a, b, c, d 를 굳이 이름을 바꿀 필요가 없다고 생각했어요.
만약 이게 문제라면 컴파일단계에서 오류가나고 ms 에서도 그렇게 오류메세지 내놓게 만들엇겟죠.
근데 컴파일오류없고 살행도 정확하개 되요.
근데 아무래도 이것때문에 계산 오류가 난다는 생각이 들거든요. 증거는 못잡았지만요. 증거를 못잡은 이유는 99번 맞다가 1번정도 계산오류가 잇다고 생각이 되서요.
이렇게 변수명이 같아도 매크로명이 다르므로 괜찮은건지?
아니면 변수명은 꼭 다르게 해야 하는건지 여쭙니다.
- 단순히 [ 서로 다르게 하는게 낫지 않겠습니까? ] 라는 답변보다는, 확실히 문제가 있는건지 알려주시면 감사드리겠습니다.

결론부터 말씀드리면, 전혀 문제없습니다.
두 매크로 안의 변수명이 같아도 서로에게 아무런 영향을 주지 않습니다. 질문자님의 생각이 100% 맞습니다.
## 왜 문제가 없을까요? (변수의 유효 범위)
이유는 변수의 유효 범위(Scope) 때문입니다. VBA에서
Sub프로시저 내부에Dim으로 선언된 변수는 **지역 변수(Local Variable)**라고 합니다.지역 변수의 특징:
오직 자신이 선언된
Sub또는Function안에서만 살아있습니다.매크로가 시작될 때(
Sub 변수덧셈1()실행 시) 메모리에 생성되었다가, 매크로가 끝나면(End Sub를 만나면) 메모리에서 완전히 사라집니다.이를 교실에 비유해 보겠습니다.
변수덧셈1은 '1반 교실'이고,변수덧셈2는 '2반 교실'입니다.1반 교실의 '철수'(
변수덧셈1의 변수a)와 2반 교실의 '철수'(변수덧셈2의 변수a)는 이름만 같을 뿐, 완전히 다른 학생입니다.1반 담임선생님이 "철수야!" 하고 부르면 1반의 철수만 대답할 뿐, 2반의 철수에게는 아무런 영향이 없습니다.
따라서
변수덧셈1이 실행될 때의a,b,c,d와변수덧셈2가 실행될 때의a,b,c,d는 이름만 같을 뿐, 컴퓨터 메모리상에서는 완전히 별개의 공간을 사용하는 전혀 다른 변수입니다.## 그렇다면 '가끔 발생하는 계산 오류'의 원인은 무엇일까요?
말씀하신 "99번은 맞다가 1번 정도 계산 오류가 있다"는 현상은 변수명이 같아서 발생하는 문제는 아닐 확률이 매우 높습니다. 만약 변수명 충돌이 문제였다면, 실행할 때마다 일관되게 오류가 발생했을 것입니다.
간헐적인 오류가 발생한다면, 다음과 같은 다른 원인을 의심해 보시는 것이 좋습니다.
데이터 타입(Type) 문제:
Integer는 -32,768 ~ 32,767 범위의 숫자만 담을 수 있습니다. 만약 변수들의 합(sum)이 이 범위를 넘어가는 경우가 아주 가끔 생긴다면, 오버플로(Overflow) 오류가 발생합니다.해결책: 더 큰 숫자를 다룰 수 있는
Long타입으로 변수를 선언하는 것이 훨씬 안전하고 일반적입니다.VB.Net
Dim a AsLong, b AsLong, c AsLong, d AsLong, sum AsLong외부 데이터 문제: 매크로가 엑셀 시트의 특정 셀 값을 참조하여 계산하는 경우(
a = Range("A1").Value등), 해당 셀에 가끔씩 숫자 대신 문자(텍스트)가 입력되어 있거나, 예상치 못한 값이 들어가 있을 때 계산 오류가 발생할 수 있습니다.전역 변수(Public Variable)의 영향: 만약
Sub외부, 모듈의 최상단에Public a As Integer와 같이 변수를 선언했다면, 이는 모든 매크로가 공유하는 전역 변수가 됩니다. 이런 경우라면 하나의 매크로에서 값을 바꾼 것이 다른 매크로에 영향을 줄 수 있습니다. 하지만 현재 보여주신 코드에는 전역 변수가 없으므로 해당 사항이 아닙니다.## 최종 요약
결론: 매크로 이름이 다르면, 그 안에 있는 지역 변수들의 이름이 같아도 아무런 문제가 없습니다. 서로 다른 매크로의 변수는 완전히 독립적입니다.
권장 사항: 변수명을 굳이
a1, b1, a2, b2등으로 바꿀 필요가 전혀 없습니다.오류 추정: 간헐적인 계산 오류는 변수명 문제가 아닌, 데이터 타입(
Integer의 범위 초과)이나 외부 셀 값의 문제일 가능성이 높습니다. 변수 타입을Long으로 바꿔서 테스트해 보시는 것을 강력히 추천합니다.-----------------------------------------------------------------------------------------------------------------------
이렇다고 합니다. 도움이 됐으면 좋겠습니다.
만약 덧셈1 매크로의 결과를 덧셈2에서 사용하려고 할 때, 공통 변수를 선언해서 사용하시면 됩니다.
각 프로시저 안에서 선언한 변수는 로컬변수로 해당 프로시저 안에서만 유효합니다.
만약 공통으로 선언한 공통변수와 로컬변수 이름이 동일하게 사용하면, 로컬 변수가 사용됩니다.
즉, 충분히 검토되지 않으면 엉뚱한 데이터가 전달되거나 전달이 안되어 문제가 발생할 수 있습니다.
그래서 이런 오류를 피하고자, 공통변수에 특별한 규칙을 적용해서 이름만 봐도 공통변수인지 알 수 있게 하는 것도 방법입니다.
그리고 모듈을 여러개 만들어 사용하면
첫머리에 선언하는 공통변수가 Dim이나 Private로 선언하면 해당 모듈에서만 공통으로 사용할 수 있습니다.
이런 저런 변수에 대해서 가능한 오류를 줄이려면 모듈 첫 머리에
Option Explicit 으로 변수가 반드시 선언되어야 한다는 옵션을 주시는 게 좋습니다.
변수를 사용하기 전에 값을 지정하고 연산을 하기때문에 타입만 문제없다면 오류가 있을 수가 없죠.