10초 결론: 번호·새 행·복제본·같은 자리로 나눕니다
`CurrentRecord`는 폼에서 현재 몇 번째 레코드를 보고 있는지 확인합니다. `NewRecord`는 현재 위치가 새 레코드인지 확인합니다.
`RecordsetClone`은 폼과 같은 원본을 바탕으로 검색하거나 이동할 수 있는 별도 Recordset을 제공합니다. 클론의 커서는 폼과 독립적으로 움직입니다.
클론에서 원하는 레코드를 찾은 뒤 폼도 그 레코드를 표시하게 하려면 `Me.Bookmark = rs.Bookmark`처럼 Bookmark를 대입합니다.
두음 암기: 커번·뉴새·클복·북같
`커번`은 CurrentRecord의 현재 번호, `뉴새`는 NewRecord의 새 레코드 여부를 뜻합니다.
`클복`은 RecordsetClone의 복제 레코드셋, `북같`은 Bookmark로 같은 레코드 위치를 맞춘다는 뜻입니다.
암기 문장만 말하고 끝내지 말고 `번호 확인-상태 확인-별도 검색-폼 이동` 네 단계로 다시 풀어 말해야 문제에 적용할 수 있습니다.
네 속성은 서로 다른 질문에 답합니다
현재 몇 번째인가를 묻는다면 CurrentRecord, 새 레코드인가를 묻는다면 NewRecord입니다. 둘은 폼의 현재 위치를 보지만 반환하는 정보가 다릅니다.
폼의 레코드를 독립적으로 탐색하려면 RecordsetClone, 탐색 결과와 폼의 현재 위치를 같게 만들려면 Bookmark입니다.
선지에서 레코드 번호·새 입력 행·FindFirst·위치 동기화 중 어떤 단서가 보이는지 먼저 표시하면 속성명을 외우는 부담이 줄어듭니다.
CurrentRecord는 현재 레코드 번호입니다
Microsoft Access는 CurrentRecord를 폼에 표시된 현재 레코드 번호를 나타내는 Long 값으로 설정합니다. 이 값은 폼 좌하단의 레코드 번호 상자에 보이는 값과 대응합니다.
예를 들어 폼에서 세 번째 레코드를 보고 있다면 CurrentRecord는 현재 위치 번호를 알려 줍니다. 정렬이나 필터에 따라 표시 순서가 달라지면 이 위치도 달라질 수 있습니다.
따라서 CurrentRecord를 고객번호나 주문번호 같은 필드 값으로 해석하면 안 됩니다. 특정 필드의 실제 값은 해당 컨트롤이나 필드를 참조해야 합니다.
CurrentRecord는 기본키가 아닙니다
기본키는 레코드를 식별하는 데이터 값이고 CurrentRecord는 현재 폼에서의 표시 위치입니다. 이름에 Record가 들어가도 레코드 ID를 반환하는 속성이 아닙니다.
현재 레코드가 기본키 105번이라고 해서 CurrentRecord가 105가 되는 것은 아닙니다. 필터 결과의 두 번째 행이라면 현재 위치는 2로 표시될 수 있습니다.
선지에 `현재 레코드의 고유 키 값`이라는 표현이 있으면 CurrentRecord 설명으로 고르지 않습니다. `폼에 표시된 현재 레코드 번호`가 핵심 문장입니다.
NewRecord는 새 레코드 여부를 알려 줍니다
NewRecord는 폼의 현재 레코드가 새 레코드인지 판단하는 읽기 전용 Integer 속성입니다. 조건문에서는 True 또는 False처럼 사용할 수 있습니다.
사용자가 새 레코드 위치로 이동하면 아직 편집을 시작하지 않았더라도 NewRecord 값은 True입니다. 저장된 기존 레코드를 보고 있다면 False입니다.
따라서 `새 레코드에 값을 입력했는가`보다 `현재 위치가 새 레코드인가`에 초점을 맞춥니다. 입력 시작 여부를 따로 추정하지 않습니다.
CurrentRecord와 NewRecord를 바로 비교합니다
CurrentRecord의 답은 번호이고 NewRecord의 답은 상태입니다. `현재 몇 번째?`에는 CurrentRecord, `현재가 새 행?`에는 NewRecord를 연결합니다.
두 속성 모두 폼 보기와 데이터시트 보기에서 읽기 전용으로 사용됩니다. 디자인 보기에서는 사용할 수 없다는 공통점이 있습니다.
문제에서 `현재 레코드 번호가 4인지 검사`한다면 CurrentRecord를 비교하고, `새 레코드일 때만 안내`한다면 `If Me.NewRecord Then` 형태를 떠올립니다.
RecordsetClone은 폼 원본의 독립 탐색 창입니다
RecordsetClone은 폼의 RecordSource에 지정된 기본 쿼리나 테이블을 바탕으로 한 Recordset 복제본을 참조합니다. 폼에 필터가 적용되면 클론도 그 필터를 반영합니다.
이 속성은 폼 자체에서 직접 쓸 수 없는 DAO Find 계열 메서드를 사용하거나 폼의 레코드를 별도로 순회할 때 유용합니다.
`복제본`은 데이터를 다른 테이블에 저장한다는 뜻이 아닙니다. 같은 원본 레코드를 대상으로 별도의 커서를 움직일 수 있다는 의미로 이해합니다.
클론의 이동과 폼의 이동은 자동으로 같아지지 않습니다
RecordsetClone에서 FindFirst나 Move 메서드를 실행하면 클론 Recordset의 현재 레코드가 바뀝니다. 폼의 현재 레코드는 그대로일 수 있습니다.
Microsoft 문서도 클론에서 다른 레코드를 현재로 만든 뒤에는 DAO Bookmark 값을 폼의 Bookmark에 대입해 두 위치를 동기화해야 한다고 설명합니다.
따라서 `rs.FindFirst 조건`만 있는 코드를 보고 폼 화면까지 검색 결과로 이동했다고 단정하지 않습니다. Bookmark 대입이 이어지는지 확인합니다.
Bookmark는 같은 레코드 위치를 가리킵니다
폼의 Bookmark는 폼 원본에서 특정 레코드를 고유하게 식별하는 위치 표식입니다. 현재 레코드의 Bookmark를 저장했다가 다시 대입하면 그 레코드로 돌아갈 수 있습니다.
RecordsetClone은 폼과 대응되는 레코드셋이므로 클론에서 찾은 레코드의 Bookmark를 폼에 대입해 같은 레코드를 표시할 수 있습니다.
Bookmark 값은 레코드 번호와 같지 않습니다. 숫자처럼 더하거나 빼서 다음 레코드를 계산하는 용도로 사용하지 않습니다.
FindFirst 뒤에는 NoMatch와 Bookmark를 확인합니다
기본 순서는 `Set rs = Me.RecordsetClone`, `rs.FindFirst 조건`, `If Not rs.NoMatch Then`, `Me.Bookmark = rs.Bookmark`입니다.
FindFirst가 실패하면 NoMatch가 True가 되고 Recordset의 현재 레코드는 유효하지 않을 수 있습니다. 성공 여부를 확인하지 않고 Bookmark를 대입하면 오류로 이어질 수 있습니다.
시험에서는 `검색 객체 만들기 -> 조건으로 찾기 -> 찾았는지 검사 -> 폼 위치 맞추기` 네 줄의 순서를 통째로 기억합니다.
검색 이동 코드는 이 구조로 읽습니다
`Dim rs As DAO.Recordset` 다음 `Set rs = Me.RecordsetClone`으로 현재 폼의 복제 레코드셋을 얻습니다.
`rs.FindFirst "CustomerID = " & Me!cboCustomer`로 숫자형 고객 ID를 찾고, `If Not rs.NoMatch Then Me.Bookmark = rs.Bookmark`로 찾은 경우에만 폼을 이동합니다.
마지막에는 `rs.Close`와 `Set rs = Nothing`으로 객체 사용을 마칩니다. 문자열·날짜 조건은 따옴표와 구분 기호 규칙이 달라질 수 있으므로 이 글에서는 숫자형 조건 구조만 예로 듭니다.
Bookmark는 언제까지 유효한지 확인합니다
폼이 열릴 때 바인딩된 각 레코드에 Bookmark가 만들어지며 폼이 열려 있는 동안 사용합니다. 레코드 자체에 영구 저장되는 값은 아닙니다.
폼을 Requery하면 기존 Bookmark는 무효가 됩니다. 예전에 저장한 Bookmark를 Requery 뒤에도 그대로 사용할 수 있다고 보는 선지는 틀립니다.
서로 다른 Recordset의 Bookmark는 원본 테이블이 같아도 그대로 호환된다고 단정할 수 없습니다. 폼 이동에는 그 폼의 RecordsetClone을 사용하는 패턴이 안전합니다.
Current 이벤트와 CurrentRecord 속성을 섞지 않습니다
Current는 폼에서 다른 레코드가 현재 레코드가 될 때 발생하는 이벤트이고, CurrentRecord는 현재 표시 위치 번호를 알려 주는 속성입니다.
`Form_Current()`는 실행 시점을 묻고 `Me.CurrentRecord`는 값을 묻습니다. 이름이 비슷해도 이벤트와 속성이라는 문법적 역할부터 다릅니다.
Click·Load·Current·AfterUpdate의 전체 실행 시점은 기존 이벤트 전용 가이드에서 다루며, 이 글에서는 CurrentRecord와의 오인만 바로잡습니다.
자주 틀리는 선지 다섯 개를 고칩니다
`CurrentRecord는 현재 레코드의 기본키다`는 틀립니다. 폼에 표시된 현재 레코드 번호입니다. `NewRecord는 입력을 시작한 뒤에만 True다`도 틀립니다. 새 레코드로 이동하면 편집 전에도 True일 수 있습니다.
`RecordsetClone은 별도 테이블에 데이터를 복사한다`는 틀립니다. 폼 원본을 바탕으로 독립 탐색할 Recordset을 제공합니다. `FindFirst를 실행하면 폼도 자동 이동한다`도 틀립니다.
`Bookmark는 레코드 번호이므로 산술 계산할 수 있다`는 틀립니다. 특정 레코드 위치를 식별하는 표식이며 레코드 번호와 같지 않습니다.
문제 풀이 순서는 네 단계입니다
1단계. 단서가 현재 번호인지 새 레코드 상태인지 구분합니다. 번호면 CurrentRecord, 상태면 NewRecord입니다.
2단계. FindFirst나 Move가 보이면 대상이 RecordsetClone인지 확인합니다. 3단계. 검색 성공을 NoMatch로 검사하는지 봅니다.
4단계. 폼까지 이동해야 한다면 `폼.Bookmark = 레코드셋.Bookmark` 방향인지 확인합니다. 대입 방향을 거꾸로 읽지 않습니다.
30초 셀프 체크와 시험 직전 다섯 줄
질문 1. 현재 표시 번호는? CurrentRecord. 질문 2. 현재가 새 레코드인지는? NewRecord. 질문 3. 폼 레코드를 독립 검색하려면? RecordsetClone.
질문 4. FindFirst 실패 여부는? NoMatch. 질문 5. 찾은 레코드로 폼을 이동하려면? `Me.Bookmark = rs.Bookmark`.
시험 직전에는 `커번=번호`, `뉴새=새 행`, `클복=별도 탐색`, `NoMatch=검색 확인`, `북같=폼 위치 동기화` 다섯 줄만 다시 말합니다.
Microsoft 공식 문서로 재확인했습니다
본문은 Microsoft Learn의 Form.CurrentRecord, Form.NewRecord, Form.RecordsetClone, Form.Bookmark와 DAO Recordset.NoMatch 문서를 2026년 8월 22일 기준으로 대조했습니다.
현재 레코드 번호, 새 레코드 이동 시 True, 폼 원본의 복제 Recordset, 독립 탐색 뒤 Bookmark 동기화, Find 실패 뒤 NoMatch 확인을 공식 설명과 예제로 검증했습니다.
Access 버전과 데이터 원본에 따라 세부 동작 조건이 달라질 수 있으므로 실제 실습에서는 폼의 RecordSource, 필터, 기본 인덱스와 검색 조건 자료형도 함께 확인합니다.