10초 선택표부터 봅니다
`지금 수정된 상태인가`를 물으면 Dirty 속성, `저장 전에 검사하거나 막는가`를 물으면 BeforeUpdate, `저장 뒤 후속 동작인가`를 물으면 AfterUpdate입니다.
Dirty는 시점을 알리는 이벤트 이름이 아니라 현재 레코드의 상태를 읽고 쓸 수 있는 Boolean 속성입니다. BeforeUpdate와 AfterUpdate는 특정 순간에 실행되는 이벤트입니다.
시험장 순서는 `상태인가 이벤트인가 → 저장 전인가 후인가 → 취소 가능한가 → 대상이 컨트롤인가 폼인가`입니다.
두음 암기: 더수·비검취·애저후
`더수`는 Dirty 수정 상태, `비검취`는 BeforeUpdate 검증·취소, `애저후`는 AfterUpdate 저장 후를 뜻합니다.
재미 문장 `더티면 수정 중, 비포는 검문소, 애프터는 저장 뒤`에서 검문소는 통과 전이므로 멈출 수 있고, 저장 뒤는 이미 통과한 시점이라고 연결하세요.
두음을 말한 뒤 `상태·저장 전·저장 후` 세 단어를 순서대로 복원해야 긴 프로시저 지시문에서도 사용할 수 있습니다.
Dirty 속성은 저장되지 않은 수정 상태를 표시합니다
Microsoft Learn은 Form.Dirty를 현재 레코드가 마지막 저장 이후 수정되었는지 판단하는 읽기·쓰기 Boolean 속성으로 설명합니다. 사용자가 레코드를 바꾸면 True, 저장이 끝나면 False가 됩니다.
따라서 `If Me.Dirty Then`은 현재 레코드에 저장되지 않은 변경이 있는지 확인하는 조건입니다. 저장 전 검증 자체를 실행하거나 오류를 판정하는 이벤트는 아닙니다.
Dirty는 폼 전체에서 과거에 한 번이라도 수정한 기록을 누적하는 값도 아닙니다. 현재 레코드가 저장되거나 다른 레코드로 이동해 저장되면 그 레코드의 Dirty 상태는 False가 됩니다.
Dirty 속성과 Dirty 이벤트를 같은 것으로 보지 마세요
`Me.Dirty`는 True·False를 읽는 속성이고, `Form_Dirty()` 또는 컨트롤의 Dirty는 내용이 바뀌기 시작할 때 발생하는 이벤트입니다. 문제에서 괄호가 없는 조건식인지 이벤트 프로시저 이름인지 먼저 보세요.
Microsoft의 이벤트 순서 자료에서는 텍스트 입력 때 키보드 이벤트와 Dirty·Change가 발생하고, 이후 컨트롤이나 레코드가 업데이트될 때 BeforeUpdate·AfterUpdate가 이어집니다.
즉 Dirty 이벤트는 변경 시작 신호, Dirty 속성은 현재 수정 상태입니다. 이 글의 핵심 비교에서 Dirty는 주로 속성 의미로 사용합니다.
BeforeUpdate는 저장 전 마지막 검증 구간입니다
BeforeUpdate는 변경된 컨트롤 값이나 레코드가 업데이트되기 전에 발생합니다. 아직 저장 전이므로 입력값 검증과 업데이트 차단에 적합합니다.
여러 필드의 조합을 확인해야 한다면 폼의 `Form_BeforeUpdate(Cancel As Integer)`에서 레코드 전체를 검증할 수 있습니다. 특정 텍스트 상자 하나만 검사하면 그 컨트롤의 BeforeUpdate를 검토합니다.
값이 실제로 변경되지 않았거나 계산 컨트롤 값만 바뀐 경우에는 해당 BeforeUpdate가 실행되지 않을 수 있다는 공식 문서의 조건도 함께 기억하세요.
Cancel=True는 업데이트를 막는 스위치입니다
BeforeUpdate의 `Cancel` 인수를 True로 설정하면 해당 업데이트를 취소합니다. 그래서 필수값 누락, 중복값, 여러 필드의 모순처럼 저장을 허용하면 안 되는 조건을 검사할 때 사용합니다.
전형적인 구조는 `If 조건 Then MsgBox ... : Cancel = True`입니다. Cancel은 BeforeUpdate 이벤트의 인수이며 AfterUpdate에는 같은 취소 인수가 없습니다.
Cancel=True를 썼다고 사용자가 입력한 모든 변경을 무조건 폐기하는 코드로 외우지 마세요. 잘못된 값을 고쳐 다시 저장하게 하려면 업데이트만 막고 포커스를 해당 컨트롤로 돌리는 흐름을 사용할 수 있습니다.
AfterUpdate는 업데이트가 끝난 뒤 실행합니다
AfterUpdate는 변경 데이터가 업데이트된 뒤 발생합니다. 저장 결과를 바탕으로 계산 표시를 갱신하거나 다른 동작을 이어 가는 후속 처리에 맞습니다.
이미 업데이트가 완료된 뒤이므로 AfterUpdate에서 같은 업데이트를 `Cancel=True`로 취소하는 선택지는 틀립니다. 취소가 필요하면 BeforeUpdate로 돌아가야 합니다.
컨트롤 AfterUpdate는 해당 입력값이 업데이트된 뒤, 폼 AfterUpdate는 레코드 전체가 업데이트된 뒤라는 대상 차이를 확인하세요.
컨트롤과 폼 이벤트는 저장 단위가 다릅니다
텍스트 상자에서 값을 바꾸고 다른 컨트롤로 이동하면 그 컨트롤의 BeforeUpdate와 AfterUpdate가 먼저 문제에 등장할 수 있습니다. 개별 입력값의 검증·후속 처리가 목적입니다.
현재 레코드를 저장하거나 다른 레코드로 이동할 때 폼의 BeforeUpdate와 AfterUpdate가 발생합니다. 여러 컨트롤을 합친 레코드 검증과 저장 후 처리가 목적입니다.
프로시저 이름도 `txt수량_BeforeUpdate`와 `Form_BeforeUpdate`, `txt수량_AfterUpdate`와 `Form_AfterUpdate`처럼 앞부분이 다릅니다. 이름의 대상을 놓치지 마세요.
Me.Dirty=False는 현재 레코드 저장을 시도합니다
Dirty 상태의 바운드 폼에서 `Me.Dirty = False`를 실행하면 현재 레코드를 저장하는 전형적인 코드로 사용됩니다. 저장 버튼 코드에서 `If Me.Dirty Then Me.Dirty = False`처럼 볼 수 있습니다.
이 코드는 BeforeUpdate 검증을 생략하고 곧바로 AfterUpdate로 점프하는 명령이 아닙니다. 레코드 저장 과정이므로 BeforeUpdate에서 Cancel=True가 되거나 유효성 검사에 실패하면 저장이 완료되지 않습니다.
반대로 `Me.Dirty = True`를 저장 완료 뜻으로 해석하면 안 됩니다. True는 현재 레코드에 저장되지 않은 변경이 있다는 쪽입니다.
Me.Undo는 저장 전 변경을 되돌립니다
Microsoft Learn의 Undo 설명에 따르면 폼에 `Me.Undo`를 적용하면 현재 레코드의 변경 전체를, 특정 컨트롤에 Undo를 적용하면 그 컨트롤의 변경만 원래 상태로 돌립니다.
Undo는 폼이나 컨트롤이 업데이트되기 전에 사용해야 합니다. 이미 AfterUpdate까지 끝난 저장 기록을 단순히 `Me.Undo`로 취소할 수 있다고 고르면 틀립니다.
`Cancel=True`는 진행 중인 업데이트를 막는 판단이고, `Me.Undo`는 저장 전 변경값을 버리는 동작입니다. 두 코드를 함께 쓸 수는 있어도 역할은 같지 않습니다.
이벤트 순서를 시간표로 정리합니다
입력 컨트롤의 내용이 바뀌기 시작하면 Dirty·Change 계열이 먼저 나타납니다. 다른 컨트롤로 이동하며 값을 확정하면 컨트롤 BeforeUpdate 다음 AfterUpdate 순서입니다.
레코드를 저장하거나 다른 레코드로 이동하면 폼 BeforeUpdate 다음 폼 AfterUpdate가 이어집니다. Microsoft Support의 이벤트 순서도 이 전후 관계를 제시합니다.
시험에서는 모든 키보드 이벤트를 외우기보다 `변경 시작 → 컨트롤 업데이트 → 레코드 업데이트`의 세 층으로 나누면 충분합니다.
세 코드의 결과를 한 문장으로 바꿔 봅니다
`If Me.Dirty Then`은 `현재 레코드에 저장되지 않은 변경이 있으면`입니다. 조건 확인이지 저장 명령이 아닙니다.
`Cancel = True`는 `이번 업데이트를 취소한다`이고, BeforeUpdate 안에서 사용합니다. `Me.Dirty = False`는 `현재 레코드 저장을 시도한다`입니다.
`Me.Undo`는 `현재 레코드의 저장 전 변경을 버린다`입니다. 코드를 한국어 한 문장으로 바꾸면 비슷한 False·True 선지를 빠르게 지울 수 있습니다.
자주 틀리는 선지 네 개를 고칩니다
`Dirty=True이면 저장이 완료되었다`는 틀립니다. 저장되지 않은 수정이 있는 상태입니다.
`AfterUpdate에서 Cancel=True로 저장을 막는다`는 틀립니다. 업데이트 차단은 BeforeUpdate의 Cancel 인수를 봅니다.
`Me.Dirty=False는 변경 내용을 취소한다`는 틀립니다. 저장 시도이고, 변경 폐기는 저장 전 Me.Undo입니다.
`컨트롤 AfterUpdate와 폼 AfterUpdate는 항상 같은 대상이다`도 틀립니다. 개별 컨트롤과 레코드 전체의 업데이트 단위가 다릅니다.
문제 풀이 순서는 네 단계입니다
1단계에서 보기의 표현이 상태 확인인지 이벤트 실행인지 표시합니다. `If Me.Dirty`처럼 조건식이면 Dirty 속성부터 봅니다.
2단계에서 저장 전·후를 가릅니다. 검증·취소·필수값은 BeforeUpdate, 저장 결과 기반 후속 작업은 AfterUpdate입니다.
3단계에서 대상이 컨트롤인지 폼인지 프로시저 이름으로 확인합니다. 4단계에서 Cancel=True, Me.Dirty=False, Me.Undo를 각각 취소·저장 시도·변경 폐기로 번역합니다.
30초 셀프 체크와 시험 직전 다섯 줄
질문 1. 현재 레코드가 수정 중인지 확인하는 속성은? Dirty입니다. 질문 2. 저장 전 여러 필드를 검증하고 막는 이벤트는? 폼 BeforeUpdate입니다.
질문 3. 업데이트 뒤 후속 처리는? AfterUpdate입니다. 질문 4. 현재 레코드 저장 시도는? Me.Dirty=False입니다. 질문 5. 저장 전 변경 전체 폐기는? 폼의 Me.Undo입니다.
시험 직전에는 `Dirty=True 수정 중`, `BeforeUpdate Cancel 가능`, `AfterUpdate 취소 불가`, `Dirty=False 저장 시도`, `Undo 변경 폐기`만 가리지 않고 말해 보세요.
Microsoft 공식 문서로 재확인했습니다
본문은 Microsoft Learn의 Form.Dirty, Form.BeforeUpdate, Form.Undo와 TextBox.AfterUpdate, Microsoft Support의 Access 이벤트 순서 문서를 2026년 8월 20일 기준으로 대조했습니다.
Dirty가 현재 레코드 수정 상태라는 점, BeforeUpdate의 Cancel=True가 업데이트를 취소한다는 점, Undo는 업데이트 전 변경을 되돌린다는 점을 공식 설명에 맞췄습니다.
시험 버전의 화면 표기와 속성 시트는 달라질 수 있으므로 실제 실습에서는 개체가 폼인지 컨트롤인지와 [Event Procedure] 연결을 함께 확인하세요.