이 글이 필요한 사람
Access 프로시저에서 ListIndex·ListCount·ItemData는 외웠지만 다중 선택 목록상자 코드가 나오면 순서를 놓치는 수험생에게 필요한 글입니다.
`MultiSelect`, `ItemsSelected`, `ItemData`, `Selected`가 모두 선택과 관련돼 보여도 각각 설정값·컬렉션·값 반환·선택 상태라는 역할이 다릅니다.
현재 한 행과 전체 행 수를 먼저 복습하려면 `access-listindex-listcount-itemdata-check`, 저장 열과 표시 열을 구분하려면 `access-boundcolumn-columncount-columnwidths-check`를 함께 보세요.
두음 암기부터 시작하세요: 다선모값
`다선`은 MultiSelect로 다중 선택 방식을 정한다는 뜻입니다. `모`는 ItemsSelected가 선택된 행 인덱스를 모은다는 뜻이고, `값`은 ItemData가 그 행의 바운드 열 값을 돌려준다는 뜻입니다.
한 문장으로는 ‘다 선택하면 인덱스를 모아 값으로 바꾼다’입니다.
코드 순서도 그대로 `MultiSelect 확인 → ItemsSelected 순회 → ItemData(index)`로 외우면 됩니다.
10초 비교: 속성·컬렉션·값 반환을 나누세요
MultiSelect는 목록상자가 여러 행을 선택할 수 있는지와 선택 방식을 정하는 속성입니다.
ItemsSelected는 현재 선택된 행의 인덱스들을 제공하는 읽기 전용 컬렉션이고, ItemData는 전달받은 한 행 인덱스의 바운드 열 값을 반환합니다.
Selected(index)는 특정 행이 선택됐는지를 True·False로 확인하거나 설정합니다. 문제에서 ‘여러 행 모음’이면 ItemsSelected, ‘한 행 상태’이면 Selected를 먼저 떠올리세요.
MultiSelect의 None·Simple·Extended 차이
Microsoft Learn 기준 None은 0이며 기본값이고 다중 선택을 허용하지 않습니다. Simple은 1이며 항목을 클릭하거나 Spacebar를 눌러 각 항목을 선택·해제합니다.
Extended는 2이며 Shift로 연속 범위를 넓히고 Ctrl로 개별 항목을 선택·해제할 수 있습니다. 마우스 끌기로 여러 항목을 선택하는 방식도 지원합니다.
MultiSelect는 폼 디자인 보기에서 설정하는 속성입니다. 시험 선지에서 런타임마다 임의로 바꾸는 일반 상태 속성처럼 설명하면 의심해야 합니다.
ItemsSelected에는 값이 아니라 행 인덱스가 들어 있습니다
ItemsSelected는 숨겨진 읽기 전용 컬렉션에 대한 참조를 반환합니다. 일반 개체 컬렉션과 달리 각 항목은 선택 행을 가리키는 정수 인덱스인 Variant입니다.
따라서 `For Each varItem In Me!lstEmployee.ItemsSelected`의 varItem은 사원명이나 사원번호가 아니라 행 위치입니다.
공식 문서상 이 컬렉션은 Count와 Item 속성을 가지며 메서드는 없습니다. 선택 데이터는 ItemData 또는 Column 속성과 연결해 읽습니다.
ItemData(index)는 바운드 열 값을 반환합니다
ItemData는 지정한 행의 바운드 열 데이터를 반환하는 읽기 전용 Variant 속성입니다. 목록상자와 콤보상자의 행 인덱스는 0부터 시작합니다.
따라서 `ItemData(0)`은 첫 번째 행이고 `ItemData(5)`는 여섯 번째 행입니다. 화면에서 보이는 1번째·6번째를 그대로 인수에 넣으면 한 칸씩 밀립니다.
ItemsSelected가 넘겨준 인덱스를 ItemData에 그대로 넣으면 선택된 각 행의 바운드 열 값을 얻을 수 있습니다.
Selected(index)는 한 행의 선택 상태입니다
Selected는 0부터 시작하는 배열 형태의 속성이며 지정 행이 선택됐으면 True, 아니면 False입니다. 이 속성은 실행 중에 사용할 수 있습니다.
`Me!lstEmployee.Selected(4) = True`는 다섯 번째 행을 선택합니다. 반대로 False를 대입하면 해당 행의 선택을 해제할 수 있습니다.
ItemsSelected는 선택된 행 전체를 반복할 때 편하고, Selected(index)는 특정 행 하나의 상태를 검사하거나 바꿀 때 편합니다.
다중 선택 목록상자에서 Value를 쓰면 왜 안 되나요?
Microsoft Learn은 MultiSelect가 Simple 또는 Extended인 목록상자의 Value가 항상 Null이라고 설명합니다.
한 개만 선택된 것처럼 보여도 다중 선택 모드에서는 `Me!목록상자.Value` 하나로 선택 값을 얻는 구조가 아닙니다. 선택된 행을 ItemsSelected에서 확인해야 합니다.
시험에서 ‘다중 선택 목록상자의 모든 선택 값을 Value 속성으로 반환한다’는 선지가 나오면 틀린 설명으로 볼 수 있습니다.
선택된 값을 읽는 VBA 흐름
기본 형태는 `Dim varItem As Variant`로 순회 변수를 만든 뒤 `For Each varItem In Me!lstEmployee.ItemsSelected`를 시작하는 것입니다.
반복문 안에서 `Debug.Print Me!lstEmployee.ItemData(varItem)`을 실행하면 각 선택 행의 바운드 열 값이 출력됩니다.
마지막에 `Next varItem`으로 닫습니다. 시험장에서는 `For Each → ItemsSelected → ItemData(varItem) → Next` 네 조각의 순서가 맞는지 먼저 확인하세요.
바운드 열이 아닌 다른 열은 Column으로 읽습니다
ItemData는 지정 행의 바운드 열만 반환합니다. 화면에 보이는 다른 열 값까지 모두 돌려주는 속성이 아닙니다.
선택 행의 특정 열을 읽으려면 `목록상자.Column(열인덱스, 행인덱스)` 형태를 사용합니다. 열과 행 모두 0부터 시작하는 점을 확인하세요.
`For Each varItem In ItemsSelected` 안에서 `Column(1, varItem)`을 쓰면 선택 행의 두 번째 열을 읽는 방식입니다.
Simple과 Extended의 선택 상태 유지 함정
Simple은 항목을 하나씩 토글하는 방식이고 Extended는 Shift·Ctrl을 이용해 일반 파일 목록처럼 범위와 개별 선택을 조합합니다.
Microsoft Learn은 MultiSelect가 Extended일 때 목록상자를 Requery하면 사용자가 만든 선택이 지워진다고 설명합니다.
따라서 Requery 뒤에도 Extended 선택이 자동으로 유지된다는 선지는 경계해야 합니다. 데이터 갱신과 선택 상태 보존을 같은 동작으로 보지 마세요.
기존 ListIndex·ListCount·ItemData 글과 무엇이 다른가요?
ListIndex는 현재 선택 행의 인덱스, ListCount는 목록의 전체 행 수, ItemData는 지정 행의 바운드 열 값을 읽는 기본 조합입니다.
이번 글은 한 행이나 전체 목록을 순회하는 일반 구조가 아니라 여러 선택 행만 골라 처리하는 구조입니다. 그래서 ItemsSelected와 MultiSelect가 중심입니다.
검색 의도를 나누면 `현재 위치·전체 개수`는 기존 글, `다중 선택된 행만 반복`은 이 글입니다.
자주 틀리는 함정 네 가지
1. ItemsSelected 안에 실제 사원번호나 이름이 들어 있다고 생각하지 않습니다. 들어 있는 것은 행 인덱스입니다.
2. ItemData가 모든 열을 반환한다고 생각하지 않습니다. 기본 반환값은 바운드 열입니다.
3. 다중 선택 목록상자의 Value로 여러 값을 읽으려 하지 않습니다. Simple·Extended에서는 Value가 Null입니다.
4. 다섯 번째 행에 5를 넣지 않습니다. 0부터 시작하므로 다섯 번째 행의 인덱스는 4입니다.
문제에서 적용하는 순서
1단계. 대상이 목록상자이고 MultiSelect가 None·Simple·Extended 중 무엇인지 확인합니다.
2단계. 선택된 여러 행 전체가 필요하면 ItemsSelected, 특정 한 행 상태가 필요하면 Selected(index)를 고릅니다.
3단계. ItemsSelected에서 얻은 행 인덱스를 ItemData에 넣어 바운드 열 값을 읽습니다.
4단계. 다른 열이 필요하면 Column(열, 행), 전체 행 수가 필요하면 ListCount로 바꿉니다.
시험 직전에는 다섯 줄만 봅니다
1. MultiSelect: None 0, Simple 1, Extended 2입니다.
2. ItemsSelected: 선택 행 값이 아니라 0부터 시작하는 행 인덱스 모음입니다.
3. ItemData(index): 지정 행의 바운드 열 값을 반환합니다.
4. Selected(index): 특정 행의 선택 상태를 True·False로 확인·설정합니다.
5. Simple·Extended 목록상자의 Value는 Null이므로 ItemsSelected를 순회합니다.
30초 셀프 체크
1. 여러 선택 행의 인덱스 컬렉션은 무엇인가요? → ItemsSelected입니다.
2. ItemsSelected의 각 인덱스로 바운드 열 값을 읽는 속성은 무엇인가요? → ItemData(index)입니다.
3. 여섯 번째 행의 ItemData 인덱스는 무엇인가요? → 5입니다.
4. 특정 행이 선택됐는지 확인하는 속성은 무엇인가요? → Selected(index)입니다.
5. MultiSelect가 Simple 또는 Extended일 때 Value는 무엇인가요? → Null입니다.
공식 근거에서 확인한 범위
Microsoft Learn의 ListBox.MultiSelect 문서에서 None·Simple·Extended 설정값, 디자인 보기 제약, 다중 선택 시 Value=Null, Extended Requery의 선택 초기화를 확인했습니다.
ListBox.ItemsSelected 문서에서 읽기 전용 컬렉션, Variant 정수 행 인덱스, Count·Item 속성, For Each와 ItemData 연결을 확인했습니다.
ListBox.ItemData와 Selected 문서에서 0 기반 행 인덱스, 바운드 열 반환, 특정 행의 True·False 선택 상태를 확인했습니다.