공든탑앱 열기

이벤트 프로시저와 VBA

컴퓨터활용능력 1급 · 매크로와 VBA · 약 13분

쉽게 말하면

매크로로 부족할 때는 VBA 코드로 직접 동작을 짜요. 예를 들어 '조회 버튼을 누르면 고른 제품만 보고서로 미리 보기' 같은 일이에요. 버튼(컨트롤)에서 Click 같은 일이 생기면 그에 맞는 코드 묶음(이벤트 프로시저)이 실행돼요.

시험용 정의

모듈은 VBA 프로시저를 담는 개체이고, 모듈 하나에 여러 프로시저를 둘 수 있다. Sub 프로시저는 작업만 하고 값을 돌려주지 않으며, Function 프로시저는 결과 값을 돌려준다. Private로 선언하면 같은 모듈 안에서만, Public으로 선언하면 모든 모듈에서 부를 수 있고, 모든 곳에서 쓰는 전역 변수도 Public으로 선언한다. 데이터 형식을 생략한 변수는 Variant다. 이벤트 프로시저는 폼·보고서·컨트롤에 Click(클릭), DblClick(두 번 클릭), Load·Open(폼이 열릴 때), Current(레코드 이동), BeforeUpdate·AfterUpdate(값 저장 전·후) 같은 이벤트가 일어나면 실행되며, 이름은 Private Sub cmd조회_Click()처럼 '컨트롤이름_이벤트'다. Access 동작은 DoCmd 개체로 실행한다: DoCmd.OpenForm(폼), DoCmd.OpenReport(보고서, acViewPreview는 미리 보기, acViewNormal은 바로 인쇄, 조건 인수로 일부만), DoCmd.OpenQuery(쿼리), DoCmd.RunSQL(실행 SQL), DoCmd.GoToRecord , , acNewRec(새 레코드), DoCmd.Close(닫기). 지금 폼은 Me, 컨트롤은 !, 속성은 .으로 이어 Me![DateDue].Visible = False(숨기기), Me.Filter·Me.FilterOn(필터), Me.RecordSource(레코드 원본)처럼 바꾼다.

비유로 이해하기

이벤트 프로시저는 초인종 회로다. 초인종(컨트롤)을 누르는 일(Click 이벤트)이 생기면 연결된 동작(코드)이 울린다. DoCmd는 집사에게 내리는 명령이다. '서재 문 열어(OpenForm)', '보고서 출력해(OpenReport)'.

자세히

Sub와 Function, Private와 Public

선언뜻
Sub작업만 하고 값을 돌려주지 않는다
Function작업 후 값을 돌려준다
Private선언된 모듈 안의 프로시저에서만 부를 수 있다
Public모든 모듈의 프로시저에서 부를 수 있다 (전역 변수도 Public)
Dim x (형식 생략)Variant 형식

DoCmd 메서드

메서드하는 일
DoCmd.OpenForm "사원정보"폼 열기
DoCmd.GoToRecord , , acNewRec새 레코드로 이동 (빈 입력 화면)
DoCmd.OpenReport "재고", acViewPreview, , "제품번호='" & cmb조회 & "'"조건에 맞는 것만 미리 보기
DoCmd.OpenReport "재고"보기 생략(acViewNormal) → 바로 인쇄
DoCmd.OpenQuery "월별매출"쿼리 열기
DoCmd.RunSQL "DELETE FROM 임시"실행 SQL 문 실행
DoCmd.Close현재 창 닫기

이벤트 프로시저 읽기

Private Sub cmd숨기기_Click()
    Me![DateDue].Visible = False   ' 지금 폼의 DateDue 컨트롤 숨기기
End Sub

Private Sub cmd새로_Click()
    DoCmd.OpenForm "사원정보"
    DoCmd.GoToRecord , , acNewRec    ' 비어 있는 새 레코드 화면
End Sub

Private Sub cmd계산_Click()
    txt재고 = txt입고 - txt주문     ' 컨트롤 값 계산
End Sub
  • Me! 다음에 컨트롤, 그 뒤 .속성 순서 (Me.[DateDue]!Visible은 틀림)
  • Visible = True는 보이기, False는 숨기기
  • Click은 한 번, DblClick은 두 번 클릭

1급에서 더 나오는 것

항목알아 둘 것
DoCmd 더 보기GoToRecord의 acFirst 첫 레코드, acLast 마지막, acNewRec 새 레코드. OpenTable 테이블 열기, RunMacro 매크로 실행, Requery 원본 다시 읽기, ShowAllRecords 필터 풀기, Close 닫기. RunQuery·OpenSQL 같은 메서드는 없다
반복문For i = 1 To 4: s = s + i * 2: Next i 는 2, 4, 6, 8을 더해 20. 형식을 생략한 변수는 Variant

시험에 이렇게 나와요

확인 문제

Q1. VBA에서 선택 쿼리를 데이터시트 보기·디자인 보기 등으로 여는 명령은?

  1. DoCmd.OpenQuery
  2. DoCmd.RunQuery
  3. DoCmd.RunSQL
  4. DoCmd.OpenSQL
정답 보기

1번 DoCmd.OpenQuery

DoCmd.OpenQuery가 쿼리를 연다. RunSQL은 실행 쿼리용 SQL 문을 실행하고, RunQuery·OpenSQL은 없는 명령이다.

Q2. 단추를 누르면 [회원] 폼을 열고 빈 새 레코드로 가게 하는 코드는?

  1. DoCmd.RunSQL "회원" 다음 DoCmd.GoToRecord , , acFirst
  2. DoCmd.OpenForm "회원" 다음 DoCmd.GoToRecord , , acNewRec
  3. DoCmd.OpenQuery "회원" 다음 DoCmd.GoToRecord , , acLast
  4. DoCmd.OpenReport "회원" 다음 DoCmd.Close
정답 보기

2번 DoCmd.OpenForm "회원" 다음 DoCmd.GoToRecord , , acNewRec

OpenForm으로 폼을 열고 acNewRec로 새 레코드에 간다.

Q3. Private로 선언한 Function 프로시저는 어디에서 부를 수 있나?

  1. 어디서도 부를 수 없다
  2. 다른 모듈에서만
  3. 선언된 모듈 안의 프로시저
  4. 모든 모듈의 프로시저
정답 보기

3번 선언된 모듈 안의 프로시저

Private는 같은 모듈 안에서만, Public은 모든 모듈에서 부를 수 있다.

Q4. 'cmd감추기' 단추를 누르면 '메모' 컨트롤이 안 보이게 하는 코드로 옳은 것은?

  1. Private Sub cmd감추기_Click() / Me![메모].Visible = False
  2. Private Sub cmd감추기_Click() / Me.[메모]!Visible = False
  3. Private Sub cmd감추기_DblClick() / Me![메모].Visible = True
  4. Private Sub cmd감추기_Click() / Me![메모].Visible = True
정답 보기

1번 Private Sub cmd감추기_Click() / Me![메모].Visible = False

Me![컨트롤].속성 순서이고, 숨기려면 Visible을 False로 한다. 한 번 클릭은 Click 이벤트다.

Q5. VBA에 대한 설명으로 옳지 않은 것은?

  1. 형식을 생략한 변수는 Variant다
  2. Public 변수는 모든 모듈에서 쓸 수 있다
  3. Sub 프로시저는 결과 값을 호출한 곳에 돌려준다
  4. 모듈은 여러 프로시저로 이루어질 수 있다
정답 보기

3번 Sub 프로시저는 결과 값을 호출한 곳에 돌려준다

값을 돌려주는 것은 Function이다.

헷갈리기 쉬운 O·X

DoCmd.OpenReport "보고서", acViewPreview를 실행하면 보고서가 바로 프린터로 출력된다.

정답 보기

X acViewPreview는 인쇄 미리 보기다. 보기를 생략하거나 acViewNormal일 때 바로 인쇄된다.

이벤트 프로시저 이름은 '컨트롤이름_이벤트' 꼴이다.

정답 보기

O 예: cmd조회_Click은 cmd조회 단추를 클릭할 때 실행된다.

함께 보면 좋은 개념