10초 정답: NewValue부터 바로잡습니다
새 레코드의 초기값은 `DefaultValue`, 편집 전 원래 값은 `OldValue`, 컨트롤의 현재 값은 `Value`입니다. 이 세 속성을 시간 순서로 놓으면 기본값, 이전 값, 현재 값이 됩니다.
`NewValue`는 Access 일반 텍스트 상자나 콤보 상자의 현재 값을 읽는 표준 속성명이 아닙니다. 예제 코드에 `curNewValue` 같은 이름이 보여도 개발자가 만든 변수 이름일 수 있으므로 속성과 혼동하면 안 됩니다.
NotInList 이벤트에서 목록에 없는 사용자의 새 입력 문자열을 받는 이름은 `NewData`입니다. 따라서 `NewValue는 NotInList에서 전달된다`라는 설명도 정확하지 않습니다.
두음 암기: 디새·올전·밸현·뉴데입
`디새`는 DefaultValue가 새 레코드의 기본값, `올전`은 OldValue가 변경 전 값이라는 뜻입니다. `밸현`은 Value가 현재 값, `뉴데입`은 NewData가 NotInList의 새 입력 문자열이라는 뜻입니다.
암기 문장 `디폴트는 새집, 올드는 전집, 밸류는 현집, 뉴데이터는 새 손님`을 말한 뒤 실제 영문 이름까지 복원하세요. NewValue라는 잘못된 이름이 끼어들 자리를 없애는 것이 목적입니다.
시험 직전에는 `DefaultValue → OldValue → Value → NewData`를 쓰고 옆에 `새 레코드 → 변경 전 → 현재 → 목록 밖 입력`만 붙이면 됩니다.
네 이름을 같은 표에서 비교합니다
DefaultValue는 속성이며 새 레코드에 들어갈 기본값을 정합니다. OldValue는 바운드 컨트롤의 읽기 전용 속성이며 편집 전 값을 보여 줍니다.
Value는 컨트롤의 기본 읽기·쓰기 속성으로 현재 값을 다룹니다. NewData는 속성이 아니라 ComboBox.NotInList 이벤트 프로시저가 받는 문자열 인수입니다.
문제에서 먼저 `속성인가 이벤트 인수인가`를 확인하세요. 이 한 단계만 넣어도 NewData를 Value와 같은 속성으로 보는 오답을 제거할 수 있습니다.
DefaultValue: 새 레코드의 출발값
DefaultValue는 새 레코드가 생성될 때 컨트롤에 자동으로 들어갈 값을 지정합니다. 예를 들어 주문일 컨트롤의 기본값을 오늘 날짜로 설정하면 새 주문을 시작할 때 날짜가 채워집니다.
핵심 단서는 `새 레코드`, `자동 입력`, `기본값`입니다. 사용자가 편집 중인 기존 레코드의 현재 값을 읽는 속성이 아닙니다.
Microsoft 문서도 DefaultValue가 새 레코드를 추가할 때 적용된다고 설명합니다. `기존 모든 레코드 값도 DefaultValue 변경과 동시에 바뀐다`는 선지는 틀립니다.
DefaultValue는 기존 레코드를 갱신하지 않습니다
DefaultValue를 바꾸면 그 이후 새로 추가하는 레코드의 시작값이 달라집니다. 이미 저장된 레코드의 필드 값을 일괄 수정하는 업데이트 쿼리와는 역할이 다릅니다.
시험에서는 `기본값 속성을 변경하면 기존 레코드도 자동 변경된다`는 표현이 함정으로 나올 수 있습니다. `새 레코드에만 적용`이라는 범위를 먼저 확인하세요.
기존 데이터를 바꾸려면 실제 필드 값을 수정하거나 업데이트 쿼리 같은 별도 작업이 필요합니다. 기본값 설정과 데이터 갱신을 같은 기능으로 보면 안 됩니다.
폼 컨트롤 기본값의 우선순위를 확인합니다
바운드 폼 컨트롤에 DefaultValue를 지정하면 새 레코드 입력 시 그 컨트롤의 기본값이 사용됩니다. Microsoft 문서에서는 컨트롤의 DefaultValue가 바인딩된 테이블 필드의 기본값보다 우선한다고 설명합니다.
테이블에는 기본값 A, 폼 컨트롤에는 기본값 B가 설정된 상황이라면 폼에서 새 레코드를 추가할 때 컨트롤 설정을 먼저 확인합니다.
다만 기본값은 사용자가 값을 입력하기 전의 출발값입니다. 사용자가 다른 값을 입력하면 현재 Value가 바뀌고 저장 데이터도 입력한 값에 따라 결정됩니다.
OldValue: 바운드 컨트롤의 변경 전 값
OldValue는 바운드 컨트롤의 편집 전 값을 반환하는 읽기 전용 속성입니다. 사용자가 값을 바꾼 뒤 저장되기 전이라면 OldValue와 현재 Value를 비교해 변경 여부를 판단할 수 있습니다.
예를 들어 `If Me!UnitPrice.Value <> Me!UnitPrice.OldValue Then`처럼 현재 값과 이전 값을 비교합니다. OldValue에 새 값을 대입하는 방식은 사용할 수 없습니다.
언바운드 컨트롤에는 저장된 원래 레코드 값이라는 기준이 없으므로 OldValue의 핵심 조건은 `바운드 컨트롤`과 `읽기 전용`입니다.
OldValue가 유지되는 시점을 확인합니다
사용자가 컨트롤 값을 편집하는 동안 OldValue는 변경 전 값을 유지합니다. 이 시점에는 Value와 OldValue를 비교해 값이 바뀌었는지 검사할 수 있습니다.
레코드를 저장하거나 다른 레코드로 이동하면 편집한 값이 새 저장값이 되고 OldValue도 그 값에 맞춰 갱신됩니다. OldValue가 모든 과거 이력을 영구 보관하는 별도 필드는 아닙니다.
변경 전후 비교는 저장되기 전 이벤트에서 하는 것이 자연스럽습니다. 장기 변경 이력이 필요하면 별도의 감사 테이블이나 기록 로직이 필요합니다.
Value와 Text의 차이도 함께 봅니다
Value는 컨트롤의 기본 속성이며 값을 읽거나 설정할 때 사용합니다. 명시적으로 `.Value`를 쓰지 않아도 기본 속성으로 평가되는 경우가 있지만 시험에서는 이름을 적어 역할을 분명히 하는 편이 좋습니다.
Text 속성은 컨트롤이 포커스를 가진 동안 화면에 현재 입력된 문자열을 나타냅니다. 편집 중에는 Text와 Value가 다를 수 있고 Text를 사용할 때는 포커스 조건도 확인해야 합니다.
현재 값이라는 단서가 보이면 NewValue를 만들지 말고 Value를 선택합니다. `입력 중 화면 텍스트`를 특별히 묻는 경우에만 Text의 조건을 검토하세요.
NewValue는 일반 컨트롤 속성이 아닙니다
Access VBA 예제에는 `NewValue`, `curNewValue`처럼 보이는 식별자가 등장할 수 있습니다. 하지만 프로그래머가 선언한 변수 이름과 Access 개체가 제공하는 속성명은 구분해야 합니다.
텍스트 상자나 콤보 상자의 현재 값을 읽을 때는 Value를 사용합니다. Microsoft Access의 TextBox.Value 문서도 Value를 기본 읽기·쓰기 속성으로 설명합니다.
검색어에 `DefaultValue OldValue NewValue 차이`가 포함되어도 잘못된 세트로 암기하지 마세요. 시험에서는 실제 개체·속성·이벤트 인수 이름이 맞는지까지 판별해야 합니다.
NotInList의 새 입력 문자열은 NewData입니다
콤보 상자의 LimitToList가 Yes이고 사용자가 목록에 없는 값을 입력하면 NotInList 이벤트가 발생할 수 있습니다. 이벤트 프로시저의 대표 시그니처는 `NotInList(NewData, Response)`입니다.
NewData는 목록에 없는 사용자의 입력 문자열을 담습니다. Response에는 오류 메시지를 표시할지, 값을 추가한 것으로 처리할지 같은 응답 상수를 설정합니다.
따라서 `목록에 없는 새 입력값`이라는 설명을 보고 NewValue를 고르면 안 됩니다. 속성인지 이벤트 인수인지 확인한 뒤 NewData를 선택하세요.
Undo는 호출 대상에 따라 범위가 다릅니다
Undo 메서드는 저장되기 전 변경을 되돌립니다. 특정 컨트롤에 `Me!UnitPrice.Undo`를 적용하면 그 컨트롤의 변경을 취소합니다.
폼에 `Me.Undo`를 적용하면 현재 레코드에서 편집한 여러 컨트롤의 변경을 함께 취소할 수 있습니다. 시험에서는 메서드 호출 대상이 컨트롤인지 폼인지 확인해야 합니다.
이미 레코드가 저장된 뒤에는 같은 방식으로 이전 상태를 되살리는 단순 취소가 아닙니다. Undo 문제도 `저장 전`이라는 시점을 먼저 표시하세요.
BeforeUpdate에서 변경 검사를 적용합니다
BeforeUpdate는 변경 내용이 저장되기 전에 유효성을 검사하거나 저장을 취소하기 좋은 시점입니다. 이때 Value와 OldValue를 비교하면 실제 변경 여부를 확인할 수 있습니다.
가격이 바뀌었을 때 확인 메시지를 띄우고 사용자가 취소하면 `Cancel = True`로 업데이트를 막은 뒤 컨트롤 Undo를 적용할 수 있습니다. 핵심은 저장 전에 검사한다는 점입니다.
OldValue를 새 값으로 대입해 복원하려 하기보다 Undo의 대상을 선택하는 편이 개체 모델에 맞습니다. OldValue는 읽기 전용이라는 조건을 함께 기억하세요.
값의 흐름을 시간 순서로 봅니다
1단계. 새 레코드를 시작하면 DefaultValue가 출발값을 제공합니다. 2단계. 사용자가 값을 편집하면 Value 또는 포커스 중 Text에 새 입력이 나타납니다.
3단계. 저장 전에는 OldValue가 편집 전 값을 유지하므로 Value와 비교할 수 있습니다. 4단계. 저장하면 편집한 Value가 레코드 값이 되고 OldValue도 이후 그 값에 맞춰집니다.
NotInList의 NewData는 이 일반 시간축의 속성이 아닙니다. 콤보 상자 목록 밖 입력이라는 특정 이벤트 상황에서만 등장하는 인수로 따로 놓으세요.
함정 선지를 고치고 셀프 체크합니다
`DefaultValue를 바꾸면 기존 레코드가 모두 변경된다`는 틀립니다. `OldValue는 수정 가능한 속성이다`도 틀립니다. 새 레코드 적용과 읽기 전용 조건을 각각 확인하세요.
`현재 컨트롤 값은 NewValue로 읽는다`는 틀리고 Value입니다. `NotInList의 새 입력 인수는 NewValue다`도 틀리고 NewData입니다.
질문 1. 새 레코드 기본값은? DefaultValue. 질문 2. 변경 전 읽기 전용 값은? OldValue. 질문 3. 현재 값은? Value. 질문 4. NotInList 입력은? NewData.
시험 직전에는 다섯 줄만 봅니다
1. DefaultValue: 새 레코드에 자동 입력될 기본값, 기존 레코드는 변경하지 않음.
2. OldValue: 바운드 컨트롤의 변경 전 값, 읽기 전용, 저장 뒤 현재 값에 맞춰짐.
3. Value: 컨트롤의 현재 또는 저장된 값을 읽고 설정하는 기본 속성.
4. NewData: ComboBox.NotInList가 받는 목록 밖 새 입력 문자열 인수.
5. NewValue로 외우지 말고 `디새·올전·밸현·뉴데입`을 복원할 것.
Microsoft 공식 문서로 재확인했습니다
본문은 Microsoft Learn의 DefaultValue, TextBox.Value, TextBox.OldValue, ComboBox.NotInList, Control.Undo 문서를 2026년 8월 18일 기준으로 대조했습니다.
DefaultValue의 새 레코드 적용 범위, OldValue의 읽기 전용·바운드 조건, Value와 Text 차이, NotInList의 NewData 인수, Undo 대상 범위를 확인했습니다.
Access 버전이나 화면 언어에 따라 메뉴 이름은 달라질 수 있지만 VBA 개체 모델의 속성·이벤트 인수 이름은 공식 문서를 우선 기준으로 삼습니다.