Excel & IT Info

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

VBA

[VBA 입문] 03강. Excel VBA 필수 개념 4가지

권현욱(엑셀러) 2023. 9. 27. 09:00
반응형

들어가며

무슨 일을 하든 허들(hurdle)이 있게 마련입니다. 현실에서의 허들이라면 돌아가거나 넘지 않을 수도 있지만 VBA 코딩에서는 그럴 수도 없는 노릇입니다. 자칫 허들이 될 수도 있는 주제이지만 현실적인 사례와 예제를 통해 쉽게 살펴보겠습니다. 준비되셨나요? 출발합니다.

권현욱(엑셀러) | 아이엑셀러 닷컴 대표 · Microsoft Excel MVP · Excel 솔루션 프로바이더 · 작가
이 콘텐츠는 <엑셀 VBA 파워 코딩의 정석>(권현욱 저, 디지털북스 출간)에서 편집, 인용한 것입니다.

애플리케이션

이제 VBA의 얼굴과 좀 친해지셨나요? VBA가 사람도 아닌데 얼굴이 어디 있나고요? [개발 도구] 탭 - [코드] 그룹 - [Visual Basic]을 클릭하거나 F11 키를 누르면 나타나는 화면이 VBA의 얼굴입니다. 엑셀도 나름 뼈대(?)  있는 집안이라 족보 (hierarchy)가 있습니다. 엑셀 집안의 족보를 잠깐 눈여겨보세요.

 

(이미지 출처: 아이엑셀러 닷컴)

 

위의 Excel 계보에서 애플리케이션(Application)은 Excel입니다. 만약 워드에서 VBA를 사용한다면 Application은 워드가 되고, 파워포인트에서 VBA를 사용한다면 Application은 파워포인트가 됩니다. 이 중 Excel VBA에 딸린 식솔들이 가장 많고 똘똘한 친구도 즐비합니다.

이제 애플리케이션이 무엇인지 감이 좀 잡히시나요? 잡힐 듯 말 듯하시다고요? "엑셀 그 자체가 애플리케이션이다"라고 생각하세요. 물론 워드라면 워드 그 자체가 애플리케이션이라고 할 수 있겠죠.


오브젝트

여러분 앞에 있는 컴퓨터를 보세요. 모니터가 있고 본체가 있고 키보드가 있고 그 옆에 마우스도 있습니다. 본체 안을 보면, 메인보드가 있고 CPU가 있고 RAM이 있고 비디오 카드 등이 있습니다. 이처럼 컴퓨터는 여러 가지 부품들의 조합입니다. 이때 컴퓨터라는 집합체가 Application이고 각 부품들이 오브젝트(object: 개체)에 비유할 수 있습니다.

 

장난감 중에 레고(Lego)라는 것이 있지요? 여러 가지 형태의 조그만 부속품을 이리 맞추고 저리 끼우고 하여 집도 만들고 성도 만들고 배나 비행기도 만듭니다. 이 때 각각의 장난감 조각이 오브젝트이고, 조각이 만들어 낸 집이나 비행기가 Application에 해당합니다.

 

그러고 보니 우리 주변에 보이는 모든 것이 무언가의 조합에 의해 이루어진 것이란 생각이 듭니다. 엑셀도 마찬가지입니다. 수많은 엑셀 부속품(워크시트, 차트, 각종 도형, 표 등)들이 모여서 만들어진 것이 '엑셀'이라는 프로그램입니다.

 

그런데 이렇게 부품화 해 놓으면 어떤 장점이 있을까요? 모든 걸 자체 조달하는 어느 자동차회사를 상상해 보세요. 타이어를 하청업체로부터 공급받지 않고 직접 제조하고, 유리창도 자신들이 직접 생산하고, 카시트, 헤드램프, 심지어 인포테인먼트 시스템까지 내재화되어 있습니다.

 

이 회사에는 얼마나 많은 라인 중복이 발생할 것이며, 얼마나 많은 기술력과 전문가들을 자체 보유하고 있어야 할지는 보지 않아도 뻔합니다. 아마 생산 자체가 불가능할 겁니다. 핵심 역량은 지속적으로 개발하고 주변 요소들은 필요할 때마다 외부에서 조달하는 것이 훨씬 효율적이겠지요 (전기차는 예외일 수 있습니다).

 

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


컬렉션 오브젝트

오브젝트에는 두 가지 종류가 있습니다. 하나는 일반적인 오브젝트이고 다른 하나는 컬렉션(collection)이라고 부르는 오브젝트입니다. 아파트를 떠올려 보세요. 롯데 아파트, 삼성 아파트, 현대 아파트 등은 모두 아파트라는 보다 큰 카테고리에 속해 있습니다. 각각의 아파트는 서로 다른 것이지만 '아파트'라는 보다 큰 범주 속에 포함됩니다. 

 

(이미지 출처: unsplash.com)

 

자동차 타이어도 마찬가지입니다. 자동차에는 4개의 타이어가 있습니다. 각각의 타이어는 오브젝트가 되겠고, 4개의 타이어를 합쳐서 '타이어'라는 컬렉션(집합체)이라고 할 수 있습니다. 타이어는 오브젝트인 동시에 컬렉션을 이루는 구성 요소입니다.

 

앞으로 공부하다 보면 Workbooks, Worksheets, Names, Windows 등과 같이 오브젝트 뒤에 's'가 붙는 형태가 많이 나올 겁니다. 그럴 때면 '아, 이건 컬렉션 오브젝트구나'라고 이해하시면 됩니다. 컬렉션 오브젝트는 '여러 개가 모여서 하나의 큰 덩어리를 이루고 있는 집합체'라고만 알아 두세요.

 

프로퍼티

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

 

 

이런 책이 있습니다. 이 책의 특징을 VBA에서 사용하는 프로퍼티 개념을 빌려와서 표현한다면 이렇게 나타낼 수 있습니다.

 

이 책.두께 = 500 page
이 책.표지 색깔 = Yellow
이 책.가격 = 23000원
이 책.저자 = 권현욱

 

실제 VBA 문법을 사용하여 프로퍼티를 적용해 보겠습니다. 워크시트 상태에서 ALT + F11 키를 눌러 VB Editor를 표시합니다. 모듈을 하나 삽입하고([삽입] - [모듈] 메뉴) 아래 코드를 입력합니다(직접 입력 또는 '복/붙').

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

    MsgBox sTemp
End Sub

프로시저 내부를 클릭하여 커서를 둔 채 F5 키를 눌러 실행시키면 아래와 같은 결과가 나타납니다.

 

 

UserName은 엑셀을 설치할 때 입력한 사용자 이름, Version은 설치된 엑셀 버전 정보를 알려주는 프로퍼티입니다. 이때 사용하고 있는 엑셀 버전이나 사용자 이름 등에 대한 정보는 Application 오브젝트가 가지고 있습니다.

 

현실에서도 사정은 크게 다르지 않습니다. 창고에 TV가 몇 대 남아 있고, 냉장고 재고 상태가 어떤 지 알려면 재고 담당자에게 물어야지 생산설비 담당이나 연구소 직원에게 물어서는 답이 나오기 어렵습니다.

 

VBA로 프로그래밍을 한다는 것은 누가(즉 어느 오브젝트가) 어떤 정보를 가지고 있는지 파악해서 일을 시키는 것이라 할 수 있습니다. 그러기 위해서 오브젝트들과 친해져야 하고, 각 오브젝트의 성격이나 특징을 파악하고 있어야겠죠.


메서드

기왕 문법 얘기가 나왔으니 이어가 보겠습니다. 프로퍼티는 '형용사', 메서드는 '동사'에 비유할 수 있습니다.

 

갑돌이가 잠을 잔다
영식이가 달려간다
만득이가 눈을 깜빡거린다
바둑이가 짖는다
비가 내린다

 

여기서 갑돌이, 영식이, 만득이 등은 오브젝트입니다. 반면 잠을 잔다, 달려간다, 눈을 깜빡거린다 처럼 오브젝트에 대한 동작 명령은 메서드(method: 방법)라고 합니다. 메서드는 오브젝트를 움직이도록 만드는 수단입니다.

 

모든 오브젝트는 적어도 한 개 이상의 프로퍼티나 메서드를 가지고 있습니다. 그리고 오브젝트에 명령을 내릴 때, 프로퍼티

를 이용할 수도 있고 메서드를 사용할 수도 있습니다.

 

갑돌이.잠 = True

 

이렇게 갑돌이의 상태를 프로퍼티로 표현할 수도 있고, 아래와 같이 메서드로 나타낼 수도 있습니다.

 

갑돌이.잠을 잔다

 

두 가지 방법 중 어떤 것을 선택할 것인가는 프로그래머가 그때그때 상황에 맞게 골라서 쓰면 됩니다. 다음 코드를 모듈에 붙여 넣고 실행시켜 보세요.

Sub ValueProperty()
    Dim i As Integer
    For i = 1 To 20
      Cells(i, 1).Value = "안녕하세요!"
    Next
End Sub

 

어떤 일이 일어났나요? 프로시저를 실행시키니까 A1:A20 셀에 '안녕하세요!'라는 문자열이 한꺼번에 좌~악 입력되죠? 이것은 Range 오브젝트의 Value 프로퍼티를 이용한 겁니다. 여기서 For ~ Next를 반복문이라고 합니다. 반복문은 아직 배우지 않았지만 '무언가를 지정한 횟수(여기서는 20번) 만큼 반복하는구나'라는 것을 눈치로 파악할 수 있습니다.

 

반복문이나 Range 오브젝트는 프로그래밍에서 매우 매우 중요한 개념입니다. 별도 강의를 통해 다루겠습니다.


나가며

강의에서 사용된 2개의 코드는 짧지만 그 자체로서 완벽하게 기능하는 코드입니다. 숫자를 조금씩 바꿔가면서 VBA 코딩에 익숙해져 보시기 바랍니다. 아, 앞에서 입력한 내용을 지우는 코드를 알려드리지 않았군요. 이 코드를 소개하면서 이번 강의를 마칩니다. ClearContents 메서드를 이용하면 셀 서식은 그대로 둔 채, 내용만 제거할 수 있습니다.

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

 

 

Excel과 VBA의 모든 것 아이엑셀러 닷컴 · 강사들이 숨겨 놓고 보는 엑셀러TV

반응형