책 내용 질문하기
[컴활 1급 실기 Access] 상시 4회 vs 최종모의고사 4회 참조 경로 및 VBA 조건절 표현 질문
도서
2026 시나공 컴퓨터활용능력 1급 실기 총정리
페이지
400,497
조회수
95
작성일
2026-09-10
작성자
심*현
첨부파일

[질문 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보관일수]"

답변
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

로 만듭니다.

따라서 시험에서는 조건 문자열 안에 현재 폼의 값을 넣을 때는 "...=" & 컨트롤값 방식으로 작성한다고 익혀 두시면 가장 덜 헷갈립니다.

즐거운 하루 되세요.

  • 관리자
    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

    로 만듭니다.

    따라서 시험에서는 조건 문자열 안에 현재 폼의 값을 넣을 때는 "...=" & 컨트롤값 방식으로 작성한다고 익혀 두시면 가장 덜 헷갈립니다.

    즐거운 하루 되세요.

· 5MB 이하의 zip, 문서, 이미지 파일만 가능합니다.
· 폭언, 욕설, 비방 등은 관리자에 의해 경고없이 삭제됩니다.