배움터  
  HOME > 배움터 > 무료강좌
무료강좌
 
엑셀 2000, 황기성님의 엑셀VBA 10일, Excel 2000


10일. 늘 푸른 소나무에 관한 세번째 이야기

▶ 오늘 배울 내용

코드 작성을 위한 몇 가지 시시콜콜한 이야기 - 변수에 대한 명상 하나 : 적재적소(適材適所)

앞서, 변수는 여러분이 VBA를 이용해 프로그래밍하는 데에 반드시 넘어야 할 산과 같습니다. 여러분과 함께 그 산을 이제 넘어 보도록 하겠습니다라는 말씀을 드렸습니다. 그러나, 미리 말씀드리지만, 그 산은 높지 않답니다. 야트막하지만 볼거리도 심심치 않게 있답니다. 그러니, 소풍을 가는 셈 치시고 따라 오세요. 그래, 늘 푸른 소나무란 조금 엉뚱한 제목이지요^^*

변수(變數 Variable) :  변수란 말 그대로 변하는 것입니다. 이 변화무쌍한 변수는 프로그래밍을 하는 데 있어 아주 중요한 역할을 합니다. 변수란 컴퓨터가 정보를 저장하고 검색하기 위한 메모리 상의 공간을 가리킨다고 이해하는 것이 좋습니다. 예를 들어, 하나의 건물이 있는데, 그 건물은 크고 작은 방들로 이루어져 있으며, 각 방들은 고유한 이름을 가지고 있다고 상상해 보십시오. 여러분은 그곳에 하나의 방을 얻어 사용하게 될 것입니다. 때에 따라서는 많은 작업을 하기 위해 여러 개의 방을 빌려야 할 때도 있을 것입니다. 물론 방을 얻는 데 드는 비용은 이미 컴퓨터를 살 때 지불하셨으므로 아무 염려마시고 쓰셔도 된답니다. 하지만 방이 100개인 호텔에서 이미 여러 사람들이 50개 방을 빌려 들어와 쓰고 있는데, 50개 이상의 방을 요구하다면 어떻게 될까요? 여러분의 충직한 컴퓨터는 주인인 여러분의 요구를 들어주기 위해 애쓰다가 과로로 쓰러질 것입니다^^* 더불어, 이미 방을 쓰고 있는 손님들을 내쫓아야 한다면 여러분이 운영하는 호텔의 이미지는 나빠질 수도 있을 것입니다. 지금은 상상하기 힘드시겠지만, 가끔 이런 종류의 문제로 고민하게 되는 때도 있으실 것입니다. 너무 힘든 일은 사람이나 컴퓨터 모두에게 좋지 않은 법입니다.

변수는 선언해야 합니다 : 선언이라니...삼일 운동 때 독립만세를 외치던 감격적인 장면을 혹 떠올리시는 분이 있을 듯도 싶습니다. 변수를 선언한다는 것은, 프로그래머가 컴퓨터에게 기억장치의 일부를 자신의 영토로 삼겠다는 것을 통보하는 것과 마찬가지입니다. 위에서 말씀드렸듯이 변수란 하나의 방과 같습니다. 변수란 메모리 - 기억장치의 일부분을 할당받아 사용하는 것이며, 변수를 선언함으로써 이 방의 일부를 확보하는 것이지요. 그런데 변수란 어떻게 선언해야 하는 것일까요?

명시적 선언과 암시적 선언 Baic언어에서 변수를 선언하는 방법에는 명시적인 방법(explicit declaration)과 암시적인 방법(implicit declaration)이 있습니다. 명시적인 방법은 말 그대로 VBA에게 뚜렷하게 지금부터 변수를 사용하겠다고 선언하는 것을 가리킵니다. 암시적이란 이와 반대로, 선언이라고 했습니다만, 사실은 선언하지 않고 그냥 사용하는 것이 암시적인 방법입니다. 이것은 베이직 언어의 오래된 전통에 따른 것이지만 일반적으로 권장되지는 않는 방법입니다.

명시적 선언의 경우 : 변수를 명시적으로 선언하는 가장 흔한 방법은 Dim이란 키워드를 이용해 변수를 선언하는 것입니다.

위에 도시한 바와 같이, 명시적으로 변수를 선언한다는 것은 Dim 혹은 Static, Private, Public과 같은 키워드와 함께 변수이름을 선언하는 것을 말합니다. 선언의 형식은 크게 네 부분으로 이루어져 있으며, 앞의 둘은 변수를 명시적으로 선언하기 위해 필수로 요청되는 것이고, 뒤의 둘은 선택적입니다(하지만, 이 부분도 반드시 설정하는 습관을 가지시는 것이 좋습니다)

Dim이란 Dimension(차원)의 약자로 오래된 베이직에서는 배열을 선언할 때 사용하던 키워드입니다(물론 지금도 배열을 선언할 때 마찬가지로 사용합니다) 키워드란 흔히 예약어라고 불리우는 것으로, VBA에서 사용하기 위해 미리 정의해둔 언어들이라고 할 수 있습니다. 따라서 이런 키워들은 사용자가 임의로 사용할 수 없으며 정해진 규칙에 따라 사용해야만 하는 것들입니다. 우리는 미리 약속된 언어인 Dim이란 키워드를 사용해 VBA에게 이제 변수를 선언할 테니, 거기에 합당한 메모리 공간을 확보하라고 요구할 수 있는 것입니다.  아래의 예제는 변수라는 이름의 변수를 가변길이문자형 데이터로 선언한 예입니다.

Sub 변수선언예제()

   Dim 변수 As String
      변수 = "변수라는 이름의 변수를 선언했다"
         MsgBox 변수
      변수 = "이제 변수는 더이상 변수가 아니다"
         MsgBox 변수
      변수 = "문자열과 변수를 혼동하면 곤란하다"
         MsgBox "변수", vbOKOnly, 변수
End Sub

주의하셔야 할 점은 여러분이 프로그래밍 상에서 사용할 문자열들은 모두 쌍따옴표(")로 묶어 주셔야 한다는 것입니다(엑셀에서 함수를 많이 사용해보신 분들이라면 쉽게 이해하실 수 있을 내용입니다)

위의 예제는 변수라는 이름의 변수를 선언한 뒤, 여기에

"변수라는 이름의 변수를 선언했다"
"이제 변수는 더이상 변수가 아니다"
"문자열과 변수를 혼동하면 곤란하다"
과 같은 문자열을 대입해 사용한 것입니다. 즉, 변수란 기억 공간에 각기 다른 데이터들 차례로 보관해 사용한 것이라 할 수 있습니다. 변수란 이름에 걸맞게 그 값들이 차례로 변할 수 있음에 주목하십시오. 아울러 "변수라는 이름의 변수를 선언했다"와 같은 데이터는 그 유형이 문자열이므로 변수의 유형을 문자형String으로 선언해 준 것입니다.

암시적 선언의 경우 : 변수를 암시적으로 선언하는 것은 Dim과 같은 키워드를 사용해 변수공간을 미리 확보하지 않고, 필요할 때마다 즉시 공간을 요구하는 경우라고 할 수 있습니다. 아래의 예제는 위의 예제와 거의 같으며, 같은 결과를 되돌립니다. 다른 점은 Dim이란 키워드를 사용해 변수를 명시적으로 선언하지 않았다는 점이고 이 때문에 코드가 더 짧아졌습니다. 하지만, 이 절의 제목이 변수는 선언해야 합니다 라는 것임을 잊지 마십시오.

Sub 암시적변수예제()

      변수 = "변수라는 이름의 변수를 선언했다"
         MsgBox 변수
      변수 = "이제 변수는 더이상 변수가 아니다"
         MsgBox 변수
      변수 = "문자열과 변수를 혼동하면 곤란하다"
         MsgBox "변수", vbOKOnly, 변수
End Sub

팁 : VBA편집기에서 [도구] ☞ [옵션] ☞ [편집기]탭에서 변수 선언 요구(R)라는 체크박스에 체크하도록 하십시오. 이렇게 하면 여러분이 모듈을 삽입할 때마다 VBA편집기는 모듈의 첫머리에 Option Explicit라는 키워드를 삽입해 여러분에게 모든 변수를 선언할 것을 요구하게 됩니다. 이것은 프로그래밍의 오류를 줄이고 여러분이 명확한 프로시저를 작성하는 도움을 줄 것입니다.


변수의 크기를 정해두십시오 앞서 변수란 컴퓨터가 정보를 저장하고 검색하기 위한 메모리 상의 공간이라고 이해하시란 말씀을 드렸습니다. 여러분이 가족 여행을 떠났다면, 식구들이 모두 안락한 휴식을 취할 수 있을 만큼의 공간을 가진 방을 필요로 할 것입니다. 여러분이 학생들을 데리고 수학여행을 떠난 것이라면, 많은 학생들의 숙식할 수 있는 아주 여러개의 방을 확보해야 할 것입니다. 어쩌다, 길을 나서 하룻밤을 잠깐 묵어가는 것이라면, 비좁지만 않은 작은 방이라도 만족할 수 있을 것입니다. 이 모든 경우에, 여러분은 합당한 비용을 지불해야 하며, 필요 이상의 경비를 지출하기를 꺼려할 것이고, 혹 마땅한 대가를 치루지 않아 잠자리에서 쫓겨나는 불상사를 당하지 않도록 조심도 해야 할 것입니다. 여러분이 컴퓨터의 메모리 공간을 아주 알맞게 이용할 수 있도록 VBA는 몇 가지 크기의 방들을 제공합니다. 어떤 방은 아주 특이해서, 여러분이 몇 명이나 투숙할 지 예측할 수 없을 때에도, 적절하게 그 크기를 조정할 수 있도록 아주 여유 있는 방을 제공해 주기도 합니다. 그러나 물론, 이런 방들은 아주 비쌉니다.(Variant라는 이 융통성 있는 데이터 타입은 편리하지만 꼭 필요할 때만 사용하도록 하십시오) 아래 그림은 VBA에서 제공하는 변수의 유형들의 목록입니다. 이제 여러분은 아래 열거한 방 가운데 적당한 것들을 선택해, 여러분이 작업시키고자 하는 데이터를 그 방에 둘 수 있을 것입니다.

우리가 컴퓨터를 이용하는 대부분의 이유는 어떤 데이터들을 조작하기 위한 것입니다. 변수란, 이런 데이터의 조작을 편리하게 하기 위해 사용하는 것입니다. 다음은 모두 엑셀 도움말로부터 각 데이터의 유형에 대한 정보를 가져온 것입니다.

Byte 데이터 형식

Byte 변수는 0부터 255까지 값의 범위를 가지는 부호없는 단일한 8비트(1바이트) 숫자로 저장됩니다.

Byte 데이터 형식은 이진 데이터를 저장할 때 사용합니다.

Boolean 데이터 형식

Boolean 변수는 16비트(2바이트) 숫자로 저장되지만, 오직 True 혹은 False 값만 가질 수 있습니다. Boolean 변수는 Print를 사용할 때는 True또는 False로, Write #를 사용할 때는 #TRUE# 또는 #FALSE#로 표시합니다. Boolean 변수는 두 상태 중 한 가지를 지정하기 위해 TrueFalse 키워드를 사용합니다.

다른 숫자 형식Boolean값으로 변환될 때 0은 False로, 그 밖의 다른 값들은 True로 변환됩니다. Boolean값이 다른 데이터 형식으로 변환될 때 False는 0으로 True는 -1로 변환됩니다.

Integer 데이터 형식

Integer 변수는 -32767부터 32767까지의 범위를 갖는16비트(2바이트) 숫자를 저장합니다. Integer형식 선언 문자는 백분율 기호(%)를 사용합니다.

Integer 변수는 나열된 값을 표현하는 데에도 사용할 수 있습니다. 나열된 값은 정수의 유한 집합을 포함하며, 각 값은 사용된 구문에서 유용하게 사용됩니다. 예를 들면 검은색 = 0, 흰색 = 1처럼 나열된 값은 주어진 범위값 중 하나를 선택하여 사용할 때 편리합니다. 모든 나열된 값에 대해 Const 문을 이용해서 상수로 정의하는 것이 좋습니다.

Long 데이터 형식

Long(long integer) 변수는 -2,147,483,648부터 2,147,483,647까지의 값을 사용할 수 있으며, 32비트(4바이트) 숫자로 저장됩니다. Long형식 선언 문자는 앰퍼샌드 기호(&)를 사용합니다.

Single 데이터 형식

Single(단정도 부동 소수점) 변수는 음수인 경우 -3.402823E38부터 -1.401298E-45까지, 양수인 경우 1.401298E-45부터 3.402823E38까지 범위 값으로 IEEE 32비트(4바이트) 부동 소수점 숫자를 저장합니다. Single형식 선언 문자는 느낌표 기호(!)를 사용합니다.

Double 데이터 형식

Double(배정도 부동 소수점) 변수는 IEEE 64비트(8바이트) 부동 소수점 숫자를 저장하며, 그 값의 범위는 음수인 경우 1.79769313486232E308부터 -4.94065645841247E-324까지이며 양수인 경우 4.94065645841247E-324부터 1.79769313486232E308까지입니다. Double형식 선언 문자는 숫자 기호(#)를 사용합니다.

Currency 데이터 형식

Currency 변수는 정수 부분 15자리와 소수점 이하 4자리의 고정 소수점을 주기 위하여 10,000 단위로 구분한 정수 형식의 64 비트(8바이트) 숫자로 저장됩니다. 이 값은 922,337,203,685,477.5808부터 922,337,203,685,477.5807까지 표현이 가능합니다. Currency 형식 선언 문자는 at 기호(@)입니다.

Currency 데이터 형식은 정확성이 필요한 고정 소수점 계산과 돈 계산 등에 유용합니다.

Date 데이터 형식

Date 변수는 IEEE 64비트(8바이트) 부동 소수점 숫자로 저장되며, 100년 1월 1일부터 9999년 12월 31일까지의 날짜와 0:00:00부터 23:59:59까지의 시간을 표현할 수 있습니다. 인식 가능한 날짜 형식의 모든 문자는 Date 변수에 할당될 수 있습니다. 날짜 리터럴#January 1, 1993# 또는 #1 Jan 93#등과 같이 기호(#)를 사용해야 합니다.

Date 변수는 날짜의 경우 컴퓨터가 인식하는 간단하게 표시 날짜 형식에 따라 나타냅니다. 시간의 경우 12 시간 혹은 24 시간의 시간 형식으로 나타냅니다.

다른 숫자 형식 Date로 변환할 경우 정수 부분의 값은 날짜 정보를 나타내고 소수점 아래의 값은 시간 정보를 나타냅니다. 자정은 0으로, 정오는 0.5로 표시하며, 음수는 1899년 12월 30일 이전의 날짜를 나타냅니다.

String 데이터 형식

문자열에는 가변 길이와 고정 길이 문자열의 두 종류가 있습니다.

  • 가변 길이 문자열은 대략 20억(2^31)개 까지의 문자를 포함합니다.
  • 고정 길이 문자열은 1부터 대략 64K(2^16)개 까지의 문자를 포함합니다.

    메모   Public형 고정 길이 문자열은 클래스 모듈에서는 사용할 수 없습니다.

String 문자의 코드 범위는 0부터 255까지이며, 문자 집합에서 앞의 128개 문자(0부터 127까지)가 표준 U.S. 키보드 글자와 기호 문자를 나타냅니다. 앞의 128개 문자는 ASCII 문자 집합에서 정의한 것과 동일하며, 뒤의 128개 문자(128부터 255까지)는 국제 기호, 강세, 통화 표시 및 분수 등과 같은 특수 문자를 나타냅니다. String형식 선언 문자는 달러 기호($)를 사용합니다.

Object 데이터 형식

Object 변수는 개체를 참조하는 32비트(4바이트) 주소를 저장하며, Object로 선언된 변수는 Set 문을 사용하여 지정된 개체를 참조할 수 있습니다.

메모   Object 형으로 선언된 변수는 어떠한 개체라도 참조할 수 있지만, 그 변수에 의해 참조되는 개체 바인딩은 런타임 바인딩이므로 속도가 항상 느립니다. 빠른 실행 모드 바인딩을 하려면 특정 클래스 이름으로 선언된 변수에 개체 참조를 지정합니다.

Variant 데이터 형식

Variant 데이터 형식은 Dim, Private, Public 또는 Static과 같은 을 사용하여 다른 형식으로 명시적으로 선언되지 않은 모든 변수데이터 형식입니다. Variant 데이터 형식은 형식 선언 문자가 없습니다.

Variant는 고정 길이 String 데이터를 제외한 모든 종류의 데이터를 처리할 수 있는 특별한 데이터 형식입니다. Variant 형식은 이제 사용자 정의 형식을 지원합니다. VariantEmpty, Error, Nothing, Null 등의 특정한 값을 가질 수 있습니다. VarType 함수나 TypeName 함수를 사용하면 Variant로 선언된 데이터가 어떻게 처리되는지 결정할 수 있습니다.

숫자 데이터의 경우 음수는 -1.797693134862315E308부터 -4.94066E-324까지, 양수는 4.94066E-324부터 1.797693134862315E308까지 표현할 수 있습니다. 일반적으로 숫자 Variant 데이터는 Variant 안에서 고유의 데이터 형식을 계속 갖게 됩니다. 예를 들면 integerVariant에 할당하면 이후 연속된 연산은 VariantInteger로 처리합니다. 그러나 Byte, Integer, Long, Single 값의 가진 Variant에서 산술 연산을 실행한 결과값이 원래의 데이터 형식의 일반적인 값보다 클 경우 그 결과값은 Variant안에서 더 큰 데이터 형식으로 변환됩니다. ByteInteger로 변환되고, IntegerLong으로, LongSingleDouble로 변환됩니다. Currency, Decimal 그리고 Double 값을 가진 Variant 변수들이 각각 범위를 초과하면 오류가 발생합니다.

Variant 데이터 형식은 더욱 유연하게 데이터를 다루는 작업을 해야 하는 곳에서 사용할 수 있습니다. Variant 변수의 내용이 숫자라면 아래의 예와 같이 상황에 따라 숫자를 문자열로 표현할 수도 있고 또는 실제값이 될 수도 있습니다.

Dim MyVar As Variant
MyVar = 98052

위의 예제에서 MyVar 변수는 실제 값인 98052를 숫자로 나타내고 있습니다. 산술 연산자는 Variant 변수가 숫자값 또는 숫자로 변환될 수 있는 문자열 데이터를 포함하고 있다고 가정하고 작업을 수행합니다. 만약 MyVar 변수값을 숫자를 포함하고 있는 또 다른 Variant 변수 혹은 숫자 형식 변수에 더하기 위해 "+" 연산을 한다면 그 결과값은 산술 합계가 됩니다.

Empty 값은 Variant 변수가 초기화되지 않았음(초기값이 할당되지 않았음)을 의미합니다. Empty 값을 가진 Variant 변수는 산술적으로 사용할 때는 0을 의미하고, 문자열 의미로 사용할 때는 크기가 0인 문자열("")을 의미합니다.

EmptyNull을 혼동하지 마십시오. NullVariant 변수가 의도적으로 유효하지 않은 값을 가지고 있다는 것을 의미합니다.

Variant에서 Error프로시저에서 오류가 발생한 것을 나타내는 특별한 값입니다. 그러나 다른 오류와는 달리 보통 프로그램 단위의 오류 처리는 발생하지 않으며, 발생하는 오류값에 따라 다른 방법으로 오류를 처리할 수 있게 합니다. CVErr 함수를 사용하여 실제값을 오류값으로 변환하면 Error 값이 만들어집니다.

읽어도 무슨 말씀이신지 모르시겠구요...아니, 읽지 않고 그냥 넘어오셨다구요^^* 그래도 다 괜찮습니다.

이것만 기억해 두십시오. 1만명을 수용할 수 있는 경기장에 단 한 사람만 들어가 운동한다면 그 얼마나 낭비이겠습니까? 두 사람이 자면 딱 좋을 방에 수 십 명을 들여넣어 놓으면 얼마나 소란스럽겠습니까? 변수를 선언한다는 것은 여러분이 일을 시켜야 할 데이터들을 위해 알맞은 크기의 방을 골라 주는 일이랍니다. 적재적소(適在適所) 여러분도 여러분에게 알맞은 자리에 가 일하고 싶으시듯이, 여러분이 일을 시키려는 컴퓨터의 데이터에도 알맞은 자리를 마련해 주어야 마땅하답니다^^
김춘수의 시 꽃을 그래 이 자리에 인용하는 것은 우스꽝스럽기도 하지만, 빛깔과 향기에 알맞는 이름을 불러주고, 불리우시길...!

내가 그의 이름을 불러주기 전에는
그는 다만
하나의 몸짓에 지나지 않았다.

내가 그의 이름을 불러주었을 때
그는 나에게로 와서 꽃이 되었다.

내가 그의 이름을 불러준 것처럼
나의 이 빛깔과 향기에 알맞는
누가 나의 이름을 불러다오
그에게로 가서 나도
그의 꽃이 되고 싶다.

우리들은 모두 무엇이 되고 싶다.
너는 나에게 나는 너에게
잊혀지지 않는 하나의 눈짓이 되고 싶다

그럼...다음에 또*^_^*

목차 | 이전 | 다음