Event

Change 이벤트

노만e 2025. 3. 17. 07:23

엑셀 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 이벤트 사용 시 주의할 점

  1. Application.EnableEvents = False 사용으로 무한 루프 방지
  • Worksheet_Change 내에서 값을 변경하면 이벤트가 다시 실행될 수 있으므로 이벤트를 일시적으로 비활성화 후 복구해야 함
  1. 불필요한 메시지 출력 제한
  • MsgBox를 너무 자주 사용하면 사용자 경험이 불편할 수 있음
  1. 자동 실행 코드가 많으면 속도 저하 가능
  • 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 이벤트를 활용하면 실시간 데이터 검증, 자동 계산, 데이터 강조 등을 구현할 수 있습니다! 🚀