Criteria는 완성된 조건 문자열 한 덩어리입니다
DLookup("[단가]", "상품", "[상품번호]=7")에서 세 번째 인수는 [상품번호]=7이라는 조건 문자열입니다. WHERE [상품번호]=7처럼 WHERE까지 넣는 자리가 아닙니다. Expr·Domain·Criteria의 선택 자체는 기존 함수 인수 가이드에서 확인하고, 여기서는 마지막 문자열만 따로 봅니다.
또한 조건에 사용한 상품번호 필드는 상품이라는 Domain 안에 있어야 합니다. 바깥 폼에 같은 이름의 컨트롤이 있다고 해서 Domain의 필드가 저절로 생기지는 않습니다. 먼저 왼쪽은 비교 대상 필드, 오른쪽은 비교할 값으로 구분하세요.
바깥 큰따옴표와 안쪽 값 따옴표를 구분하세요
VBA 식 "[도시]='서울'"의 바깥 큰따옴표는 하나의 문자열을 만듭니다. 실제 Criteria의 내용은 [도시]='서울'이며, 이 안에 남는 작은따옴표가 서울을 텍스트 값으로 표시합니다. 바깥 표시까지 실제 내용에 그대로 남는다고 생각하지 마세요.
반대로 "[상품번호]=7"도 바깥 큰따옴표가 있지만 7은 숫자 값입니다. Criteria가 문자열이라는 사실과 그 문자열 안에서 비교하는 값이 텍스트라는 사실은 다릅니다. 이 두 층을 나누어 보면 숫자 조건의 큰따옴표 때문에 혼동하지 않습니다.
숫자처럼 보이는 회원코드 007은 자료형부터 확인합니다
상품번호가 정수형이고 변수 intId가 7이면 "[상품번호]=" & intId의 연결 결과는 [상품번호]=7입니다. 비교값 주변에 텍스트용 따옴표나 날짜용 #을 넣지 않습니다. 이 글의 숫자 연결 예제는 정수 값으로 제한합니다.
회원코드가 텍스트형이며 값이 007이라면 [회원코드]='007'로 비교합니다. 숫자 7로 바꾸면 앞자리 0을 보존한 코드라는 의미를 잃습니다. 필드 이름에 번호·코드가 들어 있다는 이유로 숫자형이라고 추정하지 말고 문제의 자료형을 확인하세요.
텍스트 변수를 연결하면 작은따옴표가 양쪽에 남아야 합니다
strCity의 값이 서울일 때 "[도시]='" & strCity & "'"는 [도시]='서울'이 됩니다. 첫 문자열에 여는 작은따옴표, 마지막 문자열에 닫는 작은따옴표를 넣습니다. 변수는 그 사이에서 실제 값으로 평가됩니다.
이 글의 strCity·intId·dtOrder는 VBA 변수 예제입니다. 폼 컨트롤 값을 가져올 때는 실행 위치에 맞는 참조로 바꾸어야 합니다. "[도시]='strCity'"처럼 변수 이름까지 따옴표 안에 고정하면 서울이 아니라 strCity라는 글자를 비교하게 됩니다.
&는 문자열 바깥에서 연결하고 AND는 내용 안에 둡니다
"[도시]='" & strCity & "' AND [상품번호]=" & intId에서 strCity=서울, intId=7이라면 최종 결과는 [도시]='서울' AND [상품번호]=7입니다. &는 세 조각을 연결하는 연산자이고 AND는 데이터베이스가 읽을 조건 문구입니다.
따라서 "& strCity &"를 큰따옴표 안에 넣으면 변수 계산이 아니라 그 글자 자체가 남습니다. 또 AND 앞뒤의 공백을 빠뜨려 값과 다음 필드가 붙지 않았는지도 봅니다. 먼저 실제 결과 문자열을 써 보면 어느 기호가 남아야 하는지 분명해집니다.
날짜 #은 완성된 리터럴의 양쪽을 감쌉니다
고정 날짜 예제는 "[주문일]=#10/14/2026#"입니다. 바깥 큰따옴표가 문자열을 만들고 그 안의 두 #이 날짜 리터럴을 구분합니다. 이 예제의 날짜는 2026년 10월 14일이며 시험 일정 정보가 아닙니다.
날짜 변수 dtOrder를 그대로 글자로 연결하면 지역 설정에 따라 월·일 순서가 달라질 수 있습니다. Microsoft는 VBA에서 SQL 문자열에 날짜를 연결할 때 미국식 날짜 표현을 사용하도록 안내합니다. #이 있다는 것만 확인하고 날짜 내용의 순서를 놓치지 마세요.
Month·Day·Year로 날짜 내용을 분명히 만들 수 있습니다
"[주문일]=#" & Month(dtOrder) & "/" & Day(dtOrder) & "/" & Year(dtOrder) & "#"는 날짜 부분을 월/일/년 순서로 구성하는 VBA 예제입니다. dtOrder가 유효한 날짜 값이고 2026년 10월 14일이라면 결과는 [주문일]=#10/14/2026#입니다.
이 예제는 날짜 부분만 비교할 때의 문자열 작성 연습입니다. Null이나 유효하지 않은 값, 시간까지 저장된 필드를 하루 전체로 검색하는 문제는 추가 처리가 필요합니다. 날짜 비교 기호가 =인지 >=·<인지도 지시문에 맞게 따로 확인하세요.
O'Brien은 따옴표 개수만 맞춰도 오류가 날 수 있습니다
strName이 O'Brien이면 "[성]='" & strName & "'"의 결과는 [성]='O'Brien'입니다. 값 안의 작은따옴표가 경계 기호와 충돌하므로 단순한 작은따옴표 감싸기를 그대로 쓰면 문제가 생깁니다.
Microsoft가 안내하는 다른 구성법 중 하나는 Chr$(34)로 큰따옴표를 연결하는 것입니다. "[성]=" & Chr$(34) & strName & Chr$(34)는 [성]="O'Brien"을 만듭니다. 이 예제는 값 안에 큰따옴표가 없다는 전제입니다. 임의 입력에 모든 인용부호가 섞인 경우까지 안전하다는 뜻은 아니며 실제 입력 처리에서는 별도 검증·매개변수 쿼리 등을 검토해야 합니다.
대괄호는 필드명, 따옴표와 #은 비교값입니다
완성 조건 [도시]='서울'에서 [도시]는 Domain의 필드이고 '서울'은 텍스트 값입니다. [주문일]=#10/14/2026#에서는 [주문일]이 필드, # 사이 내용이 날짜입니다. 기호의 종류를 왼쪽과 오른쪽으로 나누어 표시하세요.
공백이나 특수문자가 들어 있는 필드명은 대괄호로 구분합니다. 다만 대괄호로 감쌌다고 없는 필드명이나 다른 테이블의 필드가 해결되지는 않습니다. 필드명이 틀린 것인지 값 구분자가 틀린 것인지를 별도 오류로 분류하세요.
복합 조건과 Null 조건은 기호 외에 뜻도 봅니다
([도시]='서울' OR [도시]='부산') AND [상태]='완료'는 두 도시 중 하나에 속하면서 완료인 레코드를 찾는 조건입니다. AND는 둘 다, OR는 둘 중 하나라는 요구를 나타냅니다. 여러 조건을 섞을 때는 의도한 묶음을 괄호로 보여 주세요.
[탈퇴일] Is Null은 날짜가 입력되지 않은 레코드를 찾습니다. [탈퇴일]=Null이나 [탈퇴일]='Null'로 바꾸지 마세요. 빈 문자열과 Null도 서로 다릅니다. Null 대체값과 DCount 반환값 전체는 기존 Null 처리·함수 선택 가이드의 범위입니다.
오류를 찾는 네 단계: 자료형·값·최종 문장·Domain
1단계는 필드와 비교값의 자료형을 확인하는 것입니다. 2단계는 변수·컨트롤에 들어 있는 실제 값을 확인합니다. 3단계는 연결 결과를 한 줄로 적어 따옴표·#·공백·AND/OR를 점검합니다. 4단계는 사용한 필드가 Domain 안에 있는지 확인합니다.
함수 Criteria와 쿼리 디자인의 조건 행도 구분하세요. 조건 행은 이미 선택한 필드에 대한 값·연산자를 입력하지만, 도메인 함수의 Criteria는 비교할 필드명까지 포함한 문자열입니다. 입력 위치를 보지 않고 같은 조각을 그대로 옮기지 마세요.
직접 만든 연습문제 7개
아래는 실제 기출이 아닌 자체 연습입니다. VBA 변수의 값은 문제에 적힌 그대로라고 가정하고, 먼저 연결된 문자열이나 수정한 조건을 쓰세요. 답은 다음 섹션에 따로 두었습니다.
1. strCity=서울일 때 "[도시]='" & strCity & "'"의 최종 문자열은 무엇인가요?
2. 정수 변수 intId=7일 때 "[상품번호]=" & intId의 최종 문자열은 무엇인가요?
3. 회원코드는 텍스트형이고 값은 007입니다. [회원코드]=7과 [회원코드]='007' 중 어느 조건이 자료형과 값을 그대로 반영하나요?
4. 주문일을 2026년 10월 14일과 비교할 날짜 리터럴을 미국식 월/일/년으로 쓰세요. 필드명까지 포함한 완성 조건을 적으세요.
5. strName=O'Brien이며 값 안에 큰따옴표는 없습니다. "[성]=" & Chr$(34) & strName & Chr$(34)의 최종 문자열은 무엇인가요?
6. 서울 또는 부산에 속하면서 상태가 완료인 레코드를 찾는 조건을 도시 묶음에 괄호를 넣어 쓰세요.
7. [탈퇴일]=Null을 날짜가 입력되지 않은 레코드를 찾는 조건으로 수정하세요.
정답·해설: 경계 기호와 내용이 각각 맞는지 보세요
1번은 [도시]='서울'입니다. 텍스트 값 양쪽에 작은따옴표가 남습니다. 2번은 [상품번호]=7입니다. 정수 숫자에는 텍스트용 값 구분자가 필요 없습니다.
3번은 [회원코드]='007'입니다. 숫자처럼 보이는 코드도 텍스트형이라는 전제를 지킵니다. 4번은 [주문일]=#10/14/2026#입니다. 날짜 리터럴의 양쪽 #과 월/일/년 순서를 함께 확인합니다.
5번은 [성]="O'Brien"입니다. 큰따옴표가 값을 감싸고 작은따옴표는 이름의 일부로 남습니다. 인용부호가 어떤 역할인지 확인해야 하며, 이 예제를 모든 임의 입력의 안전 처리로 일반화하지 않습니다.
6번은 ([도시]='서울' OR [도시]='부산') AND [상태]='완료'입니다. 7번은 [탈퇴일] Is Null입니다. 맞힌 문제도 문자열을 변수식으로 되돌려 어디에서 연결해야 하는지 한 번 더 설명해 보세요.
시험 직전 다섯 줄 요약과 참고 자료
1. 문따·날샵·숫그냥은 완성 문자열 속 값 구분자입니다. 2. Criteria를 감싸는 바깥 큰따옴표와 값 안의 따옴표는 서로 다른 층입니다. 3. 변수는 바깥에서 &로 연결하고 텍스트 구분자·날짜 #은 결과 안에 남깁니다.
4. 값 안의 인용부호, 텍스트 코드의 앞자리 0, 날짜 월·일 순서를 확인합니다. 5. AND/OR·Null·Domain 필드는 문장 뜻까지 대조합니다. 틀린 문자열만 다시 만들고 DB 심화 단원에서 관련 개념을 복습하세요.
DLookup·DCount의 Criteria와 인용부호 구성법은 Microsoft Learn, 미국식 날짜 연결은 Microsoft의 날짜 형식 안내, 복합·Null 조건과 입력 위치는 Microsoft Support의 쿼리 기준 예제로 대조했습니다. 예제는 직접 작성했으며 실제 Access 실행·기출·출제 빈도 검증을 주장하지 않습니다.