[질문 1] 같은 '현재 폼'인데 왜 한쪽은 메인폼 이름(설치목적조회)을 적어야 하고, 한쪽은 안 적어도 되나요?
아래 상시 4회와 최종모의고사 4회 두 문제를 비교할 때 참조 방식이 달라서 헷갈립니다.
상시 4회 [설치목적조회] 폼 문제:
'보관일수' 필드의 값이 현재 하위 폼의 'txt보관일수' 컨트롤에 표시된 값과 같은 자료만을 대상으로 하시오.
-> 정답:
[forms]![설치목적조회]![CCTV설치현황]![txt보관일수]최종모의고사 4회 [교환현황] 폼 문제:
-> 정답: DLookUp("제품명", "전원공급기", "[제품코드]=[forms]![교환현황]![제품코드]")
[질문 2] VBA 조건절에서
[보관일수]뒤에&연산자와 큰따옴표로 찢어 쓰는 이유가 뭔가요?상시 4회 [설치목적조회] 폼의
cmd인쇄클릭 이벤트 문제 정답을 보면 아래처럼 나와 있습니다.정답지 작성법:
"관리구청='" & txt관리구청 & "' and [보관일수]=" & [forms]![설치목적조회]![CCTV설치현황]![txt보관일수]
제가 생각한 작성법:
"관리구청='" & txt관리구청 & "' and [보관일수]=[forms]![설치목적조회]![CCTV설치현황]![txt보관일수]"
안녕하세요.
두 질문은 “VBA가 지금 값을 계산하는지”와 “Access의 조건식 해석기가 나중에 이름을 찾아가는지”를 구분하면 정리가 됩니다.
1. 왜 어떤 때는 [Forms]![폼명]...을 쓰고, 어떤 때는 바로 컨트롤을 쓰나요?
기준은 그 컨트롤이 어디에 있고, 식이 어디에서 평가되느냐입니다.
상시 4회의 txt보관일수는 하위 폼에 있는 컨트롤입니다. 따라서 바깥의 메인 폼에서 접근하려면 계층을 따라가야 합니다.
[Forms]![설치목적조회]![CCTV설치현황]![txt보관일수]보다 명시적인 표준 표현은
[Forms]![설치목적조회]![CCTV설치현황].Form![txt보관일수]입니다.
의미는
Forms
→ 설치목적조회 메인 폼
→ CCTV설치현황 하위 폼 컨트롤
→ 그 하위 폼의 txt보관일수입니다.
반면 교환현황 문제의
DLookup("제품명","전원공급기",
"[제품코드]=[Forms]![교환현황]![제품코드]")에서는 비교할 값이 교환현황 메인 폼에 있는 제품코드이므로 하위 폼을 거칠 필요가 없습니다.
즉 차이는 이것입니다.
메인 폼의 컨트롤
→ [Forms]![교환현황]![제품코드]
하위 폼의 컨트롤
→ [Forms]![설치목적조회]![하위폼컨트롤].Form![txt보관일수]그리고 VBA 이벤트 프로시저 자체가 현재 폼의 모듈에 있다면 단순히
txt관리구청또는
Me.txt관리구청처럼 쓸 수도 있습니다.
따라서 “현재 폼이면 항상 폼 이름을 생략한다”는 규칙은 없습니다. DLookup, Filter, OpenReport의 조건 문자열처럼 Access가 별도로 식을 해석하는 곳에서는 [Forms]![폼명]...으로 명시하는 경우가 많습니다.
2. 왜 [보관일수]= 뒤에서 문자열을 끊고 &로 연결하나요?
교재 정답은
"관리구청='" & txt관리구청 & _
"' and [보관일수]=" & _
[Forms]![설치목적조회]![CCTV설치현황]![txt보관일수]입니다.
예를 들어
txt관리구청 = 마포구
txt보관일수 = 30이라면 VBA가 먼저 계산해서 최종 조건 문자열을 이렇게 만듭니다.
관리구청='마포구' and [보관일수]=30즉 마지막의
& [Forms]!...![txt보관일수]는 컨트롤의 실제 값 30을 VBA에서 꺼내 문자열에 붙이는 방식입니다.
그런데 질문자분이 생각하신
"관리구청='" & txt관리구청 &
"' and [보관일수]=[forms]![설치목적조회]![CCTV설치현황]![txt보관일수]"도 Access의 WhereCondition 같은 곳에서는 기능적으로 동작할 수 있습니다.
이 경우 VBA가 만드는 최종 문자열은
관리구청='마포구' and
[보관일수]=[Forms]![설치목적조회]![CCTV설치현황]![txt보관일수]이고, 그 문자열을 받은 Access가 다시 조건식으로 해석하면서 [Forms]!...를 찾아가 30이라는 값을 얻습니다.
즉 두 방법의 차이는 다음과 같습니다.
교재 방식
VBA가 컨트롤 값을 먼저 꺼냄
→ [보관일수]=30
질문자 방식
폼 참조식 자체를 문자열로 넘김
→ Access가 나중에 폼을 찾아 값을 얻음그래서 질문자 방식이 문법적으로 반드시 틀렸다고 할 수는 없습니다. 다만 컴활에서는 교재 정답처럼 실제 값을 &로 연결하는 방식이 더 명확하고, 자동채점의 코드 비교에도 안전합니다.
특히 문자값과 숫자값을 구분하는 것도 중요합니다.
' 문자
"관리구청='" & txt관리구청 & "'"결과:
관리구청='마포구'반면 보관일수가 숫자라면 작은따옴표 없이
"[보관일수]=" & txt보관일수결과:
[보관일수]=30로 만듭니다.
따라서 시험에서는 조건 문자열 안에 현재 폼의 값을 넣을 때는 "...=" & 컨트롤값 방식으로 작성한다고 익혀 두시면 가장 덜 헷갈립니다.
즐거운 하루 되세요.
-
관리자2026-09-11 09:29:51
안녕하세요.
두 질문은 “VBA가 지금 값을 계산하는지”와 “Access의 조건식 해석기가 나중에 이름을 찾아가는지”를 구분하면 정리가 됩니다.
1. 왜 어떤 때는
[Forms]![폼명]...을 쓰고, 어떤 때는 바로 컨트롤을 쓰나요?기준은 그 컨트롤이 어디에 있고, 식이 어디에서 평가되느냐입니다.
상시 4회의
txt보관일수는 하위 폼에 있는 컨트롤입니다. 따라서 바깥의 메인 폼에서 접근하려면 계층을 따라가야 합니다.[Forms]![설치목적조회]![CCTV설치현황]![txt보관일수]보다 명시적인 표준 표현은
[Forms]![설치목적조회]![CCTV설치현황].Form![txt보관일수]입니다.
의미는
Forms → 설치목적조회 메인 폼 → CCTV설치현황 하위 폼 컨트롤 → 그 하위 폼의 txt보관일수입니다.
반면
교환현황문제의DLookup("제품명","전원공급기", "[제품코드]=[Forms]![교환현황]![제품코드]")에서는 비교할 값이
교환현황메인 폼에 있는 제품코드이므로 하위 폼을 거칠 필요가 없습니다.즉 차이는 이것입니다.
메인 폼의 컨트롤 → [Forms]![교환현황]![제품코드] 하위 폼의 컨트롤 → [Forms]![설치목적조회]![하위폼컨트롤].Form![txt보관일수]그리고 VBA 이벤트 프로시저 자체가 현재 폼의 모듈에 있다면 단순히
txt관리구청또는
Me.txt관리구청처럼 쓸 수도 있습니다.
따라서 “현재 폼이면 항상 폼 이름을 생략한다”는 규칙은 없습니다. DLookup, Filter, OpenReport의 조건 문자열처럼 Access가 별도로 식을 해석하는 곳에서는
[Forms]![폼명]...으로 명시하는 경우가 많습니다.2. 왜
[보관일수]=뒤에서 문자열을 끊고&로 연결하나요?교재 정답은
"관리구청='" & txt관리구청 & _ "' and [보관일수]=" & _ [Forms]![설치목적조회]![CCTV설치현황]![txt보관일수]입니다.
예를 들어
txt관리구청 = 마포구 txt보관일수 = 30이라면 VBA가 먼저 계산해서 최종 조건 문자열을 이렇게 만듭니다.
관리구청='마포구' and [보관일수]=30즉 마지막의
& [Forms]!...![txt보관일수]는 컨트롤의 실제 값 30을 VBA에서 꺼내 문자열에 붙이는 방식입니다.
그런데 질문자분이 생각하신
"관리구청='" & txt관리구청 & "' and [보관일수]=[forms]![설치목적조회]![CCTV설치현황]![txt보관일수]"도 Access의
WhereCondition같은 곳에서는 기능적으로 동작할 수 있습니다.이 경우 VBA가 만드는 최종 문자열은
관리구청='마포구' and [보관일수]=[Forms]![설치목적조회]![CCTV설치현황]![txt보관일수]이고, 그 문자열을 받은 Access가 다시 조건식으로 해석하면서
[Forms]!...를 찾아가30이라는 값을 얻습니다.즉 두 방법의 차이는 다음과 같습니다.
교재 방식 VBA가 컨트롤 값을 먼저 꺼냄 → [보관일수]=30 질문자 방식 폼 참조식 자체를 문자열로 넘김 → Access가 나중에 폼을 찾아 값을 얻음그래서 질문자 방식이 문법적으로 반드시 틀렸다고 할 수는 없습니다. 다만 컴활에서는 교재 정답처럼 실제 값을
&로 연결하는 방식이 더 명확하고, 자동채점의 코드 비교에도 안전합니다.특히 문자값과 숫자값을 구분하는 것도 중요합니다.
' 문자 "관리구청='" & txt관리구청 & "'"결과:
관리구청='마포구'반면 보관일수가 숫자라면 작은따옴표 없이
"[보관일수]=" & txt보관일수결과:
[보관일수]=30로 만듭니다.
따라서 시험에서는 조건 문자열 안에 현재 폼의 값을 넣을 때는
"...=" & 컨트롤값방식으로 작성한다고 익혀 두시면 가장 덜 헷갈립니다.즐거운 하루 되세요.