• 최초 작성일: 2002-11-19
  • 최종 수정일: 2022-07-10
  • 조회수: 375,005 회
  • 작성자: 엑셀러 권현욱
  • 강의 제목: Introducing VBA ㅡ Visual Basic for Application

엑셀러 권현욱

들어가기 전에 ㅡ VBA 강의를 시작하며

VBA 입문 강의 포맷을 모던(?)하게 업데이트 하였습니다. 내용 상의 변화는 크게 없으며 일부 이미지를 추가하거나 교체하였습니다. 강의 맨 아래 쪽에 '좋아요(Favorite)' 표시나 댓글을 남기실 수 있습니다.

최초 작성일이 2002년 11월이군요. 오랜 세월이 지났음에도 여전히 변함 없이 관심을 가져주시는 모든 분들께 감사 인사 드립니다.

안녕하세요? Exceller 입니다. 그간 틈틈이 VBA 강의를 진행해 왔는데, 이런 요청을 하신 분들이 더러 있었습니다.

"누구 널뛰듯 하지 말고, 제발 VBA의 기초부터 차근차근 체계적으로 설명해 줄 수 없느냐?"

하고 말이지요(물론 반말을 하신 것은 아니고 정중히 요청!).

해서, EXCEL 강좌 300회 돌파를 자축하며 그동안 벼르고 벼르던 VBA 입문 강의를 시작하려 합니다. VBA 기초 및 프로그래밍의 기본 개념을 여러분들이 잘 정립하실 수 있도록 말입니다. 말 그대로 '입문 강의'이므로 부담없이, 가벼운 마음으로 즐겨보시기 바랍니다(이렇게 지극 정성으로 하는데도 안 배운다고 버티는 분이 있을래나? ^^).

기존 EXCEL과 VBA 강의는 그대로 병행할 계획이므로 본 입문 강의는 가끔, 아주 가끔 업데이트 될 예정입니다. 강의가 빨랑빨랑 올라오지 않는다고 화내기 없깁니다.



호랭이 담배 피던 시절 이야기 하나 ㅡ BASIC & VB 기초 지식

BASIC Beginner's All purpose Symbolic Instruction Code 이라는 프로그래밍 언어는 1964년 미국의 Dartmouth 대학에서 개발한 프로그래밍 언어입니다. BASIC이라는 단어에서도 알 수 있듯이 배우기가 상대적으로 용이한 언어라고 할 수 있습니다. 즉 이 언어는 일반 사용자들도 쉽게 프로그래밍 할 수 있도록 하기 위해 인간의 언어(당연히 영어^^)와 유사하게 만들어진 언어라는 점에서 당시로서는 획기적인 일이었습니다.

BASIC

Source: https://history-computer.com/

하여튼 이렇게 개발된 BASIC은 오랜 세월을 거치면서 꾸준히 발전하게 됩니다. 그러나 초기의 개발 컨셉처럼 '배우기는 (다른 랭귀지보다) 상대적으로 쉬운 편'이지만 깊이 들어가면 갈수록 불편한 점이 한 두가지가 아니었으므로 프로그래밍을 처음 입문하는 단계에서 거쳐가는 언어라는 인식이 강했습니다. 이런 연유로 소위 컴퓨터 전문가들로부터는 천대를 받아온 것이 사실입니다.

그러다가 1991년 Microsoft 사가 윈도우용 VB Visual Basic for Windows를 출시하면서부터 세간의 주목을 받게 됩니다. 이 제품이 나오면서부터 윈도우용 독립 실행 애플리케이션 stand-alone application을 손쉽게 만들 수 있게 되었습니다. 결국 Visual Basic은 BASIC에 뿌리를 두고 있으되 초기의 그것과는 사뭇 다른 형태를 갖추게 된 것이지요.

BASIC

Visual Basic for Windows

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 등과 같은 형태로 사용합니다.

엑셀에 VBA가 포함된 것은 엑셀 5버전부터이며, 오피스 2000버전부터는 모든 응용 프로그램에 VBA 엔진이 장착되었습니다. 따라서 만약 여러분이 엑셀에 붙어있는 (다른 VBA에 비해 상대적으로 복잡한) VBA를 마스터한다면 다른 애플리케이션의 VBA도 덩달아 마스터하는 것은 물론이려니와 다른 애플리케이션을 위한 솔루션을 개발할 수도 있게 됩니다. 매력적이지 않습니까?

Introducing Visual Basic Editor

그렇다면 이런 훌륭한 프로그래밍 도구가 Excel의 어느 구석에 자리잡고 있는지 살펴보지 않을 재간이 없지요? 엑셀 버전에 따라 메뉴가 다를 수 있지만 메뉴 중에서 [개발 도구] - [Visual Basic]을 선택하거나 Alt + F11 키를 눌러 보세요. 그러면 그림과 같은 Visual Basic Editor(이하 VB Editor)가 나타납니다. VB Editor에서 가장 기본이 되는 4개의 창에 대해 살펴보겠습니다.

로드 중...

Visual Basic Editor (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에 대해 살펴보았습니다. 이제 여러분들이 VBA와 친해질수록 점점 더 많은 시간을 보내게 될 '코드 창'에서 코드를 작성하고 실행하는 방법에 대해 탐험해 보겠습니다.

(1) 파일 - 새로 만들기 메뉴를 선택하여 새로운 통합 문서를 하나 만듭니다.

(2) [개발 도구] - [Visual Basic] 또는 Alt + F11 키를 눌러서 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

CODE

입력이 끝났으면 실행을 시켜봐야겠죠? 프로시저를 실행하는 데에는 여러 가지 방법이 있습니다. 실행하고자 하는 코드 내에 커서를 둔 다음 아래 방법 중 하나를 사용해 보세요.

  • F5 키를 누른다.
  • [실행] - [Sub/사용자 정의 폼 실행] 메뉴를 사용한다.
  • 도구 모음에 있는 실행 아이콘을 클릭한다.

이것 말고도 더 있습니다만 이 정도가 프로그램을 실행하는 대표적인 방법입니다. 본인에게 편한 것을 사용하시면 됩니다. 프로그램을 실행하면 다음과 같은 메시지 박스가 나타납니다.

로드 중...

[예] 또는 [아니오] 버튼 중 하나를 눌러보면 코드로 작성한 메시지가 나타납니다.

로드 중... 로드 중...

컴퓨터(엑셀) 한테서 인사를 받아본 기분이 어떠신가요? 딱딱한 기계 덩어리로만 생각했던 컴퓨터가 보다 인간적인 모습으로 다가오지 않나요? 코드를 살펴보죠.

Sub 안녕하세요()
    ... 어쩌고 저쩌고...
End Sub

이처럼 Sub로 시작해서 End Sub로 끝나는 코드를 프로시저 또는 서브 프로시저 Sub Procedure라고 부릅니다. 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

CODE

이 때 MsgBox 함수의 반환값은 상수 형태를 사용해도 되고 값 형태를 사용해도 됩니다. 즉 위의 코드는 아래와 같이 바꿀 수 있다는 얘기가 되지요. 어떤 것이 편리한 지는 자명하리라 생각합니다.

If Answer=6 Then
    MsgBox "안녕하시다니 다행이네요!"
Else
    MsgBox "저런 무슨 일이 있었나요?"
End If

CODE

MsgBox에서 반환되는 값과 상수를 정리하면 아래 표와 같습니다.

상수 설명
vbOK 1 확인
vbCancel 2 취소
vbAbort 3 중단
vbRetry 4 다시 시도
vbIgnore 5 무시
vbYes 6
vbNo 7 아니오

한꺼번에 너무 많이 하면 머리에 쥐가 날 지도 모르니까 이번 강의는 여기까지 하도록 하죠.
예? 이미 머리에 충분히 쥐가 났다고요?