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


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

▶ 오늘 배울 내용

코드 작성을 위한 몇 가지 시시콜콜한 이야기 - 상수에 대한 주저리주저리

세상에는 늘 한결 같은 것이 있는가 하면...그때그때 변하는 것들도 있답니다. 늘 푸른 소나무와 같이 한결 같은 것을, 프로그래밍에서는 상수라고 부르고, 봄 여름 가을 겨울과 같이 철마다 변하는 것을 변수라고 부른다는 서툰 얘기만 꺼냈다가 지난 시간을 넘긴 것 같습니다.*^_^*

미리 말씀 드립니다만...^^ 변수는 여러분이 VBA를 이용해 프로그래밍하는 데에 반드시 넘어야 할 산과 같습니다. 여러분과 함께 그 산을 이제 넘어 보도록 하겠습니다. 산을 넘어 가기 전에 산 속에 보이는 푸른 소나무 하나를 먼저 감상하시도록 하겠습니다^^*

상수(常數 Constant) : 상수란 변하지 않고 늘 같은 값을 가지는 것을 가리킵니다. 늘 변함이 없는 것이지요. 바뀌지 않는다는 것이 바로 상수의 특징입니다. 그러나 변수 역시 중간에 바뀌지 않는다면...바로 상수와 같은 역할을 하게됩니다. 따라서, VBA프로그래밍에서는 변수에 비해 상수의 중요성은 아주 덜하다고 할 수 있습니다. 하지만, 프로그래밍에서 상수를 사용하는 가장 중요한 이유는 편리함 때문이랍니다. 하나는, 프로그램의 가독성(이해하기 좋게 만드는 것)을 높이고, 다른 하나는 프로그램의 수정을 용이하게 하기 위해서입니다.

내장상수 : 내장상수란 이미 VBA내부에서 정해놓은 상수들을 말합니다. 이 내장상수는 아주 많아서 헤아리기조차 어렵답니다^^

가장 많이 사용하는 Msgbox함수의 예를 들어보겠습니다.

Sub 메시지함수_1()
Dim i As Integer
i = MsgBox("메시지박스라는 함수는 숫자를 되돌립니다", vbYesNo, "엑사모")
If i = vbYes Then
    MsgBox "예를 선택하셨습니다"
Else
    MsgBox "아니오를 선택하셨습니다"
End If
End Sub

위의 프로시저를 실행하면...

와 같은 메지지 박스가 나타납니다. (메지시박스 함수의 두번째 인수에 VbYesNo라는 값을 전달하면, 예와 아니오라는 두개의 단추가 달린 상자를 표시해줍니다)만약 사용자가 예를 누른다면...아래와 같은 결과를 되돌려줄 것입니다

이 메지지 박스는 아무런 인수도 전달하지 않았으므로 기본값인 0인 오직 확인단추만 있는 메시지 상자를 보여주는 것입니다.

아래의 예제는 위와 동일한 프로시저입니다만, 상수를 사용하지 않아,프로그램을 더욱 이해하기 어렵습니다. 사실 저도 이 강좌를 만들기 위해 도움말을 참고해 겨우(^^) 만들었답니다.

Sub 메시지함수_2()
Dim i As Integer
i = MsgBox("메시지박스라는 함수는 숫자를 되돌립니다", 4)
If i = 6 Then
    MsgBox "예를 선택하셨습니다"
Else
    MsgBox "아니오를 선택하셨습니다"
End If
End Sub

vbMagboxstyle이란 인수, 즉 메시지 상자의 스타일은 몇 가지 정해진 틀이 있으며 몇 번 스타일이라고 정해진 인수를 전달하면, VBA는 거기에 합당한 모양의 메시지 상자를 사용자에게 보여주게끔 되어 있는데, 4라는 인수를 전달하면 위와 같은 예와 아니오라는 두 개의 단추를 갖는 메시지 상자를 나타내게 됩니다. 이 때, 사용자가 예라는 단추를 누르면, 이 메시지 상자 함수는 6이란 숫자를 되돌려주게 되는 것입니다. 그런데, 4나 6이라는 숫자는 사람들이 직관적으로 이해하기 어렵습니다. 그래, vbYesNo, vbYes와 같은 내장 상수를 이용해 프로그래밍하도록 하는 것이랍니다. 뒤에 설명하겠습니다만, 이런 내장상수들은 모두 열거형 상수의 일종이랍니다.

엑셀 도움말 엿보기 : 엑셀 도움말에서는 상수를 아래와 같이 설명하고 있습니다.

프로그램을 실행하는 동안 상수 값을 보유하는 지정 항목을 의미합니다. 상수로서 문자열이나 숫자 리터럴, 다른 상수, 또는 Is와 지수를 제외한 지수와 논리 연산자의 모든 조합이 가능합니다. 각각의 호스트 응용 프로그램은 고유의 상수 집단을 정의할 수 있습니다. 사용자는 추가적인 상수를 Const 문을 사용하여 정의할 수 있습니다. 사용자는 코드의 어느 곳에나 실제 값 대신 상수를 사용할 수 있습니다

각각의 호스트 응용프로그램은 고유의 상수 집단을 정의할 수 있습니다라는 대목을 눈여겨 보십시오. 알쏭달쏭하시다구요^^*

이런 것이랍니다...

 

위의 그림은 선택한 범위에 아래쪽 테두리를 그린 것을 매크로 기록기로 기록한 내요이랍니다. 정작 필요한 것은 
With Selection.Borders(xlEdgeBottom)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
End With
와 같은 부분뿐입니다만. 이 아주  친절한 기록기는 여러 가지 것을 한꺼번에 가르쳐 주고 있습니다^^

자 여기서 여러분이 눈여겨 보실 대목은 위의 그림에서 사각형, 마름모 그리고 타원형으로 표시한 부분입니다. 그것들의 공통점은, 이미 알아보셨겠습니다만, xl이라는 접두사를 가지고 있다는 것입니다. 엑셀의 셀은 테두리라는 속성을 가지고 있습니다. 이 테두리라고 하는 것은 왼쪽, 오른쪽, 위, 아래 그리고 왼쪽 사선, 오른쪽 사선들로 이루어져 있습니다. 사람들의 기준으로 보자면 왼쪽 오른쪽이란 규정이 편리하겠습니다만, 컴퓨터는 모두 이것을 몇 번째 요소라고 것으로 규정하게 됩니다. 즉, 모든 것이 수로 이루어져 있는 것이지요. 이럴 때 상수는 사람과 컴퓨터의 중간에서 교량 역할을 해주는 것입니다.

Borders(xlEdgeBottom)라는 표현은, 조금 복잡하게 사용하면...
Borders.Item(9)라고 하는 것과 같은 것입니다.

즉, 테두리 컬렉션의 9번째 요소가 xlEdgeBottom이란 것이지요. 하지만, 엑셀은 수 많은 개체들로 이루어져 있으며 그 개체들의 속성 또한 하나 둘이 아니랍니다. 특히, 오피스 프로그램 가운데 엑셀은 가장 복잡하고 다양한 구성요소로 이루어져 있습니다. 여러분이 복잡하다고 느끼시는 엑세스와 비교해보더라도, 엑세스를 이루는 구성요소의 수는 엑셀의 절반을 겨우 넘는 정도입니다. 자 이 복잡한 요소들은 모두 숫자로 표현됩니다. 그렇다면, 이 모든 것을 어떻게 접근할 수 있을까요. 이럴 때 엑셀을 만든 프로그래머들이 정의한 내장 상수를 이용해 손쉽게 우리는 엑셀 개체와 속성에 접근이 가능한 것입니다. VB에서 사용한 상수들은 vb라는 접두사를, 엑셀에서 사용하는 내장상수들은 xl이라는 접두사를 이용합니다. wd라는 접두사는 워드에서, 사용하며, ac라는 접두사는 엑세스에서, pp는 파워포인트에 사용합니다. mso는 도구 모음과 같이 오피스에 공통으로 적용되는 상수들의 접두사입니다. 각각의 호스트 응용 프로그램은 고유의 상수 집단을 정의할 수 있습니다라는 도움말의 의미는 바로 이와 같이 각각의 응용프로그램은 고유한 상수를 정의해 사용한다는 뜻이랍니다. 정말 중요한 것은 이 모든 것을 알고 계시지 않아도 된다는 것입니다. 필요할 때마다 도움말을 찾아 보시면 됩니다. 물론 빈번하게 사용한다면, 하나 둘 정도 알고 있어도 무방하겠지요...제가 가장 빈번하게 사용하는 VBA내장 상수는 vbCr입니다. 캐리지리턴이란 뜻이랍니다. 아스키 문자 13과 같은 의미입니다. 이 문자는 눈에 보이지 않는 문자이므로...내장 상수를 이용하는 것이 아주 편리합니다.

자, 왜 이런 내장 상수를 사용해야 하는지 한가지 예를 들어 보도록 하겠습니다. 다시 매크로 기록기를 이용해봅니다^^

Sub Macro2()
'
' Macro2 Macro
' 황기성이(가) 2000-08-10에 기록한 매크로
'

'

     With Selection.Interior
           .ColorIndex = 6
           .Pattern = xlSolid
      End With
End Sub
무엇을 기록한 내용인지 아시겠습니까? 서식 도구 모음에 있는 색 채우기 단추를 이용해 셀 범위에 노랑색를 입힌 것을 매크로로 기록한 것입니다. 매크로 기록기로 기록하면 Interiror속성의 ColorIndex속성을 6으로 설정한다는 이해하기 어려운 코드가 기록됩니다. 이것은 아래와 같은 코드로 바꿀 수 있습니다. 선택한 개체의 내부 색상을 노란색으로 할당하라는 코드인 것입니다.

Sub dhYellowRagne_1()
      Selection.Interior.Color = vbYellow
End Sub

Sub dhYellowRagne_2()
      Selection.Interior.Color = 65535
End Sub
우리는 빨갛다 파랗다 노랗다고 하는 것을 컴퓨터는 모두 숫자로 표시합니다. 노란색은 색상표 가운데 65535번째 색인 것입니다. dhYellowRagne_1과 dhYellowRagne_2은 모두 같은 결과를 되돌립니다만, 여러분이라면 어떤 코드를 사용하시겠습니까^^* 

사용자 정의 상수 자 이제 사용자 정의 상수에 대해 알아 보도록 하겠습니다. 사용자 정의라는 말에서 알 수 있듯이, 이 사용자가 정의한 상수가 사용자 정의 상수랍니다. 하고 보니 하나마나 한 얘기군요^^ 제가 요즘 프로그래밍 할 때 자주 사용하는 상수는 Es입니다...뭐 특별한 의미가 있는 것은 아닙니다. 그냥 제 맘대로 붙여 본 것이랍니다. 사용자 정의란 사용자 맘대로란 뜻도 어느 정도 있지 않겠습니까?(참고 : Const 문으로 선언한 상수를 기호상수라는 말로 바꾸어 부르는 경우도 있습니다)

사용자 정의 상수를 이용하시려면 Const 문을 이용합니다.

다시 엑셀 도움말을 보도록 합니다...^^(혹, 알고 계신지 모르겠습니다만, 컴퓨터 관련 책들은 도움말을 짜집기한 수준의 것이 대부분이랍니다. 예제나 코드 역시 도움말을 그대로 베낀 것이지요. 그런데 베꼈다는 이야기는 많지 않더군요^^*)

구문
[Public | Private] Const constname [As type] = expression
Const 문은 다음과 같은 구성 요소로 되어 있습니다.

구성요소 설명
Public 선택적인 요소. 상수를 선언하기 위해 모듈 수준에서 사용된 키워드는 모든 모듈 내의 모든 프로시저에서 사용할 수 있지만 프로시저 내에서는 사용할 수 없습니다.
Private 선택적인 요소. 상수를 선언하기 위해 모듈 수준에서 사용된 키워드는 선언이 만들어진 모듈 내에서만 사용할 수 있으며, 프로시저 내에서는 사용할 수 없습니다.
constname 필수적인 요소. 상수의 이름은 표준 변수 명명 규칙에 따릅니다.
type 선택적인 요소. 상수의 데이터 형식은 다음과 같습니다.

Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal(현재 지원 안됨), Date, String, Variant.

선언된 각각의 상수에 대하여 독립적인 As type 절을 사용합니다.

expression 필수적인 요소. Is를 제외한 모든 숫자나 논리 연산자를 포함하는 문자열, 다른 상수 또는 모든 조합입니다.

위의 구문에서 []로 표시 한 것은 생략 가능하다(선택적이라)는 뜻입니다. 즉, 아래의 여러 구문을 비교해 보세요.

Public Const Es As String = "MgicSheet & 엑사모"
Private Const Es As String = "MgicSheet & 엑사모"
Public Const Es = "MgicSheet & 엑사모"
Private Const Es = "MgicSheet & 엑사모"
Const Es As String = "MgicSheet & 엑사모"
Const Es = "MgicSheet & 엑사모"
짧게 말하면, 위에 열거한 예제는 모두 Es란 상수를 이용해 " MagicSheet & 엑사모라"는 문자열을 대신하겠다는 선언입니다. 이렇게 Const문을 이용해 상수를 선언해 두면, VBA는 앞으로 프로시저에서 만나는 Es 상수를 모두 " MgicSheet & 엑사모"라는 문자열로 해석하고 바꾸게 되는 것입니다.

이 상수를 이용하는 이유는 앞서 말씀드린 대로(사실, 변수를 선언하고 값을 대입한 뒤, 이 변수의 값을 변경하지 않으면 이 변수는 상수의 역할을 마찬가지로 수행합니다) 편리함 때문이랍니다. 하나의 모듈이나 프로시저 내에서 공통적으로 여러번 사용해야 할 내용이 있다면 상수를 선언해 두어 한꺼번에 치환이 가능한 것이니까요.

열거형 상수 열거형 상수는 별로 잘 사용하지 않는 것입니다만, 알아두시면 많은 경우 융통성을 발견하실 수 있답니다. 사실 앞서 말씀 드린 내장상수들 대부분 이런 열거형 상수랍니다. 아래의 간단한(아니 복잡한가요^^* 코드창에 복사해 붙여넣으시면 됩니다) 예제를 보도록 합니다.

Option Explicit
Enum Escolor

검정 = 1
흰색 = 2
빨강 = 3
밝은녹색 = 4
파랑 = 5
노랑 = 6
분홍 = 7
밝은옥색 = 8
진한빨강 = 9
녹색 = 10
진한파랑 = 11
진한노랑 = 12
보라 = 13
진한청록 = 14
회색25 = 15
회색50 = 16
하늘색 = 33
연한옥색 = 34
연녹색 = 35
연노랑 = 36
흐린파랑 = 37
장미색 = 38
연보라 = 39
살색 = 40
연한파랑 = 41
연한녹청 = 42
라임 = 43
금색 = 44
연한주황 = 45
주황 = 46
청회색 = 47
회색40 = 48
진한옥색 = 49
해록색 = 50
진한녹색 = 51
황록색 = 52
갈색 = 53
자주 = 54
남색 = 55
회색 = 56

End Enum
Sub dhDoThis()
   dhEnumSample 노랑
   'dhEnumSample Escolor.노랑 '위의 코드와 같은 결과입니다
End Sub
Sub dhEnumSample(LngColor As Long)
   Selection.Interior.ColorIndex = intColor
End Sub

Enum이란 Emumeration(열거)의 줄임말입니다. 우리는 모듈에 위와 같이 Enum 문을 이용해 상수를 정의하고 이를 사용할 수 있습니다.(주의 :  Const 문과는 다르게 Enum 상수는 오로지 Long타입의 상수만을 정의할 수 있습니다) 엑셀에서는 간단한 색상표를 정의하여 이를 사용합니다만 여기에 대한 상수는 제공되지 않는 듯 싶습니다.(위의 예제에서 중간중간 연속되지 않는 숫자를 발견하실 수 있을 것입니다. 이것은 제가 색상 이름을 뭐라고 해야할지 잘 몰라 붙이지 못한 것이랍니다^^)
위의 예제는 열거형 상수를 선언하고 이를 이용하여 셀의 내부 색상을 변경하도록 한 예제입니다. 또한 열거형 상수를 선언하면 아래와 같이 VBA편집기에서 이 상수 목록을 쉽게 이용할 수 있게됩니다.

오늘은 앞서 말씀드린 대로, 소나무 한 그루를 감상하셨습니다. 아주 이상한 소나무라구요..죄송합니다^^* 다음 시간에는, 프로그래밍에서 가장 중요한 요소 가운데 하나인 변수에 대해 말씀드리기로 하겠습니다.

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

목차 | 이전 | 다음