- 최초 작성일: 2002-09-03
- 최종 수정일: 2026-09-30
- 조회수: 7 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: DAO로 액세스 데이터베이스 읽어오기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Wisdom is not how much you know but how you use what you know. 지혜란 얼마나 많이 알고 있는가가 아니라 알고있는 것을 얼마나 잘 이용하는가이다.
아는 것과 행하는 것은 별개의 문제이지요.
지난 시간에 DAO를 사용한 데이터 통합 예제를 소개해 드렸는데, 예상 외로 많은 분들이 관심을 가지고 계시는 듯 합니다. ^^ 해서 DAO에 대해 살펴보고 가도록 하겠습니다.
DAO로 액세스 데이터베이스 읽어오기
핵심 요약: DAO로 데이터베이스 읽어오기
DAO는 JET 데이터베이스 엔진을 다루는 인터페이스입니다. 엑셀 VBA에서 MDB 파일을 열고 Recordset의 내용을 시트로 가져오며, SQL을 사용하면 필요한 레코드만 골라 읽을 수 있습니다.
- 1단계: VB Editor의 '도구-참조'에서 Microsoft DAO 라이브러리를 참조합니다.
- 2단계: OpenDatabase로 MDB 파일을 열고 OpenRecordset으로 테이블을 읽습니다.
- 3단계: CopyFromRecordset으로 시트에 뿌리고, 필요하면 SQL Select 구문으로 조건을 지정합니다.
Step 1: DAO란 무엇일까요?
어디서 들어본 것도 같고, 아닌것 같기도 한... DAO란 도대체 무엇인가? Exceller의 VBA 강좌를 열심히 따라오신 분이라면 아마도 잊혀질 만하면 한번씩 들어보신 단어라고 생각이 됩니다.
사람은 누구나 한 가지 특기는 가지고 태어난다고들 합니다. 영어에 천부적인 소질이 있는 사람이 있는가 하면, 수학에 남다른 재능을 보이는 사람이 있고, 공부에는 소질이 전혀 없는데 노는 데에는 남다른 능력이 있는 사람도 있습니다.
컴퓨터 프로그램도 마찬가지입니다. 컴퓨터 프로그램도 각자 자신의 주특기가 있습니다. 보고서를 보기 좋게 꾸미는 특기를 가진 것은 워드 같은 프로그램이고 데이터의 분석과 효율적 정리/관리를 위해서는 엑셀이 진가를 발휘합니다. 그런가 하면 그림을 그리거나 편집하고 싶을 때에는 포토샵이나 페인트샵 같은 그래픽 툴을, 프리젠테이션 자료를 만들고자 할 때에는 파워포인트 같은 프로그램을 사용하게 됩니다.
혹 MS JET 데이터베이스 엔진이라는 말을 들어보셨나요? 못들어 보셨던 분들도 지금 이 순간부터는 그런 말씀을 말아 주시기를... 왜냐하면 지금 들어보셨으니까 말입니다. ^^
JET라는 단어는 초음속 제트기, 제트 스키 할 때 그 제트는 아니고... Joint Engine Technology의 약자입니다. 엔진(Joint, 여러가지 오브젝트라고 할 수 있겠지요?)들을 엮어내는(Joint) 기술(Technology)이라고 할 수 있겠습니다. 이 JET Engine의 프로그래밍을 위한 인터페이스가 바로 DAO라는 녀석입니다.
원래 DAO는 데이터베이스 프로그램인 Access가 가지고 있는 기능이라고 생각하시면 됩니다. 즉 데이터 관리에 뛰어난 능력을 가지고 있는 여러 오브젝트들을 모아놓은 것입니다.
여러분의 회사(다른 기관들도 마찬가지!)에서 어떤 일을 하는데 늘상 있는 일이 아니고 가끔가다 한번씩 하는 일이라든가, 회사의 핵심 역량은 아니지만 반드시 필요한 일이 있을 것입니다. 이런 경우에는 아웃소싱(Out-sourcing)을 하지요. DAO가 하는 일이 바로 이런 것입니다.
Step 2: DAO로 데이터베이스 읽어오기
예제 통합 문서와 같은 폴더에 있는 MyDB.mdb 파일의 MyCustomer 테이블을 읽어 새 시트에 표시합니다. 버튼을 누르면 DB의 데이터가 순식간에 시트에 나타납니다.
오류가 발생한다면 다음 두 가지를 확인해 보세요.
- VB Editor의 '도구-참조' 메뉴에서 Microsoft DAO 라이브러리가 참조되어 있는지
- 통합 문서와 같은 폴더에 MyDB.mdb 파일이 있는지
Sub DAOSAmple()
Dim dbsMyDB As database
Dim rstMyRST As Recordset
Dim i As Integer
Set dbsMyDB = OpenDatabase(ThisWorkbook.Path & "\MyDB.mdb")
Set rstMyRST = dbsMyDB.OpenRecordset("MyCustomer")
' 현재 워크북이 있는 경로에 있는 MyDB.mdb 파일을 읽어들이고 MyCustomer 테이블의
' 내용을 레코드셋 변수에 담습니다.
Worksheets.Add after:=Worksheets("Preface")
With [A1]
.Value = "직원 명단"
With .Font
.Bold = True
.ColorIndex = 2
End With
End With
' 워크시트를 한장 삽입하고 타이틀 부분을 설정한 다음…
With ActiveSheet
For i = 0 To rstMyRST.Fields.Count - 1
.Cells(2, i + 1).Value = rstMyRST.Fields(i).Name
Next i
End With
' 테이블의 필드값에 접근하여 시트에 차례로 뿌려줍니다.
With [A3]
.CopyFromRecordset rstMyRST
.AutoFormat Format:=xlRangeAutoFormatList1, Number:=True, Font:= _
True, Alignment:=True, Border:=True, Pattern:=True, Width:=True
End With
MsgBox "MyDB.mdb 테이블의 내용을 모두 읽어 들였습니다", , "www.iExceller.com"
' rstMyRST 레코드셋 변수에 담긴 값들을 A3 셀에서부터 표시하고 서식을 지정합니다.
rstMyRST.Close
dbsMyDB.Close
' 레코드셋 개체와 데이터베이스를 닫습니다.
Set rstMyRST = Nothing
Set dbsMyDB = Nothing
' 메모리로 부터 변수를 제거합니다.
End Sub
Step 3: SQL로 필요한 데이터만 읽어오기
이번에는 SQL(Structured Query Language)을 이용하여 전체 DB 중 필요한 부분만 골라서 읽어들이도록 해 봅니다. 아래의 버튼을 누르면 MyCustomer 테이블 중에서 City가 '서울특별시'에 해당하는 데이터만 골라서 읽어들입니다.
Sub DAOwithSQL()
Dim dbsMyDB As Database
Dim rstMyRST As Recordset
Dim i As Integer
Set dbsMyDB = OpenDatabase(ThisWorkbook.Path & Application.PathSeparator & "MyDB.mdb")
Set rstMyRST = dbsMyDB.OpenRecordset("Select CompanyName,ContactTitle,Address,City from MyCustomer where city='서울특별시'")
' 이 부분을 눈여겨 보세요. 데이터베이스에서 데이터를 읽어 들이는데 그냥 죄다 읽는 것이
' 아니라 Select ~ From ~ Where 라는 구문을 사용하여 선택적으로 가져오는 것입니다.
' 여기서 Select 이하의 구문이 바로 그 유명한(!) SQL 구문입니다.
Worksheets.Add after:=Worksheets("Preface")
With [A1]
.Value = "직원 명단"
With .Font
.Bold = True
.ColorIndex = 2
End With
End With
With ActiveSheet
For i = 0 To rstMyRST.Fields.Count - 1
.Cells(2, i + 1).Value = rstMyRST.Fields(i).Name
Next i
End With
With [A3]
.CopyFromRecordset rstMyRST
.AutoFormat Format:=xlRangeAutoFormatList2, Number:=True, Font:= _
True, Alignment:=True, Border:=True, Pattern:=True, Width:=True
End With
rstMyRST.Close
dbsMyDB.Close
Set rstMyRST = Nothing
Set dbsMyDB = Nothing
End Sub
액세스가 설치되어 있다면 MyDB.mdb의 '쿼리' 개체에서 MyCustomer_Query를 마우스 오른쪽 버튼으로 눌러 '디자인 보기'를 선택하면 아래와 같이 쿼리 디자인을 볼 수 있습니다.
이 상태에서 '보기-SQL 보기' 메뉴를 선택하면 아래와 같이 쿼리의 내용을 볼 수 있습니다.
여기서 소개한 쿼리는 가장 기본적인 형태입니다. 복잡한 쿼리도 일일이 외워서 적을 필요 없이 액세스에서 마우스로 디자인한 다음 SQL 보기로 확인하여 가져다 쓸 수 있습니다. 다시 말해 쿼리 문법을 몰라도 액세스에서 쿼리를 디자인할 줄만 알면 웬만한 쿼리 작업을 수행할 수 있습니다.
억세스나 쿼리에 대한 사항은 언젠가 자세히 살펴볼 기회가 있을 것이므로 오늘은 이쯤에서 마칩니다.
정리 — DAO 핵심 코드
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| DB 열기 | OpenDatabase(경로 & "MyDB.mdb") | MDB 파일 열기 |
| 테이블 읽기 | dbsMyDB.OpenRecordset("MyCustomer") | 테이블을 레코드셋에 담기 |
| 필드명 표시 | rstMyRST.Fields(i).Name | 머리글 작성 |
| 시트로 뿌리기 | .CopyFromRecordset rstMyRST | 레코드를 시트에 복사 |
| 조건 검색 | Select ... From ... Where city='서울특별시' | SQL로 일부만 읽기 |
자주 묻는 질문 (FAQ)
Q1. DAO란 무엇인가요?
JET 데이터베이스 엔진을 프로그래밍하기 위한 인터페이스입니다. 데이터 관리에 뛰어난 액세스의 기능을 다른 프로그램에서 빌려 쓸 수 있게 해 줍니다.
Q2. DAO 코드에서 오류가 발생하면 무엇을 확인해야 하나요?
VB Editor의 도구-참조에서 Microsoft DAO 라이브러리가 참조되어 있는지, 그리고 통합 문서와 같은 폴더에 MDB 파일이 있는지 확인합니다.
Q3. 일부 데이터만 읽어 오려면 어떻게 하나요?
OpenRecordset에 테이블 이름 대신 SQL의 Select 구문을 전달하면 Where 조건에 맞는 레코드만 가져옵니다.
마치며
DAO를 이용하면 엑셀이 데이터베이스와 손쉽게 연동됩니다. 쿼리는 액세스에서 디자인한 뒤 SQL 보기로 가져다 쓰면 편리합니다.