엑셀 VBA에서 Change 이벤트는 사용자가 특정 워크시트의 셀 값을 변경할 때 실행되는 이벤트입니다.
즉, 셀의 값이 변경될 때마다 특정 동작을 자동으로 수행할 수 있습니다.
1. 기본 문법
Private Sub Worksheet_Change(ByVal Target As Range)
' 실행할 코드
End Sub
|
매개변수
|
설명
|
Target
|
변경된 셀 범위 (Range 개체)
|
📌 이 코드는 특정 워크시트(Sheet1, Sheet2 등)의 코드 모듈에 작성해야 함
📌 셀 값이 변경될 때만 실행됨 (단, SelectionChange와 다르게 값이 변경되지 않으면 실행되지 않음)
2. 셀 값이 변경되면 메시지 표시
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "변경된 셀: " & Target.Address
End Sub
|
📌 사용자가 셀 값을 변경하면 해당 셀 주소를 메시지로 표시
3. 특정 셀 값 변경 시 실행
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B2")) Is Nothing Then
MsgBox "B2 셀이 변경되었습니다!"
End If
End Sub
|
📌 B2 셀의 값이 변경될 때만 메시지를 표시
4. 특정 범위 내 값이 변경되면 배경색 변경
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
Target.Interior.Color = RGB(255, 255, 0) ' 노란색
End If
End Sub
|
📌 A1:A10 범위의 값이 변경되면 해당 셀의 배경색을 노란색으로 변경
5. 변경된 값이 특정 조건을 만족하면 강조
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value > 100 Then
Target.Font.Bold = True
Target.Font.Color = RGB(255, 0, 0) ' 빨간색
Else
Target.Font.Bold = False
Target.Font.Color = RGB(0, 0, 0) ' 검정색
End If
End Sub
|
📌 셀 값이 100보다 크면 빨간색 & 굵게 표시, 그렇지 않으면 원래대로 복구
6. 특정 열 값 변경 시 자동 계산
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C:C")) Is Nothing Then
Target.Offset(0, 1).Value = Target.Value * 2
End If
End Sub
|
📌 C열의 값이 변경되면 오른쪽 D열에 변경된 값의 2배를 자동 입력
7. 입력된 값이 "완료"이면 배경색 변경
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value = "완료" Then
Target.Interior.Color = RGB(144, 238, 144) ' 연한 초록색
Else
Target.Interior.Color = xlNone
End If
End Sub
|
📌 셀 값이 "완료"이면 초록색 배경, 다른 값이면 원래대로 복구
8. 변경된 값이 특정 리스트에 없으면 원래 값으로 복구
Private Sub Worksheet_Change(ByVal Target As Range)
Dim 허용값 As Variant
허용값 = Array("예", "아니오", "보류")
If Not IsError(Application.Match(Target.Value, 허용값, 0)) Then Exit Sub
Application.EnableEvents = False
MsgBox "올바른 값을 입력하세요! (예/아니오/보류)"
Application.Undo
Application.EnableEvents = True
End Sub
|
📌 사용자가 "예", "아니오", "보류" 외의 값을 입력하면 원래 값으로 복구
9. 값이 변경되면 변경된 시간 기록
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D2:D100")) Is Nothing Then
Target.Offset(0, 1).Value = Now
End If
End Sub
|
📌 D2:D100 범위의 값이 변경될 때, 오른쪽 E열에 현재 시간을 기록
10. 값 변경 시 특정 매크로 실행
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("F5")) Is Nothing Then
Call 내매크로
End If
End Sub
Sub 내매크로()
MsgBox "F5 셀 값이 변경되었을 때 실행되는 매크로입니다!"
End Sub
|
📌 F5 셀의 값이 변경될 때 내매크로 실행
11. 입력된 값이 숫자가 아니면 경고 메시지
Private Sub Worksheet_Change(ByVal Target As Range)
If Not IsNumeric(Target.Value) Then
Application.EnableEvents = False
MsgBox "숫자만 입력 가능합니다!"
Application.Undo
Application.EnableEvents = True
End If
End Sub
|
📌 숫자가 아닌 값이 입력되면 경고 메시지를 표시하고 원래 값으로 복구
12. 변경된 값이 특정 조건이면 특정 시트로 이동
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value = "보고서" Then
Sheets("보고서").Activate
End If
End Sub
|
📌 셀 값이 "보고서"이면 "보고서" 시트로 이동
13. 값 변경 시 특정 행 숨기기
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value = "숨김" Then
Target.EntireRow.Hidden = True
Else
Target.EntireRow.Hidden = False
End If
End Sub
|
📌 입력된 값이 "숨김"이면 해당 행을 숨기고, 다른 값이면 다시 표시
📌 Change 이벤트 사용 시 주의할 점
- Application.EnableEvents = False 사용으로 무한 루프 방지
- Worksheet_Change 내에서 값을 변경하면 이벤트가 다시 실행될 수 있으므로 이벤트를 일시적으로 비활성화 후 복구해야 함
- 불필요한 메시지 출력 제한
- MsgBox를 너무 자주 사용하면 사용자 경험이 불편할 수 있음
- 자동 실행 코드가 많으면 속도 저하 가능
- ScreenUpdating 및 Calculation을 조절하여 성능 최적화 가능
📝 정리
기능
|
VBA 코드 (Change 이벤트)
|
값 변경 시 메시지 표시
|
MsgBox Target.Address
|
특정 셀 변경 시 실행
|
If Not Intersect(Target, Range("B2")) Is Nothing Then
|
특정 범위 변경 시 색상 변경
|
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
|
숫자가 아니면 원래 값으로 복구
|
If Not IsNumeric(Target.Value) Then Application.Undo
|
값 변경 시 특정 매크로 실행
|
Call 내매크로
|
입력된 값이 특정 조건이면 특정 시트 이동
|
If Target.Value = "보고서" Then Sheets("보고서").Activate
|
변경된 값이 리스트에 없으면 원래 값 복구
|
Application.Match(Target.Value, 허용값, 0)
|
🔥 VBA의 Change 이벤트를 활용하면 실시간 데이터 검증, 자동 계산, 데이터 강조 등을 구현할 수 있습니다! 🚀