이 글이 필요한 사람
컴활 1급 Access 프로시저에서 값 대입식은 이해하지만 Me!txt금액, Forms!판매현황!txt합계, Me.RecordSource처럼 참조 시작점이 달라질 때 멈추는 사람에게 맞는 글입니다.
기존 프로시저 풀이 가이드는 개체·이벤트·값·조건·검토의 전체 순서를 맡고, 이벤트 가이드는 Click·Load·Current·AfterUpdate 실행 시점을 맡습니다. 이 글은 코드가 읽거나 바꿀 폼과 컨트롤의 위치를 정확히 지정하는 참조법만 좁게 다룹니다.
두음 암기부터 잡으세요: 미현재·폼즈열림
'미현재'는 Me가 현재 코드가 실행되는 폼을 가리킨다는 뜻입니다. '폼즈열림'은 Forms 컬렉션이 데이터베이스의 모든 저장된 폼이 아니라 현재 열려 있는 폼만 담는다는 뜻입니다.
재미 문장은 '미 대리는 현재 방을 보고, 폼즈 팀장은 열린 다른 방까지 찾는다'입니다. 문장은 기억용이고 실제 코드에서는 '현재 폼 -> Me, 다른 열린 폼 -> Forms!폼이름'으로 바꿉니다.
참조식을 외우기 전에 지시문에 현재 폼, 다른 폼, 하위 폼 중 어디의 값을 쓰는지 표시하세요. 시작 개체가 정해지면 뒤의 컨트롤 이름과 속성을 붙이기 쉬워집니다.
Me는 현재 실행 중인 폼 인스턴스를 가리킵니다
Microsoft Learn은 Me를 클래스 모듈의 모든 프로시저에서 자동으로 사용할 수 있으며, 코드가 실행되는 특정 인스턴스를 가리키는 키워드라고 설명합니다. Access 폼 모듈에서는 현재 그 코드를 실행하는 폼을 뜻합니다.
예를 들어 현재 폼의 레코드 원본을 바꾸면 Me.RecordSource처럼 폼 속성에 점을 붙일 수 있습니다. 현재 폼의 텍스트 상자를 가리키면 Me!txt고객명처럼 컨트롤 이름을 붙입니다.
Me는 아무 모듈에서나 현재 화면을 뜻하는 만능 단어가 아닙니다. 표준 모듈은 특정 폼 인스턴스 자체를 나타내지 않으므로 Microsoft 문서도 표준 모듈에서 Me를 사용할 수 없다고 안내합니다.
현재 폼의 컨트롤은 Me!컨트롤명으로 시작합니다
현재 폼 모듈 안에서 컨트롤 값을 읽거나 속성을 바꿀 때는 Me!txt고객명, Me!cmb지역처럼 씁니다. Microsoft Access의 Controls 설명은 Me!NewData와 Me.Controls!NewData, Me.Controls("NewData") 같은 참조 방식을 제시합니다.
느낌표 뒤에는 폼의 Controls 컬렉션에 들어 있는 실제 컨트롤 이름이 옵니다. 화면에 보이는 제목이나 레이블 문구가 아니라 속성 시트의 이름을 확인해야 합니다.
컨트롤의 속성은 그 뒤에 점으로 붙입니다. 예를 들어 Me!txt고객명.Visible은 현재 폼의 txt고객명 컨트롤에서 Visible 속성을 가리키는 구조입니다. 시작 개체, 컨트롤, 속성의 세 칸으로 읽으세요.
다른 열린 폼은 Forms!폼이름!컨트롤명으로 참조합니다
Microsoft Learn의 Forms 설명에 따르면 Forms 컬렉션에는 현재 열려 있는 모든 폼이 들어 있습니다. 다른 폼의 값을 읽으려면 먼저 Forms 컬렉션, 그다음 폼 이름, 마지막에 컨트롤 이름을 지정합니다.
예를 들어 판매입력 폼의 txt고객번호를 다른 폼에서 참조한다면 Forms!판매입력!txt고객번호처럼 읽습니다. '열린 폼 모음 -> 판매입력 폼 -> 고객번호 컨트롤'의 경로입니다.
Forms!폼이름만 쓰고 컨트롤을 바로 찾을 수 있는 이유는 Controls 컬렉션을 묵시적으로 참조하기 때문입니다. Forms!판매입력.Controls!txt고객번호처럼 Controls를 명시해도 같은 위치를 설명할 수 있습니다.
Forms는 폼이 열려 있어야 값에 접근할 수 있습니다
Forms 컬렉션은 현재 열려 있는 폼만 포함합니다. 데이터베이스 창에 폼 개체가 저장되어 있어도 닫혀 있다면 Forms!폼이름 경로로 그 폼의 현재 컨트롤 값을 읽을 수 없습니다.
따라서 다른 폼 참조가 실행되지 않으면 문법만 고치기 전에 대상 폼이 실제로 열려 있는지 확인하세요. 폼을 여는 동작과 값을 읽는 동작의 실행 순서도 함께 봐야 합니다.
모든 저장된 폼 이름을 나열하는 AllForms와 현재 열린 폼 인스턴스를 다루는 Forms는 역할이 다릅니다. 컴활 프로시저의 값 참조에서는 대부분 현재 열린 폼의 Forms 경로가 핵심입니다.
느낌표·점·괄호는 역할로 나누면 덜 헷갈립니다
느낌표는 Forms!판매입력!txt고객번호처럼 이름으로 폼이나 컨트롤을 이어 찾을 때 자주 사용합니다. 점은 Me.RecordSource, Me!txt고객번호.Visible처럼 이미 찾은 개체의 속성이나 정해진 멤버를 이어 갈 때 사용합니다.
괄호 표기는 Forms("판매입력").Controls("txt고객번호")처럼 컬렉션에서 문자열 이름으로 항목을 찾는 방식입니다. 컨트롤 이름을 변수로 받아야 하는 코드에서는 괄호 방식이 필요할 수 있지만, 시험 지시문이 고정 이름을 주면 느낌표 경로가 더 짧게 읽힙니다.
이름에 공백이 있으면 Forms![판매 입력]![고객 번호]처럼 대괄호로 묶을 수 있습니다. 다만 실제 시험 연습에서는 캡션이 아니라 속성 시트의 개체 이름을 먼저 확인하는 습관이 더 중요합니다.
하위 폼은 하위 폼 컨트롤 뒤에 Form을 한 번 건넙니다
하위 폼의 내부 컨트롤을 참조할 때는 메인 폼, 하위 폼 컨트롤, 그 안의 Form 개체, 내부 컨트롤 순서로 이동합니다. Microsoft Learn은 Forms!Orders!OrderDetails.Form!OrderID 같은 예를 제시합니다.
여기서 OrderDetails는 하위 폼 자체의 이름이 아니라 메인 폼에 놓인 하위 폼 컨트롤 이름일 수 있습니다. 하위 폼 원본 개체 이름과 하위 폼 컨트롤 이름이 다르면 속성 시트에서 컨트롤 이름을 확인해야 합니다.
하위 폼 참조는 점과 느낌표를 무작정 외우기보다 '메인 폼 -> 하위 폼 컨트롤 -> .Form -> 내부 컨트롤' 네 칸으로 그리면 덜 틀립니다.
참조 오류는 위치·열림·이름·속성 순서로 찾습니다
첫째, 코드가 현재 폼 모듈 안인지 다른 폼 또는 표준 모듈인지 확인합니다. 현재 폼이면 Me, 다른 열린 폼이면 Forms!폼이름을 시작점으로 둡니다.
둘째, Forms를 썼다면 대상 폼이 열려 있는지 봅니다. 셋째, 화면 캡션이 아니라 폼과 컨트롤의 실제 이름을 확인합니다. 넷째, 마지막 점 뒤에 붙인 Visible, Value, RecordSource 같은 속성이 그 개체에 맞는지 봅니다.
하위 폼이면 중간의 하위 폼 컨트롤 이름과 .Form 다리를 확인합니다. 참조 경로를 왼쪽부터 한 칸씩 읽으면 한 줄 전체를 다시 쓰는 것보다 오류 위치를 빠르게 찾을 수 있습니다.
시험 직전에는 5줄만 남기세요
첫째, '미현재·폼즈열림'을 떠올립니다. 둘째, 현재 폼 모듈의 컨트롤은 Me!컨트롤명입니다. 셋째, 다른 열린 폼은 Forms!폼이름!컨트롤명입니다.
넷째, 폼이 닫혀 있으면 Forms 컬렉션에서 현재 값을 참조할 수 없습니다. 다섯째, 하위 폼은 메인 폼·하위 폼 컨트롤·.Form·내부 컨트롤 순서입니다.
마지막으로 캡션이 아니라 실제 개체 이름을 확인하고, 컨트롤 뒤에 붙은 속성까지 왼쪽에서 오른쪽으로 읽으세요.