20차시
Access 매크로와 이벤트 프로시저(VBA)
Part 3. 데이터베이스 일반 · 출제 빈도 ★★☆
이 차시를 공부하는 이유
마지막 차시입니다. Access 매크로는 함수 이름만 보고 기능을 떠올리는 문제가 대부분이라, 이름을 영어 뜻 그대로 풀어 읽으면(Open+Form = 폼 열기) 쉽게 외워집니다.
2급에서 먼저 보면 좋은 내용
1급 전용 과목이지만, 2급·1급 엑셀 매크로를 배웠다면 Access 매크로 함수와 VBA가 훨씬 익숙합니다.
학습 목표
Access 매크로의 특징과 자동 실행 매크로(AutoExec)를 설명할 수 있다.
폼·보고서·실행 관련 매크로 함수의 기능을 구분할 수 있다.
주요 이벤트의 발생 시점을 이해한다.
DoCmd, Form(Forms), Recordset 개체의 주요 메서드와 속성을 설명할 수 있다.
핵심 개념
1. Access 매크로의 특징
- Access 매크로는 테이블·쿼리·폼·보고서 등을 미리 정의된 매크로 함수로 자동화합니다(엑셀처럼 동작을 녹화하는 방식이 아님). 주로 컨트롤의 이벤트에 연결해 사용합니다.
- 하나의 매크로 그룹에 여러 매크로를, 하나의 매크로에 여러 함수를 넣을 수 있으며, 함수는 위에서 아래 순서로 실행됩니다.
- 조건에 맞을 때만 실행되는 조건 매크로(If 블록)를 작성할 수 있습니다.
- 이름이 AutoExec인 매크로는 데이터베이스를 열 때 자동 실행됩니다. 자동 실행을 막으려면 Shift를 누른 채 파일을 엽니다.
- 독립 매크로는 탐색 창의 '매크로'에 표시되지만, 폼·보고서에 포함된 매크로는 탐색 창에 표시되지 않습니다.
2. 주요 매크로 함수
| 매크로 함수 | 기능 |
|---|---|
| OpenForm / OpenReport / OpenQuery / OpenTable | 폼 / 보고서 / 쿼리 / 테이블 열기 (보기 형식 지정) |
| CloseWindow | 지정한 창(개체) 닫기 |
| GoToRecord | 특정 레코드로 이동 (First, Last, Previous, Next, New 등) |
| GoToControl / GoToPage | 특정 컨트롤로 포커스 이동 / 폼의 지정 페이지로 이동 |
| FindRecord / FindNextRecord | 조건에 맞는 첫 레코드 찾기 / 다음 레코드 찾기 |
| ApplyFilter | 테이블·쿼리의 레코드를 필터링 |
| Requery | 개체의 컨트롤 원본을 다시 조회해 갱신 |
| MessageBox | 메시지 상자 표시 |
| RunSQL / RunMacro / RunCode | SQL문 실행 / 매크로 실행 / 프로시저(함수) 실행 |
| RunMenuCommand / RunApplication | Access 명령 실행 / 메모장·엑셀 등 다른 프로그램 실행 |
| QuitAccess | Access 종료 |
| CancelEvent | 이벤트 취소 (인수 없음) |
| ExportWithFormatting / CopyObject | 개체를 Excel·RTF·텍스트·PDF 등으로 내보내기 / 개체 복사 |
| SetValue / SetTempVar | 컨트롤·속성 값 설정 / 임시 변수 설정 |
3. 이벤트와 이벤트 프로시저
이벤트는 클릭, 키 입력, 레코드 이동처럼 개체가 인식하는 동작이고, 이벤트 프로시저는 그 이벤트가 일어날 때 자동으로 실행되는 VBA 코드입니다.
| 이벤트 | 발생 시점 |
|---|---|
| BeforeUpdate | 컨트롤·레코드의 변경된 데이터가 저장되기 전 (유효성 검사·취소에 활용) |
| AfterUpdate | 데이터가 저장된 후 |
| BeforeInsert / AfterInsert | 새 레코드에 첫 글자를 입력할 때 / 새 레코드가 추가된 후 |
| Current (On Current) | 포커스가 다른 레코드로 이동해 현재 레코드가 바뀔 때, 폼을 열거나 새로 고칠 때 |
| Change | 텍스트 상자·콤보 상자 내용이 바뀔 때마다 |
| Click / DblClick | 마우스 클릭 / 더블클릭 |
| GotFocus / LostFocus | 포커스를 받을 때 / 잃을 때 |
| Open → Load → Resize → Activate → Current | 폼을 열 때 이벤트가 발생하는 순서 (닫을 때: Unload → Deactivate → Close) |
| Activate / Deactivate | 폼·보고서가 활성화될 때 / 다른 창으로 바뀔 때 |
| NoData | 보고서에 표시할 데이터가 없을 때 (보고서) |
시험 함정 포인트
Before~는 '하기 전'(취소 가능), After~는 '한 후'입니다. BeforeInsert는 레코드가 만들어지기 전 첫 글자를 입력할 때 발생한다는 점도 자주 묻습니다.
Before~는 '하기 전'(취소 가능), After~는 '한 후'입니다. BeforeInsert는 레코드가 만들어지기 전 첫 글자를 입력할 때 발생한다는 점도 자주 묻습니다.
4. DoCmd 개체와 Forms 컬렉션
VBA 예시
Private Sub cmd보고서_Click()
DoCmd.OpenReport "매출보고서", acViewPreview, , "거래처코드='" & Me.txt코드 & "'"
End Sub
Private Sub cmd닫기_Click()
DoCmd.Close ' 현재 폼 닫기
End Sub
Forms!고객관리!txt이름 = "홍길동" ' 열려 있는 <고객관리> 폼의 컨트롤 값 설정
Me.Requery ' Me = 코드가 들어 있는 현재 폼
- DoCmd: VBA에서 매크로 함수를 실행하는 개체.
DoCmd.OpenForm,OpenReport,OpenQuery,Close,GoToRecord,RunSQL,Quit등 - OpenReport의 보기 형식:
acViewNormal(바로 인쇄, 기본값),acViewPreview(인쇄 미리 보기),acViewDesign(디자인 보기) - Forms 컬렉션: 현재 열려 있는 폼들의 모음.
Forms!폼이름!컨트롤이름또는Forms("폼이름")으로 참조합니다. 폼의RecordSource,Filter,FilterOn,OrderBy속성으로 원본·필터·정렬을 바꿀 수 있습니다.
5. Recordset 개체
테이블이나 쿼리의 레코드 집합을 VBA로 다루는 개체입니다. 레코드 포인터를 옮겨 가며 읽고, 추가·수정·삭제합니다.
| 구분 | 이름 | 기능 |
|---|---|---|
| 속성 | BOF / EOF | 현재 위치가 첫 레코드 앞이면 BOF=True / 마지막 레코드 뒤이면 EOF=True |
| 속성 | RecordCount / Fields | 레코드 개수 / 필드 모음 |
| 메서드 | MoveFirst / MoveLast / MoveNext / MovePrevious | 처음 / 마지막 / 다음 / 이전 레코드로 이동 |
| 메서드 | AddNew → Update | 새 레코드 추가 → 변경 내용 저장 |
| 메서드 | Edit → Update / Delete | 현재 레코드 수정 → 저장 / 현재 레코드 삭제 |
| 메서드 | FindFirst / FindNext / Seek | 조건에 맞는 레코드 찾기 |
| 메서드 | Requery / Close | 다시 조회 / 레코드셋 닫기 |
레코드를 끝까지 읽는 반복 패턴
Do Until rs.EOF ' 마지막 레코드 뒤에 도달할 때까지
합계 = 합계 + rs!금액
rs.MoveNext
Loop
시험 함정 포인트
AddNew나 Edit 후 Update를 실행하지 않으면 변경 내용이 저장되지 않습니다.
AddNew나 Edit 후 Update를 실행하지 않으면 변경 내용이 저장되지 않습니다.
확인 문제
1 / 5
문제 1
데이터베이스 파일을 열 때 자동으로 실행되는 매크로의 이름과, 자동 실행을 막는 방법을 바르게 짝지은 것은?
💡 정답 ② 해설: AutoExec 매크로는 데이터베이스를 열 때 자동 실행되며, Shift를 누른 채 파일을 열면 실행되지 않습니다.
문제 2
다음 중 Access를 종료하는 매크로 함수는?
💡 정답 ② 해설: QuitAccess는 Access를 종료합니다. CloseWindow는 개체 창을 닫고, CancelEvent는 이벤트를 취소하며, RunApplication은 다른 프로그램을 실행합니다.
문제 3
컨트롤이나 레코드의 변경된 데이터가 저장되기 전에 발생하여 입력 값을 검사하고 저장을 취소하는 데 주로 사용하는 이벤트는?
💡 정답 ② 해설: BeforeUpdate는 데이터가 업데이트되기 전에 발생하므로 값 검사 후 Cancel로 저장을 막을 수 있습니다.
문제 4
Recordset 개체에서 현재 레코드 포인터가 마지막 레코드 뒤에 있음을 나타내는 속성은?
💡 정답 ② 해설: EOF(End Of File)는 마지막 레코드 뒤, BOF(Beginning Of File)는 첫 레코드 앞에 있을 때 True입니다.
문제 5
VBA에서 <매출보고서>를 인쇄 미리 보기 형태로 여는 명령으로 옳은 것은?
💡 정답 ① 해설: 보고서는 DoCmd.OpenReport로 열며, acViewPreview는 인쇄 미리 보기, acViewNormal은 바로 인쇄입니다.
20차시 문제 더 풀기
확인문제와 실전 모의고사에서 이 차시 범위 문제만 모아 해설과 함께 볼 수 있습니다.