예제 파일 내려받기
VBA 입문강좌 : Introducing VBA
Visual Basic 이라고 하니까, '그거... 예전에 사용하던 BASIC과 비슷한 언어가 아닌가?' 하고 생각하는 분이 혹시 있을지도 모르겠습니다. 맞습니다! 하지만 사실 그 뿌리는 BASIC에 두고 있습니다만 예전의 BASIC 언어와는 사뭇 다릅니다.
BASIC & VB에 관한 기초 지식
BASICBeginner's All purpose Symbolic Instruction Code 이라는 프로그래밍 언어는 1964년 미국의 Dartmouth 대학에서 개발한 프로그래밍 언어입니다. BASIC이라는 단어에서도 알 수 있듯이 배우기가 상대적으로 용이한 언어라고 할 수 있습니다. 즉 이 언어는 일반 사용자들도 쉽게 프로그래밍 할 수 있도록 하기 위해 인간의 언어(당연히 영어겠지요 ^^)와 유사하게 만들어진 언어라는 점에서 당시로서는 획기적인 일이었습니다.
하여튼 이렇게 개발된 BASIC은 오랜 세월을 거치면서 꾸준히 발전을 하게 됩니다. 그러나 초기의 개발 컨셉처럼 '배우기는 (다른 랭귀지보다) 상대적으로 쉬운 편'이지만 깊이 들어가면 갈수록 불편한 점이 한 두가지가 아니었으므로 프로그래밍을 처음 입문하는 단계에서 거쳐가는 언어라는 인식이 강했습니다. 이런 연유로 소위 컴퓨터 전문가들로부터는 천대를 받아온 것이 사실입니다. 그러다가 1991년 Microsoft 사가 윈도우용 VBVisual Basic for Windows를 세상에 내놓으면서부터 세간의 주목을 받게 됩니다. 이 제품이 나오면서부터 윈도우용 독립 실행 애플리케이션stand-alone application을 손쉽게 만들 수 있게 되었습니다. 결국 Visual Basic은 BASIC에 뿌리를 두고 있으되 초기의 그것과는 사뭇 다른 형태를 갖추게 된 것이지요.
Visual BASIC과 같은 언어를 4세대 언어4GL라고 하며, 별도의 독립된 프로그램 개발 전문 도구입니다. 과거 BASIC언어에서 개체지향형Object-oriented 언어로 탄생한 새로운 개념의 언어입니다. '개체지향형'이라고 하고 보니까 아주 그럴 듯 해 보입니다만 알고 보면 별 것도 아닙니다. BASIC과 같은 3세대 언어에서는 하나에서 열까지 모두 새로 만들어 사용해야만 했습니다. 예를 들어서 네모 박스를 하나 그리려고 해도 점을 하나하나 찍어서 사각형을 만들어 낼 수 밖에 없는, 속된 말로 맨 땅에 헤딩을 할 수 밖에 없었습니다. 또한 이렇게 어렵사리 한번 작성한 것도 이곳 저곳에서 불러다 사용하기가 매우 힘이 들어 매번 맨땅에 대고 헤딩(?)을 해야 하는 경우도 적지 않았습니다.
그러던 것이 Visual BASIC이 등장하면서부터는 웬만한 것들은 이미 다 만들어져 있어서 프로그래머는 원하는 것을 마우스로 콕콕 찍어주기만 하면 되게 되었습니다. 그래서 Visual 이라는 수식어가 앞에 붙었습니다(아마 그럴 것입니다). 그리고 이렇게 만들어진 네모 박스 같은 것을 오브젝트Object라고 합니다. 이것을 그냥 오브젝트라고 부르면 좋을 것을... 개체니 객체니 하고 굳이 번역을 해 놓아야 직성이 풀리는 모양이더군요. 원래 의미대로 하자면 개체보다는 객체가 어울릴 듯 합니다.
그러면 VBA란 무엇인가
엑셀을 수년 동안 사용해 오던 분 중에서도 엑셀에 VBA 엔진이 장착되어 있다는 사실조차 모르고 지내는 분이 많더군요.
"그러면... VB는 그렇게 해서 탄생하였다는 것을 알겠는데 VBA는 또 머여요?"
이런 의문이 드시지요?(들어야 정상입니다. ^^) VBA란 Visual Basic for Application의 줄임말 입니다. 즉 VB는 VB인데 특정한 애플리케이션을 위한 VB라는 의미가 되는 것입니다. "그러면 Application은 또 뭔데요?" 하는 분이 저기 계시는군요. 그냥 쉽게 엑셀이나 워드, 파워포인트 등을 의미한다고 생각하세요. 따라서 엑셀에서 VB를 다룬다면 Visual Basic for Excel Application이 되고, 워드에서 접근한다면 Visual Basic for Word Application가 되겠지요. 실제로 VB 등에서 프로그래밍을 할 때에는 그냥 Application이라고 쓰는 대신, Excel.Application 또는 Word.Application 등과 같은 형태로 사용합니다.
현재 엑셀은 10번째 버전까지 나와 있습니다. 엑셀 XP 또는 엑셀 2002 이라고 불리는 것이 바로 그것입니다. 엑셀에 VBA가 포함된 것은 엑셀 5버전부터이며, 오피스 2000버전부터는 모든 응용 프로그램에 VBA 엔진이 장착되었습니다(Auto CAD 같은 다른 벤더들의 Application에도 VBA가 포함되어 있습니다). 따라서 만약 여러분이 엑셀에 붙어있는 (다른 VBA에 비해 상대적으로 복잡한) VBA를 마스터하신다면 다른 애플리케이션의 VBA도 덩달아 마스터하게 됨은 물론이려니와 다른 애플리케이션을 위한 솔루션을 개발할 수도 있게 되는 것입니다. 매력적이지 않습니까?
Introducing Visual Basic Editor
자... 그렇다면 그런 훌륭한 프로그래밍 도구가 Excel의 어느 구석에 자리잡고 있는지 살펴보지 않을래야 않을 재간이 없지요? 도구 - 매크로 - Visual Basic Editor 메뉴를 선택합니다(또는 Alt + F11 키를 눌러도 됩니다). 그러면 그림과 같은 Visual Basic Editor(이하 VB Editor)가 나타납니다. 사용자마다 이 화면의 모양새가 조금씩 틀리겠지만 일단 이 4개의 창이 가장 기본이 되는 것이라 할 수 있습니다. 따라서 VB Editor의 각 창에 대해 살펴보도록 하겠습니다.
1. 프로젝트 탐색기Project Explorer window

|
'탐색기'라는 단어에서도 알 수 있듯이 현재 열려있는 파일(Workbook), 그 파일이 담고 있는 개체 등에 대한 정보를 제공해 주는 창입니다.
만약 이 창이 화면에 나타나 있지 않다면 VB Editor 상태에서 보기 - 프로젝트 탐색기 상태에서 보기 - 프로젝트 탐색기 메뉴를 선택하거나 Ctrl + R 키를 누릅니다. 프로젝트라고 하니까 뭔가 전문가적인 냄새(?)가 나고 거창해 보이는데 워크북(엑셀 파일)이나 추가기능Add-in 파일 등이 각각 하나의 프로젝트 입니다.
왼쪽 그림에서 + 표시가 되어 있는 부분을 클릭하면 - 표시로 바뀌면서 하위의 개체들이 펼쳐집니다. 반대로 - 표시가 되어있을 때 이 부분을 클릭하면 하위의 오브젝트들이 숨겨집니다. |
2. 속성 창Property window

|
해당 개체오브젝트의 속성프로퍼티 값에 대한 정보를 보여줍니다. 이 창에서 속성값들을 직접 변경해 줄 수 있습니다.
만약 속성 창이 보이지 않는다면 보기 - 속성 창 메뉴를 선택하거나 F4 키를 누르면 나타날 것입니다. |
3. 코드 입력 창Code window
매크로 기록기를 사용해서 기록을 하거나 사용자가 직접 코드를 입력할 수 있는 창입니다. 해당 파일에 모듈 시트가 하나도 없다면 이 창은 회색 바탕의 공백 화면으로 보일 수도 있습니다. 만약 이 창이 화면에 나타나 있지 않다면 VB Editor 상태에서 보기 - 코드 메뉴를 선택하거나 F7 키를 눌러주면 나타날 것입니다.

4. 직접 실행 창Immediate window
VBA는 뛰어난 디버깅Debugging, 오류 바로 잡기 도구를 가지고 있는데 그 중 하나가 이 직접 실행 창입니다. 말 그대로 입력한 코드가 잘 작동하는지의 여부를 '직접 실행해 볼 수 있는 창'입니다. 사용해 보면 아주 편리한 도구라는 것을 알 수 있습니다. 직접 실행 창이 보이지 않으면 보기 - 직접 실행 창 메뉴를 선택하거나 Ctrl + G 키를 누릅니다.

코드 창Code window에서 작업하기
이상에서 VBA의 얼굴이라고 할 수 있는 VB Editor window에 대해 살펴보았습니다. 이제 여러분들이 VBA와 친해질수록 점점 더 많은 시간을 보내게 될 코드 창Code window에서 코드를 작성하고 실행하는 방법에 대해 탐험해 보겠습니다.
(1) 파일 - 새로 만들기 메뉴를 선택하여 새로운 통합 문서를 하나 만듭니다.
(2) 도구 - 매크로 - Visual Basic Editor 메뉴를 선택하여 VB Editor 창으로 들어갑니다.
(3) 삽입 - 모듈 메뉴를 선택하면 모듈이 한 장 삽입됩니다. 만약 코드 창 윗부분에 Option Explicit라는 문장이 나타나면 삭제를 하거나 앞에 '(작은 따옴표)를 붙여 주석으로 처리합니다.
(4) 코드 창에 아래와 같이 코드를 입력합니다.
Sub 안녕하세요() Msg = Application.UserName & "님 안녕하세요?" Answer = MsgBox(Msg, vbYesNo)
If Answer = vbYes Then MsgBox "안녕하시다니 다행이네요!" Else MsgBox "저런, 무슨 일이 있었나요?" End If End Sub |
(5) 입력이 끝났으면 실행을 시켜 보아야겠지요? 실행을 시키는 데에는 몇 가지 방법이 있습니다. 실행하고자 하는 코드 내에 커서를 위치시킨 다음,
① F5 키를 누르는 방법
② 실행 - Sub/사용자 정의 폼 실행 메뉴를 사용하는 방법
③ 도구 모음에 있는 실행 아이콘을 클릭하는 방법
어떤 방법을 선택하느냐는 여러분의 가치관(... 이랄 것 까지야 없겠군요 ^^)에 따라 편한 방법을 골라 쓰시면 됩니다. 이 세 가지 방법 중 하나를 선택하면 다음과 같은 메시지 박스가 나타날 것입니다.
예 또는 아니오 버튼 중 하나를 눌러보면 코드로 작성한 메시지가 나타납니다.
컴퓨터(엑셀) 한테서 인사를 받아본 기분이 어떠신가요? 그저 딱딱한 기계 덩어리로만 생각해 오던 컴퓨터가 보다 인간적인 모습으로 다가오지 않나요? ^^ 코드를 살펴보도록 하지요.
Sub 안녕하세요() ... 어쩌고 저쩌고... End Sub |
이처럼 Sub로 시작해서 End Sub로 끝나는 코드를 프로시저 또는 서브 프로시저라고 부릅니다. 즉 Sub ~ End Sub 사이에 코드를 작성함으로써 컴퓨터에게 작업 지시를 내리는 것입니다.
... 어쩌고 저쩌고...
Msg = Application.UserName & "님 안녕하세요?" Answer = MsgBox(Msg, vbYesNo)
... 어쩌고 저쩌고... |
Application.UserName 이라는 것은 현재 애플리케이션(즉 엑셀)의 사용자명을 알아내는 명령어입니다. 엑셀을 설치할 때 사용자 기본 정보를 입력하게 되는데 이 때 등록된 사용자명을 알아냅니다. 그런 다음 & 연산자를 이용하여 두 개의 문자열로 합쳐서 Msg라는 문자열 변수에 값을 저장해 둡니다.
MsgBox 함수는 메시지 박스를 화면에 띄워주는 함수입니다. 직접 실행 창에다가 아래와 같이 입력하고 엔터키를 쳐 보세요. '안녕하세요?' 라는 메시지 박스가 나타납니다.
Msgbox "안녕하세요?"
그런데 MsgBox 함수에 보니까 vbYesNo라는 이상한 것이 있지요? 이것을 내장 상수Built-in constants라고 하는데 MsgBox에 어떤 버튼이 표시되도록 할 것인지를 지정합니다. 아래와 같이 다양한 값을 지정해 줄 수 있습니다.
상 수 |
값 |
설 명 |
vbOKOnly |
0 |
확인 단추 전용(default) |
vbOKCancel |
1 |
확인, 취소 단추 |
vbAbortRetryIgnore |
2 |
중지, 다시 시도, 무시 단추 |
vbYesNoCancel |
3 |
예, 아니오, 취소 단추 |
vbYesNo |
4 |
예, 아니오 단추 |
vbRetryCancel |
5 |
다시 시도, 취소 단추 |
vbCritical |
16 |
치명적 오류 메시지 |
vbQuestion |
32 |
경고 질문 |
vbExclamation |
48 |
경고 메시지 |
vbInformation |
64 |
정보 메시지 |
vbDefaultButton1 |
0 |
첫째 단추가 기본값입니다(default) |
vbDefaultButton2 |
256 |
둘째 단추가 기본값입니다 |
vbDefaultButton3 |
512 |
셋째 단추가 기본값입니다 |
vbDefaultButton4 |
768 |
넷째 단추가 기본값입니다 |
vbApplicationModal |
0 |
응용 프로그램 모달 메시지 상자(default) |
vbSystemModal |
4096 |
시스템 모달 메시지 상자 |
vbMsgBoxHelpButton |
16384 |
메시지 상자에 도움말 단추를 추가합니다 |
vbMsgBoxSetForeground |
65536 |
메시지 상자를 전경 창으로 지정합니다 |
vbMsgBoxRight |
524288 |
텍스트가 오른쪽 맞춤 되었습니다 |
vbMsgBoxRtlReading |
1048576 |
히브리어와 아랍어 시스템의 경우 텍스트의 읽기 방향이 오른쪽에서 왼쪽으로 나타나도록 지정합니다 | |
여기서 상수 대신 값을 써 주어도 됩니다. 즉 아래 두 문장의 결과는 같습니다.
MsgBox "안녕하세요?",vbYesNo MsgBox "안녕하세요?",4
화면에 두 개의 버튼이 있는 MsgBox가 나타나는데 사용자는 이 중에서 하나의 버튼을 누르게 됩니다. 예와 아니오 중 어느 것을 선택했는지 알아야 나중에 다른 작업을 할 수 있겠지요? 어떤 버튼을 눌렀는지를 파악해서 Answer라는 변수에 담아두는 과정이 아래의 한 줄로 해결이 됩니다.
Answer=MsgBox(Msg,vbYesNo)
워크시트에서 If 구문을 사용할 때,
If(조건식, 참인 경우, 거짓인 경우)
이러한 형태로 사용을 하였지요? VBA 상에서도 비슷한 형태로 사용합니다. Answer라는 변수에 저장된 값이(즉 사용자가 선택한 버튼이) vbYes 이면 안녕하시다니 다행이네요! 메시지를, 저장된 값이 vbNo라면 저런, 무슨 일이 있었나요? 라는 메시지 박스가 화면에 나타납니다.
If Answer=vbYes Then MsgBox "안녕하시다니 다행이네요!" Else MsgBox "저런 무슨 일이 있었나요?" End If
이 때 MsgBox 함수의 반환값은 상수 형태를 사용해도 되고 값 형태를 사용해도 됩니다. 즉 위의 코드는 아래와 같이 바꿀 수 있다는 얘기가 되지요. 어떤 것이 편리한 지는 자명할 것입니다.
If Answer=6 Then MsgBox "안녕하시다니 다행이네요!" Else MsgBox "저런 무슨 일이 있었나요?" End If
상 수 |
값 |
설 명 |
vbOK |
1 |
확인 |
vbCancel |
2 |
취소 |
vbAbort |
3 |
중단 |
vbRetry |
4 |
다시 시도 |
vbIgnore |
5 |
무시 |
vbYes |
6 |
예 |
vbNo |
7 |
아니오 | |
한꺼번에 너무 많이 하면 머리에 쥐가 날 지도 모르니까 이번 강좌는 여기서 접도록 하지요. 예? 이미 너무 많이 해서 머리가 아프시다구요?... |