이 글이 필요한 사람
컴활 1급 데이터베이스 실기에서 콤보 상자 속성 시트의 BoundColumn, ColumnCount, ColumnWidths가 한꺼번에 나오면 어느 값이 저장되고 어느 열이 보이는지 헷갈리는 사람에게 맞는 글입니다.
기존 `RecordSource·ControlSource·RowSource 차이` 글은 폼 전체 원본, 컨트롤 값 원본, 선택 목록 원본을 구분합니다. 이 글은 RowSource가 이미 준비된 뒤 그 목록의 열을 몇 개 쓰고, 무엇을 저장하며, 어떻게 보일지만 좁게 맡습니다.
검색에서는 `컴활 BoundColumn`, `ColumnWidths 0`, `Access 콤보 상자 열 숨기기`처럼 속성 하나만 찾는 경우가 많습니다. 실제 문제에서는 세 속성이 한 묶음으로 움직이므로 표 한 줄처럼 연결해 두는 편이 빠릅니다.
두음 암기부터 잡으세요: 바저·카개·위폭
`바저`는 BoundColumn이 저장할 열, `카개`는 ColumnCount가 열 개수, `위폭`은 ColumnWidths가 각 열의 폭이라는 뜻입니다. 영문 철자보다 결과를 바로 떠올리기 위한 암기입니다.
세 속성을 질문으로 바꾸면 더 분명합니다. `어느 열 값을 저장하지?`는 BoundColumn, `열을 몇 개 쓰지?`는 ColumnCount, `각 열을 얼마나 보이지?`는 ColumnWidths입니다.
시험 직전에는 `저장-개수-폭`만 말한 뒤 각 속성을 붙이세요. RowSource와 ControlSource까지 섞이면 `목록은 RowSource, 저장 칸은 ControlSource, 저장 열은 BoundColumn` 순서로 범위를 나눕니다.
세 속성은 선택 목록의 서로 다른 층을 맡습니다
RowSource가 `상품코드, 상품명, 단가` 세 열을 반환한다고 가정해 보겠습니다. ColumnCount는 이 가운데 콤보 상자가 사용할 열 수를 정하고, ColumnWidths는 코드·이름·단가 열의 화면 너비를 정합니다.
사용자가 한 행을 고른 뒤 어떤 열 값이 콤보 상자의 값이 되는지는 BoundColumn이 정합니다. 콤보 상자가 필드에 바인딩되어 있다면 그 값이 ControlSource가 가리키는 필드에 연결됩니다.
따라서 `목록의 출처 -> 열 수 -> 열 폭 -> 저장 열 -> 저장 필드` 흐름으로 읽으면 됩니다. 한 속성이 모든 일을 한다고 생각하면 보이는 값과 저장되는 값이 다를 때 오류를 찾기 어렵습니다.
ColumnCount는 RowSource에서 사용할 열 개수입니다
Microsoft Learn은 ColumnCount를 콤보 상자나 목록 상자에 표시할 열 수를 지정하는 속성으로 설명합니다. 설정값은 1 이상이며 RowSource에서 사용할 수 있는 열 수를 넘길 수 없습니다.
예를 들어 RowSource가 `부서코드, 부서명` 두 열을 반환하고 ColumnCount가 2이면 두 열을 목록 구성에 사용합니다. ColumnCount를 1로 두면 첫 번째 열만 목록에 사용되므로 뒤 열을 폭만 조절해서 다시 나타낼 수는 없습니다.
문제 파일에서는 RowSource의 SELECT 절 열 순서와 ColumnCount를 함께 확인하세요. 열 이름을 셀 때는 SELECT에 나열된 순서를 왼쪽부터 읽고, `*`를 썼다면 실제 원본 필드 구성을 확인합니다.
BoundColumn은 선택한 행에서 저장할 열을 고릅니다
BoundColumn은 선택된 행의 어느 열 값이 콤보 상자 또는 목록 상자의 값이 될지 지정합니다. 기본값은 1이며 일반적인 설정에서는 첫 번째 열을 1, 두 번째 열을 2로 셉니다.
예를 들어 RowSource가 `부서코드, 부서명`이고 BoundColumn이 1이면 사용자가 부서명을 보고 골라도 컨트롤 값은 첫 번째 열의 부서코드가 됩니다. ControlSource가 현재 레코드의 부서코드 필드라면 그 코드가 저장됩니다.
BoundColumn을 0으로 설정하면 Microsoft Learn 기준으로 열 값 대신 목록의 ListIndex 값이 컨트롤 값이 됩니다. 컴활 문제에서는 대개 1 이상의 열 번호를 쓰지만, 0의 특수 의미가 보기로 나오면 열 숨김과 혼동하지 마세요.
ColumnWidths는 세미콜론으로 각 열의 폭을 정합니다
ColumnWidths에는 열 순서대로 너비를 세미콜론으로 구분해 입력합니다. 예를 들어 두 열을 `0cm;3cm`로 설정하면 첫 번째 열은 숨기고 두 번째 열은 3cm 너비로 보여 줍니다.
Microsoft Learn은 인치 또는 센티미터 같은 측정 단위를 사용할 수 있고, 열 너비를 0으로 설정하면 그 열이 숨겨진다고 설명합니다. 단위를 생략했을 때의 기준은 Access와 Windows 지역 설정에 영향을 받을 수 있으므로 문제 지시문의 형식을 그대로 따르는 편이 안전합니다.
값을 비워 둔 열은 기본 너비가 적용될 수 있습니다. 실기에서는 눈대중으로 드롭다운을 조절하기보다 속성 시트에 요구된 ColumnWidths 문자열이 정확히 들어갔는지 확인하세요.
보이는 이름과 저장되는 코드를 분리할 수 있습니다
가장 자주 쓰는 구조는 첫 번째 열에 코드, 두 번째 열에 사람이 읽을 이름을 두는 방식입니다. ColumnCount는 2, BoundColumn은 1, ColumnWidths는 `0cm;3cm`처럼 설정합니다.
이 설정에서는 첫 번째 코드 열의 폭이 0이라 사용자에게 보이지 않지만 BoundColumn이 1이므로 실제 컨트롤 값은 코드입니다. 사용자는 부서명이나 상품명을 보고 고르고 데이터에는 안정적인 키 값을 저장할 수 있습니다.
`숨긴 열은 사용할 수 없다`는 식으로 판단하면 틀립니다. ColumnWidths의 0은 화면에서 감출 뿐이며, ColumnCount에 포함되고 BoundColumn이 가리키는 열이면 그 값을 저장할 수 있습니다.
BoundColumn과 Column(n)의 번호 기준은 다릅니다
속성 시트의 BoundColumn은 첫 번째 열을 1로 셉니다. 반면 VBA에서 콤보 상자의 `Column(n)` 속성은 첫 번째 열이 `Column(0)`, 두 번째 열이 `Column(1)`인 0 기반 번호를 사용합니다.
예를 들어 BoundColumn=1로 첫 번째 코드 열을 저장하면서 화면이나 코드에서 두 번째 이름 열을 읽으려면 `Me!cbo부서.Column(1)`처럼 접근합니다. 같은 두 번째 열을 BoundColumn으로 지정할 때는 2입니다.
시험장에서는 `Bound는 1부터, 괄호 Column은 0부터`라고 따로 표시하세요. 열 자체는 같아도 속성값과 VBA 인덱스 숫자가 하나 차이 나는 것이 대표 함정입니다.
RowSource·ControlSource와 역할을 섞지 마세요
RowSource는 후보 목록 자체를 공급합니다. ColumnCount와 ColumnWidths는 그 후보 목록의 열 구성을 조절하고, BoundColumn은 선택된 행에서 컨트롤 값으로 삼을 열을 정합니다.
ControlSource는 최종 컨트롤 값이 연결될 필드나 식입니다. 따라서 `부서 테이블에서 목록을 가져온다`는 RowSource, `코드와 이름 두 열을 쓴다`는 ColumnCount, `코드는 숨긴다`는 ColumnWidths, `코드를 값으로 쓴다`는 BoundColumn, `현재 레코드 부서코드에 연결한다`는 ControlSource입니다.
문제 지시문을 이 다섯 문장으로 번역하면 속성 하나를 빠뜨릴 가능성이 줄어듭니다. 원본 세 속성의 큰 차이가 아직 흐리다면 관련 가이드를 먼저 보고 돌아오세요.
실기에서는 속성 시트와 드롭다운을 함께 검증하세요
디자인 보기에서 콤보 상자를 선택한 뒤 데이터 탭의 RowSource·ControlSource·BoundColumn과 형식 탭의 ColumnCount·ColumnWidths를 확인합니다. Access 버전과 속성 시트 분류에 따라 위치 표시는 조금 달라도 속성 이름은 같습니다.
설정 후 폼 보기로 전환해 드롭다운에 필요한 이름 열이 보이는지, 선택 뒤 연결 필드에는 코드값이 들어가는지 확인하세요. 보이는 모양만 맞아도 저장 열이 틀릴 수 있고, 저장값만 맞아도 사용자에게 코드만 보일 수 있습니다.
오류가 나면 첫째 RowSource 열 순서, 둘째 ColumnCount, 셋째 ColumnWidths 항목 수, 넷째 BoundColumn, 다섯째 ControlSource 순서로 확인합니다. 이 순서는 데이터가 목록에 들어오는 방향부터 저장되는 방향까지 따라갑니다.
시험 직전에는 6줄로 복습하세요
첫째, 두음은 `바저·카개·위폭`입니다. 둘째, BoundColumn은 저장할 열입니다. 셋째, ColumnCount는 사용할 열 개수입니다.
넷째, ColumnWidths는 세미콜론으로 열 폭을 나열하고 0은 숨김입니다. 다섯째, 숨긴 열도 BoundColumn으로 저장할 수 있습니다. 여섯째, BoundColumn은 1부터, Column(n)은 0부터 셉니다.
마지막으로 `목록 RowSource -> 구성 Count·Widths -> 값 BoundColumn -> 저장 칸 ControlSource`를 한 번 말하세요. 속성 이름이 길어도 데이터 이동 순서를 잡으면 보기 제거가 빨라집니다.