들어가며
'이벤트(event)'라는 말을 들어보셨나요? 일상생활에서도 흔히 사용하는 단어입니다. 엑셀에도 이벤트가 있습니다. 이벤트를 이용하면 프로그램을 자동화할 수 있습니다. 무슨 말인지 한없이 궁금하시죠?(그렇다고 하세요.^^;) 궁금증을 해결하기 위해 출발합니다.
이 콘텐츠는 <엑셀 VBA 파워 코딩의 정석>(권현욱 저, 디지털북스 출간)에서 부분 편집/인용했습니다.
이벤트 이해
이벤트는 '프로그램이 반응하도록 사용자가 만들어내는 동작 또는 일이 일어나는 것'을 말합니다. 엑셀에서는 다음과 같은 경우 이벤트가 발생합니다(이것 말고도 훨씬 더 많이 있습니다).
- 엑셀 파일(워크북)을 열거나 닫을 때
- 워크시트를 선택하거나 삽입, 삭제할 때
- 셀에 값을 입력하거나 수정할 때
- 특정한 키를 누를 때
- 특정 시간이 되었을 때
- 에러가 발생했을 때
지금까지 만들었던 프로시저는 사용자가 실행을 시켜야 작동하는 일반 프로시저였습니다. 이에 반해 '어떤 이벤트가 발생할 때 자동으로 실행되는 프로시저'가 있는데 이것을 '이벤트 핸들러 프로시저(event-handler procedure)' 또는 줄여서 '이벤트 프로시저'라고 부릅니다.
엑셀에는 다양한 종류의 이벤트가 준비되어 있습니다.
종류 | 설명 |
애플리케이션 이벤트 | 애플리케이션(엑셀)과 관련된 이벤트 |
워크북 이벤트 | 특정한 워크북과 관련하여 발생하는 이벤트 |
워크시트 이벤트 | 특정한 워크시트와 관련하여 발생하는 이벤트 |
차트 이벤트 | 특정한 차트와 관련하여 발생하는 이벤트 |
사용자 정의 폼(UserForm) 이벤트 | 특정 사용자 정의 폼이나 사용자 정의 폼에 포함된 컨트롤과 관련하여 발생하는 이벤트 |
개체와 연계되지 않은 이벤트 | 예를 들어 OnTime, OnKey 이벤트 |
이벤트 프로시저 작성 방법
이벤트 프로시저라고 해서 일반 프로시저와 문법적인 차이가 있지는 않습니다. 다만 프로시저를 작성하는 위치가 일반 모듈이 아니라 개체에 딸려 있다는 것, 실행할 때 고유의 인수를 넘겨받아서 실행하는 경우가 자주 있다는 점 등에서 차이가 있습니다.
Sheet1의 특정 셀이나 영역을 선택할 때마다 선택된 영역의 주소를 메시지 상자에 표시해 주는 이벤트 프로시저를 만들어보겠습니다.
(1) 시트 탭을 우클릭하고 [코드 보기] 메뉴를 클릭합니다.
(2) Visual Basic Editor의 코드 창 위에 2개의 드롭다운 버튼이 있습니다. 앞의 것('개체' 드롭다운 버튼)에서 'Worksheet', 뒤의 것('프로시저' 드롭다운 버튼)에서 'SelectionChange'를 각각 선택하면 Worksheet_SelectionChage 이벤트 프로시저가 자동으로 만들어집니다.
(3) 코드를 입력합니다. SelectionChange 프로시저는 하나의 인수를 넘겨받아서 실행합니다. Target은 선택된 셀이나 셀 범위를 뜻합니다.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "선택 영역: " & Target.Address
End Sub
이벤트 프로시저 활용 예
이벤트 개념과 이벤트 프로시저에 대해 알아보았으니 활용 예제를 하나 만들어 봅니다. 워크시트의 아무 셀에나 수식을 입력하면 셀 배경색이 노란색으로 변합니다.
(1) 시트 탭을 우클릭하고 [코드 보기] 메뉴를 클릭합니다.
(2) 코드 창 위의 드롭다운 버튼에서, Worksheet와 Change를 각각 선택하면 Worksheet_Change 이벤트 프로시저가 만들어집니다.
(3) 다음과 같은 코드를 작성합니다. 셀에 수식이 들어있는지 여부는 레인지 개체의 HasFormula 속성을 이용하여 파악할 수 있습니다.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCell As Range
Set Target = Intersect(Target, Range("A3").CurrentRegion
If Target Is Nothing Then Exit Sub
For Each rCell In Target
If rCell.HasFormula Then
rCell.Interior.Color = 10086143
End If
Next
End Sub
개체 변수에 값을 지정할 때에는 앞에 Set을 붙여야 합니다. 일반 변수는 아무것도 붙이지 않고 바로 값을 지정하면 됩니다만, 앞에 Let이 생략된 형태입니다.
[개체 변수] Set Target = Intersect(Target, Range("A3").CurrentRegion
[일반 변수] (Let) i = 100
Interior 개체의 Color 속성값은, 색상이 입력된 셀을 선택하고 [직접 실행] 창으로 가서 다음과 같이 입력하고 ENTER 키를 누르면 알 수 있습니다.
나가며
이벤트 프로시저를 활용하면 여러 가지 방식으로 업무를 자동화할 수 있습니다(예. 특정 시간에 실행, 특정 동작과 연계하여 실행 등). 여러분은 컴퓨터 프로그래밍에 있어서 '이벤트'라고 하는 또 한 가지 중요한 개념을 이해하시게 되었습니다. 축하합니다.
'VBA' 카테고리의 다른 글
[VBA 입문] 18강. 에필로그 (99) | 2023.10.12 |
---|---|
[VBA 입문] 17강. 챗GPT로 VBA 코딩하는 법 (92) | 2023.10.11 |
[VBA 입문] 15강. 사용자 정의 함수 만들기 (0) | 2023.10.09 |
[VBA 입문] 14강. 실행 순서 제어(4) ㅡ GoTo 문 (2) | 2023.10.07 |
[VBA 입문] 13강. 실행 순서 제어(3) ㅡ Do ~ Loop 문 (0) | 2023.10.06 |