• 최초 작성일: 2002-11-29
  • 최종 수정일: 2022-07-10
  • 조회수: 204,840 회
  • 작성자: 엑셀러 권현욱
  • 강의 제목: VBA 코딩을 위해 반드시 알아야 할 개념 몇 가지

엑셀러 권현욱

들어가기 전에

도대체 이 나라는 대통령 뽑을라구 있는 나라인지 허구헌 날 왜 이러나 모르겠습니다. 하지만 '조직은 딱 제 수준에 맞는 우두머리를 가진다'는 Nigel Nicholson 말이 맞는다면 우리 정치 수준이 이것 밖에 안 된다는 의미가 되므로 씁쓸해 집니다.

누가 당선되든 간에 국민 무서운 줄 뼈저리게 느끼도록 해줘야 할 텐데 말이죠.



이제 VBA의 얼굴과는 많이 친해지셨나요?

"엉? VBA가 얼굴이 어딨어요?"

하는 분이 저기 두어 분 보이는군요(^^). VB Editor, 즉 '개발 도구 - 매크로 - Visual Basic Editor' 또는 Alt + F11키를 누르면 나타나는 화면이 바로 VBA의 얼굴입니다. 이제 첫 인사를 나누었으니 몇 가지 중요한 개념을 정립하고 넘어가도록 합니다.

먼저 애플리케이션 개체의 계보 hierarchy를 잠깐 눈여겨 보도록 하세요. 엑셀에서도 그랬지만 VBA를 배울 때에도 가장 훌륭한 스승은 도움말입니다. VB Editor 상태에서 도움말을 찾아보면 아래와 같은 계보, 즉 엑셀의 족보가 나타납니다(엑셀 버전에 따라 도움말 화면은 달라질 수 있습니다).

Excel 개체

Microsoft Excel 개체

언뜻 보면 딸린 식솔들이 엄청나게 많아 보입니다만 따지고 보면 그리 많지도 않습니다. 우리가 누구입니까? 학교다닐 때, 그 어렵다는 VOCA 22000, 33000도 모자라 55000도 거뜬히... 책을 한 권씩은 산 의지의 한국인들 아닙니까?(^^)

애플리케이션 (Application)

우리가 지금 배우고 있는 것이 Visual Basic for Application, 즉 특정한 응용 프로그램 Application을 위한 Visual Basic입니다. 위의 Excel 계보에서 Application은 Excel입니다. VBA 엔진은 엑셀에만 있는 것이 아니고 대부분의 MS-Office 제품군에 장착되어 있습니다. 만약 워드에서 VBA를 사용한다면 Application은 워드가 되고 엑세스에서 VBA를 사용한다면 Application은 당연히 엑세스가 된다는 얘기입니다. VBA를 잘 모르는 사람이라면,

"웬 파일들이 이렇게나 많고 용랑이 커? 쓸데 없이 비싸기만 하고..."

라고 하겠죠? VBA라는 아주 똘똘한 부하가 언제든 주인의 명령을 내려주기만 기다리고 있다는 사실은 모른 체 말입니다. 이런 걸 모르고 하드디스크 자리나 차지하게 방치해 두는 것도 자원의 낭비입니다.

이제 애플리케이션이 무엇인지 감이 좀 잡히시나요? 당연히 안 오신다구요? (그러시리라 짐작했습니다 ^^;) 쉽게 말해서, "엑셀 그 자체가 애플리케이션이다"라고 생각하시면 되겠습니다. 물론 워드라면 "워드 그 자체가 애플리케이션이다"라고 생각하세요.

오브젝트 (Object, 개체)

컴퓨터를 가만히 살펴보세요. 우선 모니터가 있고 본체가 있고 키보드가 있고... 옆에 마우스도 보이는군요. 본체를 사알~짝 뜯어보면 메인보드가 있고 CPU가 있고 RAM이 있고 비디오 카드 등이 있습니다. 이처럼 컴퓨터는 여러 가지 부품들의 조합으로 이루어져 있습니다. 이 때 컴퓨터라는 총합체가 Application이고 각각의 부품들(모니터, 키보드, CPU 등)이 오브젝트라고 생각하시면 되겠습니다.

아이들이 가지고 노는 장난감 중에 레고 Lego라는 것이 있지요? 여러 가지 형태의 조그만 부속품을 이리 맞추고 저리 끼우고 하여 집도 만들고 성도 만들고 배나 비행기도 만듭니다. 이 때 각각의 장난감 조각이 오브젝트이고 조각이 만들어 낸 집이나 비행기가 Application에 해당합니다. 그러고 보니 우리 주변에 보이는 모든 것이 무언가의 조합에 의해 이루어진 것이란 생각이 듭니다. 모든 것이 부품화 되어 있고 부속품을 조립하여 다른 완성품을 만들듯이 프로그래밍에 있어서도 이러한 개념이 도입되었는데 이것을 컴포넌트 Component 프로그래밍이라고 부릅니다.

로딩 중...

Source: unsplash.com

엑셀도 마찬가지입니다. 수많은 엑셀 부속품(위의 계보에서 Workbooks, Worksheets, Charts, Windows 등이 모두 여기에 해당)들이 모여서 만들어진 것이 '엑셀'이라는 프로그램입니다.

그런데 이렇게 부품화 해 놓으면 어떤 장점이 있는 것일까요? 예를 들어 자동차를 조립하는 회사에서 타이어를 하청업체로부터 공급받지 않고 직접 제조하고, 유리창도 다른 업체에서 받아오는 것이 아니라 자신들이 직접 생산한다면 얼마나 많은 중복되는 생산라인이 필요할 것이며, 얼마나 많은 기술력과 전문가들을 보유하고 있어야 하겠습니까? 아마도 생산 자체가 불가능 할 겁니다. 핵심 역량은 지속적으로 개발하고 주변의 것들은 필요할 때마다 외부에서 조달하는 것이 훨씬 효율적이겠지요.

Microsoft에서 엑셀을 개발하는 프로그래머들도 엑셀 신 버전을 만들 때, 모든 것을 만들거나 맨 처음부터 다시 시작하는 것은 아닙니다. 업그레이드한다는 것은 엑셀의 수많은 부품 중 일부를 보다 나은 부품으로 바꿔 끼우거나 기존에 없던 부품을 새로 꽂는 것을 의미합니다. 이런 방법을 택함으로써 효율적인 관리와 개선이 가능합니다.

오브젝트에는 두 가지 종류가 있습니다. 하나는 그냥 오브젝트이고 다른 하나는 컬렉션 Collection이라고 부르는 오브젝트 입니다. 아파트를 가만히 보면, A 아파트, B 아파트, C 아파트 등은 모두 아파트라는 보다 큰 카테고리에 속해 있습니다. 각각의 아파트는 서로 다른 것이지만 아파트들이라는 집합체(Collection) 속에 포함됩니다. 자동차 타이어를 예로 들어 보죠. 자동차에는 4개의 타이어가 있습니다. 각각의 타이어는 모두 오브젝트가 되겠고, 4개의 타이어를 합쳐서 '타이어'라는 컬렉션(집합체)으로 취급할 수 있습니다. 즉 타이어는 오브젝트인 동시에 컬렉션의 한 구성 요소입니다.

컬렉션은 A group of objects of the same class... 즉, 같은 클래스의 집합체입니다. 짜증이 막 날라구 그러지요?(클래스는 또 뭐야? 학급이란 뜻인가?) 많이 헷갈리시리라 생각됩니다. 위 엑셀 계보도에서 오브젝트 뒤에 s가 붙은 것(예를 들면 Workbooks, Worksheets, Names, Windows 등)은 모두 컬렉션 오브젝트라고 보시면 됩니다. 여러 개가 모여서 하나의 큰 덩어리를 이루고 있는 집합체라고만 알아 두세요. 앞으로 수도 없이 다룰 겁니다.

프로퍼티 (Property, 속성)

프로퍼티를 다른 말... 이라기 보다 우리 말로 '속성'이라고 합니다. 책을 오브젝트라고 가정한다면 프로퍼티는 그 책의 두께나 크기, 저자, 무게, 가격, 표지 색깔 등 오브젝트가 가진 '성질머리'라고 할 수 있습니다.

책.두께 = 566 페이지
책.표지색깔 = 빨간색
책.가격 = 20000원
책.저자 = 엑셀러

이렇게 표현할 수 있겠습니다. 이제 실제로 코딩은 어떻게 하는지 보도록 하죠. 아래의 코드를 모듈 시트에 복사해 넣고 실행시켜 보세요. 혹여라도 긴가민가 하는 분은 아래 게시물을 다시 한번 살펴보세요. 모든 것은 부단한 반복입니다.

모듈 시트를 삽입하고 코드를 작성하는 방법은 지난 시간에 소개해 드렸지요?

...잠잠...

(다시 한번) 드렸지요?

혹여라도 긴가민가 하는 분은 아래 게시물을 다시 한번 살펴보세요. 모든 것은 부단한 반복입니다.

Sub AboutProperty()
    Dim strTemp As String
    Answer = MsgBox(Msg, vbYesNo)
  
    strTemp = "안녕하세요 " & Application.UserName & "님!" & vbCr
    strTemp = strTemp & "현재 사용중인 엑셀 버전은 " & Application.Version & "입니다"

    MsgBox strTemp, , "www.iExceller.com"
End Sub

CODE

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
End Sub

CODE

어떤 일이 일어났나요? ValueProperty 프로시저를 실행시키니까 A1:A20 영역에 '안녕하세요!'라는 문자열이 한꺼번에 좌~악 입력되지요? 이것은 Range 오브젝트의 Value 프로퍼티를 이용한 것입니다. Range 오브젝트에 대해서는 다음 시간에 아주 자세히 다룰 예정입니다.

이번에는 ClearContentsMethod 프로시저를 실행시켜 보세요. A1:A20 영역에 입력되어 있던 값들이 순식간에 사라졌습니다. 이것은 Range 오브젝트의 ClearContents 메서드를 사용한 것입니다.

Sub ClearContentsMethod()
    Dim i As Integer
    For i = 1 To 20
      Cells(i, 1).ClearContents
    Next
End Sub

CODE

이쯤 오면 무지 헷갈리기 시작합니다. Exceller가 위에서 프로퍼티와 메서드는 분명히 다르다고 하니까 그런가 보다 하고 넘어왔는데 어떻게 다른 것인지, 그리고 어떨 때 프로퍼티를 쓰고 또 다른 경우에는 메서드를 사용하는지 등등.

프로퍼티와 메서드는 둘 다 오브젝트를 움직이게 하는 수단입니다. 차이가 있다면, 달리게 한다거나 잠을 자게 한다거나 눈을 깜빡이게 한다거나 하는 등 동사적 변화를 주는 것은 메서드, 머리 색깔이나 눈동자 색깔을 묘사하는 것과 같이 형용사적 변화를 주는 것은 프로퍼티라고 생각하시면 되겠습니다.

다음 시간에는 아주 중요한 (그렇다고 이번 강의나 지난 강의가 중요하지 않다는 것은 절대 아님) Range 오브젝트를 포함한 몇 가지 오브젝트에 대해 살펴보겠습니다.

"어서 빨리 하늘을 날아다니고 싶은데 날으는 기술은 안 가르쳐주고 왜 자꾸 이상한 것만 가르쳐 줘요?"

이렇게 생각하는 분도 있으리라 생각됩니다. 날기 위해서는 사전에 많은 준비가 필요합니다. 한 송이 국화꽃을 피우기 위해서는 이른 봄부터 소쩍새가 몹시도 시끄럽게 울어야 하듯이 말이지요. 그래서 앞으로도 한동안은 안 날아다닐 겁니다(VBA 배워도 날아다닐 순 없답니다 ^^).