이 글이 필요한 사람
컴활 1급 Access 문제에서 콤보 상자의 LimitToList와 AutoExpand가 함께 나오거나, NotInList 이벤트의 실행 조건을 묻는 보기가 헷갈리는 사람에게 맞는 글입니다. 세 이름은 모두 목록 입력과 관련되지만 실제 역할은 서로 다릅니다.
기존 `RecordSource·ControlSource·RowSource 차이` 글은 폼 원본·컨트롤 값·선택 목록의 출처를 맡고, `BoundColumn·ColumnCount·ColumnWidths 차이` 글은 저장 열·열 개수·열 폭을 맡습니다. 이 글은 목록 밖 입력을 허용할지와 그 뒤의 처리만 담당합니다.
검색에서는 `컴활 LimitToList`, `AutoExpand 차이`, `Access NotInList 이벤트`처럼 속성 하나를 확인하는 질문이 많습니다. 먼저 제한·완성·이벤트로 역할을 나누면 속성 시트와 VBA 보기를 빠르게 제거할 수 있습니다.
두음 암기부터 잡으세요: 리막·오채·낫처
`리막`은 LimitToList가 리스트 밖 값을 막는다는 뜻입니다. `오채`는 AutoExpand가 입력과 일치하는 값을 자동으로 채운다는 뜻이고, `낫처`는 NotInList가 목록에 없는 값을 처리한다는 뜻입니다.
속성 질문은 `입력 가능한 범위인가`, `입력 중 자동으로 채워지는가`, `목록에 없을 때 코드를 실행하는가`로 바꾸세요. 각각 LimitToList, AutoExpand, NotInList에 대응합니다.
두음은 철자를 외우는 장치가 아니라 동작을 구분하는 장치입니다. 목록의 출처나 저장할 열을 묻는다면 이 세 가지가 아니라 RowSource나 BoundColumn 쪽으로 이동해야 합니다.
세 항목은 제한·완성·사후 처리로 나뉩니다
LimitToList는 허용 범위를 정하는 부울 속성입니다. 목록에 없는 텍스트를 받아들일지 막을지를 결정하므로 입력 검증에 가깝습니다.
AutoExpand는 사용자가 글자를 입력하는 동안 목록에서 일치하는 값을 찾아 텍스트 부분을 채우는 부울 속성입니다. 값을 허용하거나 거부하는 규칙 자체가 아니라 입력을 돕는 기능입니다.
NotInList는 속성이 아니라 이벤트입니다. 제한된 목록에 없는 값을 입력했을 때 새 항목 추가, 안내 메시지, 취소 같은 후속 처리를 VBA로 작성할 수 있습니다.
LimitToList는 목록 밖 값을 허용할지 정합니다
Microsoft Learn에 따르면 LimitToList를 Yes로 설정하면 사용자는 콤보 상자 목록의 값 또는 목록 값과 일치하는 값만 입력할 수 있습니다. 목록에 없는 값을 그대로 확정하려 하면 Access가 제한을 적용합니다.
No로 설정하면 목록에 없는 텍스트도 입력할 수 있습니다. 다만 해당 컨트롤이나 필드에 ValidationRule이 있다면 그 규칙은 여전히 만족해야 하므로 `No이면 아무 값이나 무조건 저장`이라고 단정하면 안 됩니다.
문제 보기에서 `목록에 있는 값만 입력`, `목록 외 값 제한`, `목록 값으로 한정`이 보이면 LimitToList를 먼저 선택하세요. 자동 완성이나 새 항목 추가라는 표현이 없으면 AutoExpand와 NotInList를 끌어오지 않습니다.
AutoExpand는 타이핑한 글자와 맞는 값을 채웁니다
AutoExpand를 Yes로 설정하면 사용자가 콤보 상자에 글자를 입력할 때 목록에서 일치하는 첫 값을 찾아 나머지 텍스트를 자동으로 채웁니다. 긴 부서명이나 상품명을 빠르게 고를 때 쓰는 동작입니다.
No로 설정하면 입력한 글자에 따라 텍스트 부분을 자동 완성하지 않습니다. 그렇다고 목록 밖 값을 허용한다는 뜻은 아닙니다. 입력 허용 범위는 별도의 LimitToList가 결정합니다.
Microsoft Learn은 드롭다운 목록이 열린 상태에서는 LimitToList가 Yes일 때 AutoExpand가 No여도 일치하는 목록 값이 선택될 수 있다고 설명합니다. 시험에서는 두 속성의 기본 역할을 분리하되 실제 화면 상태에 따른 이 차이도 알아 두면 안전합니다.
Yes·No 조합은 네 칸 표로 판단합니다
LimitToList=Yes, AutoExpand=Yes이면 목록 값으로 제한하면서 입력한 글자와 맞는 값을 자동 완성합니다. 실무에서 선택 목록의 정확성과 입력 편의를 함께 잡는 조합입니다.
LimitToList=Yes, AutoExpand=No이면 목록 밖 값은 막되 일반적인 타이핑 자동 완성은 끕니다. LimitToList=No, AutoExpand=Yes이면 자동 완성은 돕지만 목록에 없는 값도 규칙 범위 안에서 입력할 수 있습니다.
둘 다 No이면 자동 완성 없이 목록 외 값 입력을 허용합니다. 문제에서 `자동 완성`과 `목록 제한`을 한 문장으로 묶어도 각각 다른 스위치이므로 Yes·No를 따로 판정하세요.
NotInList는 목록 밖 값을 확정하려 할 때 발생합니다
NotInList 이벤트는 사용자가 콤보 상자의 목록에 없는 값을 입력했을 때 발생하며, Microsoft Learn 기준으로 LimitToList가 Yes여야 사용할 수 있습니다. 제한이 없으면 목록 밖 값을 받아들이므로 이 이벤트로 처리할 이유가 사라집니다.
이 이벤트는 일치하지 않는 값을 입력한 뒤 다른 컨트롤로 이동하거나 레코드를 저장하려는 시점에 실행됩니다. 글자 하나를 누를 때마다 즉시 실행되는 키보드 이벤트와 구분하세요.
이벤트 프로시저는 `NewData`와 `Response` 인수를 받습니다. NewData에는 사용자가 입력한 새 문자열이 들어가고, Response에는 Access의 기본 오류 표시나 후속 동작을 어떻게 할지 지정합니다.
Response 상수는 표시·계속·추가로 구분합니다
acDataErrDisplay는 기본 오류 메시지를 표시하는 기본 응답입니다. 별도 처리 없이 Access의 안내를 그대로 보여 줄 때 해당합니다.
acDataErrContinue는 기본 오류 메시지를 억제하고 작성한 코드의 사용자 안내나 처리를 이어 갈 때 사용합니다. 새 값을 실제 목록 원본에 추가했다는 뜻은 아닙니다.
코드에서 NewData를 RowSource가 사용하는 테이블 등에 추가했다면 acDataErrAdded를 사용해 Access가 콤보 상자를 다시 조회하도록 알릴 수 있습니다. `Continue=추가 성공`으로 외우지 말고, 실제 추가 후에는 Added라고 구분하세요.
목록 밖 허용과 RowSource 추가는 다른 일입니다
LimitToList=No인 바운드 콤보 상자에 목록 밖 값을 입력하면 그 값은 ControlSource가 연결된 현재 레코드의 필드에 저장될 수 있습니다. 그러나 Microsoft Learn은 그 값이 콤보 상자의 RowSource에 자동으로 추가되는 것은 아니라고 명시합니다.
예를 들어 부서명 목록에 `연구팀`이 없는데 목록 밖 입력을 허용했다면 현재 레코드에는 연구팀이라는 텍스트가 저장될 수 있습니다. 그렇다고 부서 테이블에 새 부서 레코드가 생기는 것은 아닙니다.
목록 자체를 늘리려면 NotInList 이벤트에서 별도의 추가 쿼리나 레코드 입력 코드를 실행해야 합니다. `저장 칸=ControlSource`, `선택 후보=RowSource`, `목록 외 처리=NotInList` 경계를 유지하세요.
BoundColumn과 Null 예외까지 확인하면 오답이 줄어듭니다
Microsoft Learn은 콤보 상자의 BoundColumn이 첫 번째 표시 열이 아니거나 BoundColumn이 0이면 LimitToList가 자동으로 Yes가 된다고 설명합니다. 저장 기준 열과 표시 목록 구조가 특수한 경우 목록 제한이 함께 따라오는 셈입니다.
LimitToList=Yes라고 해서 Null까지 자동으로 금지하는 것은 아닙니다. 연결된 필드에 반드시 값이 있어야 한다면 테이블 필드의 Required 같은 별도 규칙도 확인해야 합니다.
시험 파일에서는 속성 시트의 LimitToList와 AutoExpand, 데이터 탭의 RowSource, BoundColumn을 함께 보고 이벤트 탭의 NotInList 프로시저까지 확인하세요. 한 속성만 보고 전체 동작을 단정하지 않는 것이 핵심입니다.
시험 직전에는 6줄로 복습하세요
첫째, 두음은 `리막·오채·낫처`입니다. 둘째, LimitToList는 목록 밖 입력 제한입니다. 셋째, AutoExpand는 입력 글자와 맞는 값 자동 완성입니다.
넷째, NotInList는 LimitToList=Yes일 때 목록 외 값을 처리하는 이벤트입니다. 다섯째, NewData는 새 문자열이고 Response는 처리 결과입니다. 여섯째, 실제 추가 후에는 acDataErrAdded를 사용합니다.
마지막으로 목록 밖 값을 허용해 현재 레코드에 저장하는 것과 RowSource에 새 항목을 추가하는 것은 다릅니다. 제한-완성-이벤트-원본 네 층을 나누면 콤보 상자 문제가 정리됩니다.