Excel & IT Info

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

VBA

[VBA 입문] 16강. 이벤트와 이벤트 프로시저

권현욱(엑셀러) 2023. 10. 10. 08:00
반응형

들어가며

'이벤트(event)'라는 말을 들어보셨나요? 일상생활에서도 흔히 사용하는 단어입니다. 엑셀에도 이벤트가 있습니다. 이벤트를 이용하면 프로그램을 자동화할 수 있습니다. 무슨 말인지 한없이 궁금하시죠?(그렇다고 하세요.^^;) 궁금증을 해결하기 위해 출발합니다.

권현욱(엑셀러) | 아이엑셀러 닷컴 대표 · Microsoft Excel MVP · Excel 솔루션 프로바이더 · 작가
이 콘텐츠는 <엑셀 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 키를 누르면 알 수 있습니다.

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


나가며

이벤트 프로시저를 활용하면 여러 가지 방식으로 업무를 자동화할 수 있습니다(예. 특정 시간에 실행, 특정 동작과 연계하여 실행 등). 여러분은 컴퓨터 프로그래밍에 있어서 '이벤트'라고 하는 또 한 가지 중요한 개념을 이해하시게 되었습니다. 축하합니다.

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