Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

VBA

[VBA 입문] 10강. 연산자, 변수와 상수

권현욱(엑셀러) 2023. 10. 3. 08:00
반응형

들어가며

우리는 생활하면서 알게 모르게 '변수'나 '상수'라는 말을 하곤 합니다. 예를 들면 이런 식이죠.

"내년 경기는 외생 변수가 많아서 예측하기 어려워."
"국제유가는 이제 변수가 아니라 상수라고 생각하고 경영 계획을 세워야 해."

변수라는 개념이 없으면 프로그래밍을 할 수 없다고 해도 과언이 아닐 정도로 많이 사용되고 중요합니다. 상수와 변수를 배우기 전에 워밍업으로 연산자를 잠깐 둘러보겠습니다. 출발합니다.


연산자

거의 모든 프로그래밍 언어에는 연산자 개념이 있습니다. 연산자(operator)는 코딩을 할 때 '변수나 값의 연산을 위해 사용되는 부호'를 말합니다. VBA의 연산자에는 크게 4가지 종류가 있습니다.

1. 산술 연산자: 기본적인 산술 계산을 할 때 사용

연산자 의미
+ 합을 구한다
- 차를 구한다
* 곱을 구한다
/ 두 수를 나누고 결과를 반환한다(부동 소수점 형태)
\(역슬래시) 두 수를 나누고 결과를 반환한다(정수 형태)
Mod 나눗셈을 하고 나머지를 반환한다
^ 제곱을 구한다

2. 비교 연산자: 조건절에서 조건 비교를 할 때 사용

연산자 의미
> 크다(초과)
>= 크거나 같다(이상)
< 작다(미만)
<= 작거나 같다(이하)
= 같다
<> 다르다(같지 않다)

3. 논리 연산자: 조건절에서 조건을 연결할 때 사용

연산자 의미
AND 논리곱을 구한다(그리고)
OR 논리합을 구한다(또는)
NOT 논리의 부정을 구한다
EQV 논리 등가 연산을 한다
IMP 논리 포함 연산을 한다
XOR 배타적 논리합을 구한다

4. 문자열 연결 연산자: 문자열을 결합(연결)할 때 사용

연산자 의미
& 문자열과 문자열을 연결한다

5. 연산자들 간의 계산 순서

산수 시간에 기본적인 연산 순서에 대해 배웠습니다. '1 + 2 * 3'이라는 수식이 있을 경우, 곱셉을 먼저 계산하고, 거기에 1을 더하므로 결괏값은 7입니다. 앞에서 소개한 연산자들도 마찬가지입니다. 만약 수식의 결괏값이 엉뚱하게 나왔다면 연산 순서에 문제가 있는 것이므로 잘 확인해 보세요.

연산자는 산술 - 문자열 연결 - 비교 - 논리 연산자 순서로 연산됩니다. 같은 산술 연산자 중에서는 *와 /는 +와 -보다 높은 우선순위를 갖습니다. 그리고 수식을 괄호로 묶으면 그 부분이 먼저 계산됩니다.  대체로 일반 상식의 범위를 벗어나지 않습니다.


상수

상수(constants)는 '변하지 않는 값'을 뜻합니다. VBA에서 상수는 'Const'라는 접두어를 붙여서 아래와 같이 사용합니다. Const는 Constant의 줄일말입니다.

사용 예 설명
Const RATE = 0.15 0.15를 RATE라는 상수에 대입
Const COMPANYNAME = "아이엑셀러닷컴" '아이엑셀러닷컴'이라는 문자열을 COMPANYNAME에 대입
Const BIRTH_DAY As Date = #1/1/2000# 시간이나 날짜는 # 부호 사용. 따옴표(" ") 안에 작성하더라도 영특한 VBA 엔진이 알아서 자동으로 날짜로 처리

꼭 그렇게 해야 한다고 어디 헌법 같은 데 나오는 것은 아니지만, 상수는 보통 대문자로 표기하곤 합니다. 한눈에 변수와 구분할 수 있기 때문입니다.

상수를 선언할 때, 데이터 타입을 지정할 수도 있고(세 번째 예) 그렇게 하지 않을 수도 있습니다. 데이터 타입을 지정하지 않으면 할당(assign)된 값을 통해 결정됩니다. 데이터 타입에 대해서는 변수를 소개할 때 자세히 다룹니다.

상수 중에는 선언하지 않고 사용할 수 있는 것이 있는데 이것을 내장 상수(Predefined Constant)라고 부릅니다. 다음 코드를 실행하고 워크시트로 가서 [파일] - [인쇄]를 선택해 보세요. 워크시트의 방향이 가로 방향으로 설정되어 있을 겁니다.

Sub setPageToLandscape()
    ActiveSheet.PageSetup.Orientation = xlLandscape
End Sub

여기서 xlLandscape가 내장 상수입니다. 참고로, 세로 방향으로 설정하려면 xlPortrait으로 지정합니다. 이것 말고도 엑셀(VBA)에는 많은 내장 상수가 준비되어 있습니다.


변수

변수(variables)는 '변하는 값'이라는 뜻입니다. 프로그래밍에서 변수의 역할은 매우 중요합니다.

컴퓨터에서는 수많은 정보들이 수시로 이러저리 옮겨 다닙니다. 정보를 어딘가에 보관해 두고 있어야 값을 다시 불러오든, 계산을 하든 해도 하겠죠? '각종 정보를 보관하고 있는 컴퓨터 메모리 상의 저장 공간'이 바로 변수입니다. 

꼭 그래야 하는 것은 아니지만, VBA에서는 변수를 사용하기 전에 '선언'을 하는 경우가 일반적이며, 다음과 같은 형식을 사용합니다.

[형식] 키워드 변수이름 As 변수타입
[예시] Dim i As Integer

키워드 Dim은 변수를 선언할 때 사용하며, Dimension의 줄임말입니다. 변수이름 사용자가 지정하며, 한 프로시저에서는 같은 변수명을 사용할 수 없습니다. 변수타입은 변수에 담길 데이터 크기를 고려하여 적합한 유형을 지정하면 됩니다. 이와 관련해서는 바로 이어서 설명합니다.


변수의 종류와 크기

아주 간단한 예제를 하나 보죠. 워크시트 A1:A3 셀에 10, 20, 30을 각각 입력하고 다음 코드를 실행해 보세요.

Sub 합계구하기()
    ''' 변수 선언
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    
    ''' A1:A3 셀 값을 변수 i, j, k에 저장
    i = Range("A1")
    j = Range("A2")
    k = Range("A3")
    
    ''' 메시지 상자에 결과(합계) 표시
    MsgBox "합계: " & i + j + k
End Sub

프로시저명을 한글로 지정할 수도 있습니다. 숫자로 시작하거나 중간에 공백이 올 수 없습니다. 짐작하시는 대로, 위 프로시저를 실행한 결과는 600입니다.

A1 셀 값을 아주 큰 캆(100000 정도)을 입력하고 다시 프로시저를 실행해 보세요. '오버 플로(Overflow)' 오류 메시자가 나타납니다. '준비한 그릇(변수) 크기보다 큰 값이 들어오니까 흘러넘쳐서 나타나는 오류'입니다.

변수를 흔히 '그릇'에 비유하곤 합니다. 여러분 집 주방에 있는 그릇을 떠올려 보세요. 모양과 크기가 서로 다른 여러 종류의 그릇이 있을 겁니다. 쓰임새에 따라 크기가 정해져 있죠. 간장 종지에 라면을 끓이려다 보니 '오버 플로'가 발생한 상황입니다.

이번에는 코드를 Dim i As Integer에서 Integer(정수형) 대신 아래와 같이 수정하고 다시 실행해 보세요. 이제는 어지간히 큰 값을 넣어도 제대로 계산됩니다.

Dim i As Double

모든 변수는 용도에 맞는 타입을 가질 수 있습니다. 숫자값을 담을 수 있는 변수가 있고, 문자열을 받을 수 있는 변수가 있고, 날짜값을 담기 위한 변수도 있습니다. 주요 변수 종류와 저장할 수 있는 값의 범위는 다음 표를 참고하세요. 외울 필요도 없고, 복잡하다고 스트레스받을 필요도 없습니다. 말 그대로 '참고'만 하는 겁니다.

변수 타입 크기 저장 가능한 값의 범위
Byte 1바이트 0 ~ 255
Boolean 2바이트 True 또는 False
Integer 2바이트 -32,768 ~ 32,767
Long 4바이트 -2,147,483,648 ~ 2,147,483,647
Single 4바이트 -3.402823E38 ~ -1.401298E-45(음수값)
1.401298E-15 ~ 3.402823E38(양수값)
Double 8바이크 -1.79769313486232E308 ~ -4.94065645841247E-324(음수값)
4.94065645841247E-324 ~ 1.79769313486232E308(양수값)
Currentcy 8바이트 -922,337,203,685,477.5808 ~ 922,337,203,685,477.6807
Date 8바이트 100년 1월 1일 ~ 9999년 12월 31일
Object 4바이트 모든 개체 변수
String 문자열 길이 최대 65,635 바이트
Variant(숫자) 16바이트 Double형 범위 내의 모든 숫자
Variant(문자) 22바이트+문자열 길이 String형 변수와 같음

 이 시점에서 이런 의문이 듭니다.

그렇다면 처음부터 큰 변수 타입을 쓰면 될 텐데, 왜 작은 변수 타입을 쓰나요?

좋은 질문입니다!

컵라면 먹을 물을 끓이는 데 가마솥을 걸어놓고 끓이는 경우는 없겠지요? 또 간장을 담으려면 간장 종지면 되는데 큰 뚝배기를 사용하지도 않을 테고요. 변수의 크기가 크다는 건 그만큼 메모리를 많이 차지한다는 뜻이며, 그것은 곧 비용이나 효율과 직결됩니다.

메모리를 이렇게 알뜰하게 사용하는 것은 호랑이 담배 피던 시절의 습관에서 비롯됩니다. 오래전 IBM PC에는 메모리 제한이 있었습니다. 요즘 기준에서 보면 터무니없이 작은 용량(640KB)으로 컴퓨팅을 해야 했습니다. 그러다 보니 메모리 절약을 하지 않을 수가 없었죠(자세한 내용은 '640KB 메모리 한계'로 검색).

변수 타입과 관련해서는 숫자/문자열/개체 변수 여부 정도만 구분할 줄 알면 됩니다. 나머지 사항은 코딩을 하면서 상황에 따라 대처하면 됩니다.


변수 선언 팁

변수를 선언할 때에는 자신만의 규칙을 정해두면 편리합니다.Dim X, Dim Y 등과 같이 변수명을 지정하는 것은 그다지 바람직하지 않습니다. 당장은 짧고 편한 것 같지만 몇 달쯤 지난 다음에 소스 코드를 보면 헷갈릴 소지가 다분합니다. 프로그래밍 세계에서는 6개월만 지나면 자기 자신도 남입니다.

어떤 이름을 저장하는 변수라면 sUserName과 같이 사용하면 편리합니다. s는 string(문자열) 타입을 뜻합니다. 나이를 저장할 변수라면 iAge라고 변수명을 선언해 두면 '나이를 뜻하는 정수형(integer) 변수겠구나'하고 개략적으로 유추할 수 있죠.

"우와~ 정말 기발해요. 엑셀러 님은 아마도 천재인가 봐요!"

이런 탄성이 들려오는 듯합니다. 하지만 이런 방식은 제가 고안한 것이 아닙니다. '헝가리언 표기법'이라고 하며, 엑셀과 워드 개발의 아버지라 불리는 찰스 시모니가 사용한 방법으로 알려져 있습니다.


추가 공부 거리 추천

이상으로, 변수와 상수, 연산자에 대해 꼭 알고 있어야 할 부분을 짚어 보았습니다. 시간이 지나 기본기에 익숙해지고, 여력이 생기면 다음 사항들에 대해서도 '아이엑셀러 닷컴'이나 인터넷 검색을 통해 정리해 두실 것을 추천합니다. 

  • 동적 변수, 정적 변수
  • 배열 변수
  • 정적 배열, 동적 배열
  • 사용자 정의 변수

나가며

이로써 우리는 변수와 상수의 기본기를 터득하게 되었습니다. 이제 여러분은 '합계구하기' 프로시저에 있는 여러 가지 연산자들을 바꿔가면서 연습할 수 있고, 오류에도 대처할 수 있는 힘이 생겼습니다. 여기까지 오신 것, 축하합니다.