들어가며
지난 오리엔테이션 시간을 통해 VBA에 대한 기본 개념, VBA를 배워두면 뭐가 좋은 지에 대해 살펴보았습니다. 본격적으로 VBA를 알아보도록 합니다. 준비되셨나요? 출발합니다.
VBA의 얼굴, Visual Basic Editor
우리가 VBA로 코딩하는 과정은 Visual Basic Editor(이하 VB Editor)라는 공간에서 이루어집니다. VB Editor에 접근하는 방법은 크게 2가지입니다.
리본 이용
[개발 도구] 탭 - [코드] 그룹 - [Visual Basic] 명령을 선택합니다.
[개발 도구] 탭이 보이지 않는다면?
- 리본의 빈 영역을 우클릭하고 [리본 메뉴 사용자 지정] 선택
- [Excel 옵션] 대화상자에서 [개발 도구] 항목에 체크 - [확인] 클릭
단축키 이용
단축키를 사용하면 더욱 편리합니다. ALT + F11 키를 눌러 보세요. VBA를 사용한다면 이 단축키는 반드시 기억해 두시기 바랍니다. 물론 아무리 기억력이 좋지 않아도 조만간 기억하게 되긴 합니다(정말입니다).
두 가지 방법 중 하나를 사용하면 그림과 같은 화면이 나타납니다. 이것이 바로 VBA의 얼굴, VB Editor입니다.
초기 설정 상태에 따라 화면 구성은 위 이미지와 다를 수 있습니다. 화면을 맞추는 방법에 대해서는 이어서 설명이 나오니까 계속 진도를 나가시기 바랍니다.
4가지 중요한 창 (Window)
(1) 프로젝트 탐색기
'탐색기'라는 단어에서도 알 수 있듯이 현재 열려있는 통합 문서(Workbook), 그 문서가 담고 있는 워크시트 등에 대한 정보를 보여주는 창입니다. 만약 이 창이 보이지 않는다면 VB Editor에서 [보기] - [프로젝트 탐색기] 메뉴를 클릭하거나 CTRL + R을 누릅니다.
프로젝트라고 하니까 뭔가 전문가적인 냄새(?)가 나고 거창해 보이는데, 워크북(엑셀 파일)이나 추가 기능 파일 등이 하나의 프로젝트입니다. [+]를 클릭하면 [-]로 바뀌면서 하위 개체들이 펼쳐집니다. [-]를 클릭하면 반대로 하위 개체들이 숨겨집니다. 윈도 탐색기 사용법과 크게 다르지 않습니다.
(2) 속성 창
해당 개체(오브젝트)의 속성(프로퍼티) 값에 대한 정보를 보여줍니다. 이 창에서 속성값들을 직접 변경할 수도 있습니다. 만약 속성 창이 보이지 않는다면 [보기] - [속성 창] 메뉴를 선택하거나 F4를 누르면 나타납니다.
(3) 코드 창
매크로 기록기를 사용해서 기록을 하거나 사용자가 직접 코드를 입력할 수 있는 창입니다. 통합 문서에 모듈 시트가 하나도 없다면 이 창은 회색 바탕의 빈 화면으로 보입니다. 만약 이 창이 화면에 표시되지 않는다면 [보기] - [코드] 메뉴를 선택하거나 F7 키를 눌러보세요.
(4) 직접 실행 창
VBA는 뛰어난 디버깅(Debugging), 즉 오류 바로잡기 도구를 가지고 있는데 그중 하나가 '직접 실행 창'입니다. 말 그대로 입력한 코드가 잘 작동하는지 여부를 '직접 실행해 볼 수 있는 창'입니다. 직접 실행 창이 보이지 않으면 [보기] - [직접 실행 창] 메뉴를 선택하거나 CTRL + G를 누릅니다.
코드 창에서 작업하기
이렇게 해서 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
입력이 끝났으면 실행을 시켜봐야겠죠? 프로시저 내부를 클릭하여 커서를 옮겨 놓은 다음, 아래 방법 중 한 가지를 사용해 보세요.
- F5 키
- [실행] - [Sub/사용자 정의 폼 실행] 메뉴 사용
- 표준 도구 모음에 있는 [실행] 아이콘 클릭
프로그램을 실행하면 다음과 같은 메시지 상자가 나타납니다.
[예] 또는 [아니요] 버튼 중 하나를 눌러보면 상황에 해당하는 메시지가 나타납니다.
이렇게 해서 VBA와 인사를 나눠 보았습니다. 그렇습니다! 은유적 표현으로서의 인사가 아니라 실제로 인사를 나눠본 겁니다. 컴퓨터(엑셀)와 인사를 나눠본 기분이 어떠신가요? 딱딱한 기계 덩어리로만 생각했던 컴퓨터가 보다 인간적인(?) 모습으로 다가오지 않나요?
코드를 살펴봅니다. 아직 VBA 문법을 배우지 않았으니 전반적인 흐름 위주로 파악하면 됩니다.
Sub 안녕하세요()
... 어쩌고 저쩌고...
End Sub
Sub로 시작해서 End Sub로 끝나는 코드를 프로시저 또는 서브 프로시저(Sub Procedure)라고 부릅니다. Sub ~ End Sub 사이에 코드를 작성하면 VBA가 실행을 합니다.
Msg = Application.UserName & "님 안녕하세요?"
Answer = MsgBox(Msg, vbYesNo)
Application.UserName이라는 것은 현재 애플리케이션(엑셀)의 사용자 이름을 가지고 오기 위한 명령어입니다. 엑셀을 설치할 때 사용자 기본 정보를 입력하게 되는데 이때 등록된 사용자명을 알아냅니다. 그런 다음 &를 이용하여 두 개의 문자열을 합쳐서 Msg라는 곳에 값을 담아둡니다.
MsgBox는 어떤 메시지를 화면에 띄워주는 역할을 합니다. 화면에 두 개의 버튼이 있는 MsgBox가 나타나는데, 사용자는 이 중에서 하나의 버튼을 선택하게 됩니다. [예] / [아니요] 중 어느 것을 선택했는지 알아야 후속 작업을 하겠요? 어떤 버튼을 눌렀는지 파악해서 Answer라는 변수에 담아두는 과정이 아래의 한 줄로 해결이 됩니다.
Answer = MsgBox(Msg,vbYesNo)
워크시트에서 If 구문을 사용할 때,
If(조건식, 참인 경우, 거짓인 경우)
이러한 형태로 사용합니다. VBA에서도 비슷합니다. Answer라는 변수에 저장된 값이(즉 사용자가 선택한 버튼이) vbYes 이면 '안녕하시다니 다행이네요!'를, vbNo라면 '저런, 무슨 일이 있었나요?'라는 메시지 박스를 화면에 표시합니다.
If Answer=vbYes Then
MsgBox "안녕하시다니 다행이네요!"
Else
MsgBox "저런 무슨 일이 있었나요?"
End If
꼭 알아야 할 메시지 상자 (MsgBox)
MsgBox는 '화면에 어떤 메시지를 화면에 띄워주는 역할'을 한다고 했습니다. [직접 실행 창]에 아래와 같이 입력하고 Enter를 눌러보세요. '안녕하세요?'라는 메시지 박스가 나타납니다.
Msgbox "안녕하세요?"
앞에서 사용한 MsgBox를 보면 vbYesNo라는 이상한(?) 것이 있었습니다. 이것을 내장 상수(Built-in constants)라고 하며, MsgBox에 어떤 버튼이 표시되도록 할 것인 지 지정합니다. 아래와 같이 다양한 값을 지정해 줄 수 있습니다.
이 많은 걸 외워야 하냐고요? (그럴 리가요^^) 실무에서 자주 쓰이는 몇 가지만 봐두면 됩니다. 여러 개의 상수를 +로 연결해서 쓸 수도 있습니다.
MsgBox "정말 작업을 취소할까요?", vbYesNo + vbCritical
상수 | 값 | 설명 |
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에서 반환되는 값과 상수를 정리하면 아래 표와 같습니다.
상수 | 값 | 설명 |
vbOK | 1 | 확인 |
vbCancel | 2 | 취소 |
vbAbort | 3 | 중단 |
vbRetry | 4 | 다시 시도 |
vbIgnore | 5 | 무시 |
vbYes | 6 | 예 |
vbNo | 7 | 아니오 |
나가며
VBA에서 사용자와 VBA가 직접적으로 커뮤니케이션할 수 있는 수단은 딱 2개밖에 없습니다. 그중 하나가 MsgBox입니다. 사용자로부터 입력받을 때 사용하는 InputBox와 그 반대 역할을 하는 것이 MsgBox입니다. InputBox에 대해서는 다른 강의에서 다룹니다.
'VBA' 카테고리의 다른 글
[VBA 입문] 06강. 레인지 개체(1) ㅡ Range, Cells 속성 (89) | 2023.09.28 |
---|---|
[VBA 입문] 05강. 워크시트 개체 (80) | 2023.09.27 |
[VBA 입문] 04강. 워크북 개체 (110) | 2023.09.27 |
[VBA 입문] 03강. Excel VBA 필수 개념 4가지 (107) | 2023.09.27 |
[VBA 입문] 01강. Excel VBA 오리엔테이션 (122) | 2023.09.26 |