도대체 이 나라는... 대통령 뽑을라구 있는 나라인지 허구헌 날 왜 이러나 모르겠습니다. 하지만 '조직은 딱 제 수준에 맞는 우두머리를 가진다'는 Nigel Nicholson의 말이 맞는다면 우리 정치 수준이 이것 밖에 안된다는 의미가 되므로... 씁쓸해 집니다. 누가 당선되든 간에 국민 무서운 줄 뼈저리게 느끼도록 본 때를 보여줘야 할 텐데...
VBA 입문강좌 : 애플리케이션, 오브젝트, 프로퍼티, 그리고 메서드
이제 VBA의 얼굴과는 많이 친해지셨나요? '엉? VBA가 얼굴이 어딨어?' 하는 분이 저기 두어분 계시는군요. ^^ VB Editor, 즉 '도구-매크로-Visual Basic Editor' 메뉴(또는 Alt + F11)를 선택하면 나타나는 화면이 바로 VBA의 얼굴입니다. 이제 첫 인사를 나누었으니 몇 가지 중요한 개념을 정립하고 넘어가도록 합니다.
먼저 애플리케이션 오브젝트의 계보hierarchy를 잠깐 눈여겨 보도록 하세요. 엑셀에서도 그러하였지만 VBA를 배우는데 있어 가장 훌륭한 스승은 도움말 입니다. VB Editor 상태에서 도움말을 찾아보면 아래와 같은 계보, 즉 엑셀의 족보가 나타납니다.
딸린 식솔들이 엄청나게 많아 보이십니까? 따지고 보면 그리 많지도 않습니다. 우리가 누구입니까? 학교다닐 때, 그 어렵다는 VOCA 22000, 33000도 모자라 55000도 거뜬히... 책을 한권씩은 산 의지의 한국인들 아닙니까? ^^
애플리케이션(Application)
우리가 지금 배우고 있는 것이 Visual Basic for Application, 즉 특정한 응용 프로그램Application을 위한 VB입니다. 위에서 Application은 Excel이 되는 것입니다. 그런데 VBA 엔진은 엑셀에만 있는 것이 아니고 모든 MS-Office 제품군에 장착이 되어 있습니다. 만약 워드에서 VBA를 사용한다면 Application은 워드가 되고 억세스에서 VBA를 사용한다면 Application은 당연히 억세스가 된다는 얘기입니다. VBA를 잘 모르는 사람들은,
"웬 파일들이 이렇게나 많고 용랑이 커? 비싸기만 하고..."
하겠지요? VBA라는 아주 똘똘한 부하가 언제든 주인의 명령을 내려주기만 기다리고 있다는 사실은 모르고 말입니다. 이런 걸 모르고 하드디스크 자리나 차지하게 방치해 두는 것도 낭비 중의 낭비일 것입니다.
이제 애플리케이션이 무엇인지 감이 좀 오십니까? 당연히(?) 안 오신다구요? 그러시리라 짐작 했습니다. ^^; 쉽게 "엑셀 그 자체가 애플리케이션이다"라고 생각하시면 되겠습니다. 물론 워드라면 "워드 그 자체가 애플리케이션이다"가 되겠지요.
오브젝트(Object, 개체)
컴퓨터를 가만히 살펴보세요. 우선 모니터가 있고 본체가 있고 키보드가 있고... 옆에 마우스도 보이는군요. 본체를 사알~짝 뜯어보면 메인보드가 있고 CPU가 있고 RAM이 있고 비디오 카드 등이 있습니다. 이처럼 컴퓨터는 여러 가지 부품들의 조합으로 이루어져 있습니다. 이 때 컴퓨터라는 총합체가 Application이고 각각의 부품들(모니터, 키보드, CPU 등...)이 오브젝트라고 생각하시면 되겠습니다.
아이들이 가지고 노는 장난감 중에 레고Lego라는 것이 있지요? 여러 가지 형태의 조그만 부속품을 이리 맞추고 저리 끼우고 하여 집도 만들고 성도 만들고 배나 비행기도 만듭니다. 이 때 각각의 장난감 조각이 오브젝트이고 조각이 만들어 낸 집이나 비행기가 Application인 것입니다. 그러고 보니 우리 주변에 보이는 모든 것이 무언가의 조합에 의해 이루어진 것이란 생각이 듭니다. 모든 것이 부품화 되어 있고 부속품을 조립하여 다른 완성품을 만들듯이 프로그래밍에 있어서도 이러한 개념이 도입되었는데 이것을 컴포넌트Component 프로그래밍이라고 부릅니다.
엑셀도 마찬가지 입니다. 엑셀도 수많은 부속품(위의 계보에서 Workbooks, Worksheets, Charts, Windows 등이 모두 여기에 해당됩니다)들이 모여서 만들어진 것입니다. 엑셀에는 이런 오브젝트가 47개가 있습니다(엑셀 2000 기준. 아직 XP는 몇 개인지 세어보지 않았습니다. 누구 세어 보신 분 계시면 좀 알려주세요).
그런데... 모든 것을 부품화 해 놓으면 도대체 어떤 장점이 있는 것일까요? 예를 들어 자동차를 조립하는 회사에서 타이어를 하청 업체로부터 공급받지 않고 직접 제조한다면, 유리창도 하도급 업체에서 받아오는 것이 아니라 자신들이 직접 생산한다면 얼마나 많은 중복되는 생산라인이 필요할 것이며, 얼마나 많은 기술력과 전문가들을 보유하고 있어야 하겠습니까? 아마도 불가능 할 것입니다. 돈만 가지고 있으면 하청업체들로부터 부속품들을 구매해서 조립하고 핵심 역량만 지속적으로 개발해 나가는 것이 훨씬 효율적이겠지요.
Microsoft에서 엑셀을 개발하는 프로그래머들도 엑셀 신 버전을 만들 때에도 모든 것을 만들어 내거나 맨 처음부터 다시 시작하는 것은 아닙니다. 업그레이드 한다는 것은 엑셀의 수많은 부품 중 일부를 보다 나은 부품으로 바꿔 끼우거나 기존에 없던 부품을 새로 꽂는 것을 의미합니다. 이런 방법을 취함으로써 지속적인 개선이 가능한 것입니다.
오브젝트에는 두 가지 종류가 있습니다. 하나는 그냥 오브젝트이고 다른 하나는 컬렉션Collection 오브젝트 입니다. 아파트를 가만히 보면, A 아파트, B 아파트, C 아파트 등은 모두 아파트라는 보다 큰 카테고리에 속해 있습니다. 즉 각각의 아파트는 서로 다른 것이지만 아파트들 이라는 집합체(Collection) 속에 포함되는 것입니다. 자동차 타이어를 다시 예로 들어보면, 자동차에는 4개의 타이어가 있습니다. 각각의 타이어는 모두 오브젝트가 되겠고, 4개의 타이어를 합쳐서 타이어들 이라는 컬렉션(집합체)으로 취급한다는 이야기 입니다. 즉 타이어는 오브젝트인 동시에 컬렉션의 한 구성요소라고 할 수 있습니다.
컬렉션이라는 것은 A group of objects of the same class, 즉 같은 클래스의 집합체 라고 할 수 있습니다. 짜증이 막 날라구 그러지요?(클래스는 또 뭐야? 학급이란 뜻인가?) 많이 헷갈리시리라 생각됩니다. 위 엑셀 계보도에서 오브젝트 뒤에 s가 붙은 것(예를 들면 Workbooks, Worksheets, Names, Windows,...)은 모두 컬렉션 오브젝트라고 보시면 됩니다. 여러 개가 모여서 하나의 큰 덩어리를 이루고 있는 집합체라고만 알아 두세요. 앞으로 자주 나오게 될 테니까...
프로퍼티(Property, 속성)
프로퍼티를 다른 말... 이라기 보다 우리 말로 속성이라고 합니다. 책을 오브젝트라고 가정한다면 프로퍼티는 그 책의 두께나 크기, 저자, 무게, 가격, 표지 색깔 등 오브젝트가 가진 성질머리라고 할 수 있습니다.
책.두께 = 566 페이지 책.표지색깔 = 빨간색 책.가격 = 20000원 책.저자 = Exceller
이렇게 표현할 수 있을 것입니다. 이제 실제로 코딩은 어떻게 하는지 살펴보도록 하겠습니다. 아래의 코드를 모듈시트에 복사해 넣고 실행시켜 보세요. 모듈시트를 삽입하고 코드를 삽입하는 방법은 지난 시간에 소개 드렸지요?... 잠잠 ... (다시 한번) 드렸지요? 혹여라도 긴가민가 하는 분은 아래 게시물을 다시 한번 살펴보세요. 모든 것은 부단한 반복입니다.
Sub AboutProperty()
Dim strTemp As String strTemp = "안녕하세요 " & Application.UserName & "님!" & vbCr strTemp = strTemp & "현재 사용중인 엑셀 버전은 " & Application.Version & "입니다"
MsgBox strTemp, , "www.iExceller.com"
End Sub |
Application.UserName은 엑셀을 설치할 때 입력한 사용자의 이름을, Application.Version은 엑셀의 버전 정보를 알려주는 프로퍼티입니다. 여러분이 사용하고 계신 엑셀의 버전이나 사용자 이름 등에 대한 정보를 누가 갖고 있느냐 하면 바로 Application 오브젝트가 가지고 있습니다.
우리네 실생활에서도 사정은 크게 다르지 않습니다. 창고에 TV가 몇 대 남았는지, 냉장고 재고 상태가 어떤지를 알려면 창고의 재고 담당자에게 물어야지 공장의 생산설비 담당이나 연구소 직원에게 물어서는 곤란하겠지요? 그런 의미에서 VBA로 프로그래밍을 한다는 것은 누가(즉 어느 오브젝트가) 어떤 정보를 가지고 있는 지를 파악해서 일을 시키는 것이라 할 수 있을 것입니다. 그러기 위해서 오브젝트들과 우선 친해져야 하고, 그런 다음 각 오브젝트의 성질머리(프로퍼티)와 행위(메서드)를 파악해 나가는 것입니다.
메서드(Method, 방법)
메서드를 한 마디로 표현하자면... 동사(Verb)라고 할 수 있습니다.
갑돌이가 잠을 잔다 영식이가 달려 간다 만득이가 눈을 깜빡거린다 바둑이가 짖는다 비가 내린다
여기서 갑돌이, 영식이, 만득이 등은 오브젝트입니다. 반면 잠을 잔다, 달려 간다, 눈을 깜빡거린다 처럼 오브젝트에 대한 동작 명령은 메서드방법라고 합니다. 메서드는 오브젝트를 움직이도록 만드는 수단이며 우리말로 방법이라고 번역합니다.
모든 오브젝트는 적어도 한 개 이상의 프로퍼티나 메서드를 가지고 있습니다. 그리고 오브젝트에 명령을 내릴 때, 프로퍼티를 이용할 수도 있고 메서드를 사용할 수도 있습니다.
갑돌이.잠 = True
이렇게 갑돌이의 상태를 프로퍼티로 표현할 수도 있고(오브젝트명.속성명 = 속성값)
갑돌이.잠을잔다
와 같이 메서드로 나타낼 수도 있습니다(오브젝트명.메서드). 두 가지 방법 중 어떤 것을 택할 것인가는 프로그래머가 그때그때 상황에 맞게 선택하여 사용합니다.
아래의 코드를 모듈시트에 붙여 넣고 실행시켜 보세요.
Sub ValueProperty() Dim i As Integer
For i = 1 To 20 Cells(i, 1).Value = "안녕하세요!" Next i End Sub |
Sub ClearContentsMethod()
Dim i As Integer
For i = 1 To 20 Cells(i, 1).ClearContents Next i
End Sub |
어떤 일이 일어났습니까? ValueProperty를 실행시키니까 A1:A20 영역의 셀에 안녕하세요!라는 문자열이 한꺼번에 좌~악 입력되지요? 이것은 Range 오브젝트의 Value 프로퍼티를 이용한 것입니다. Range 오브젝트에 대해서는 다음 강좌 시간에 아주 자세히 다룰 예정입니다.
이번에는 ClearContentsMethod 프로시저를 실행시켜 보세요. A1:A20 영역에 입력되어 있던 값들이 순식간에 어디론가 사라졌습니다. 이것은 역시 Range 오브젝트의 ClearContents 메서드를 사용한 것입니다.
이맘때쯤 되면 무지 헷갈리실 것입니다. Exceller가 위에서 프로퍼티와 메서드는 분명히 다르다고 하니까 그런가 보다 하고 넘어왔는데 어떻게 다른 것인지, 그리고 어떨 때 프로퍼티를 쓰고 또 다른 경우에는 메서드를 사용하는지...
프로퍼티와 메서드는 공히 오브젝트를 움직이게 하는 수단입니다. 차이점이 있다면, 달리게 한다거나 잠을 자게 한다거나 눈을 깜빡이게 한다거나 하는 등 동사적 변화를 주는 것은 메서드, 머리 색깔이나 눈동자 색깔을 묘사하는 것과 같이 형용사적 변화를 주는 것은 프로퍼티라고 생각하시면 되겠습니다.
다음 시간에는 아주 중요한... (그렇다고 오늘 강좌나 지난 강좌가 중요하지 않다는 것은 절대 아님!) Range 오브젝트를 포함한 몇 가지 오브젝트에 대해 살펴보도록 하겠습니다.
어서 빨리 하늘을 날아다니고 싶은데 날으는 기술은 안 가르쳐주고 왜 자꾸 이상한 것만 자꾸 가르쳐 줘요?
이렇게 생각하는 분도 계시리라 생각됩니다. 날기 위해서는 사전에 많은 준비가 필요합니다. 한 송이 국화꽃을 피우기 위해서는 이른 봄부터 소쩍새가 몹시도 시끄럽게 울어야 하듯이 말입니다. 해서... 앞으로도 한동안은 안 날아다닐 겁니다(실은... VBA 배워도 날아다닐 순 없답니다. ^^).
|