엑셀은 Appliction오브젝트를 시작으로 다앙한 기능을 수행하는 오브젝트들로 구성되어 있다 이런 오브젝트들은 VBA라는 프로그래밍도구로 프로그래밍할수 있는 대상이 되어서 사용되기를 기다리고 있다 휠터를 시키고 싶으면 Range오브젝트에게 휠터(Filter)하라고 시키면 된다 정렬하고 싶다면 또한 Range오브젝트에게 정렬(Sort)하라고 시키면 된다 부분합을 시키고 싶으면 Range오브젝트에게 부분합(SubTotal)하라고 시키면 된다 엑셀을 펴넣고 수작업을 하는 모든 동작을 VBA라는 프로그래밍도구로 각각의 기능의 일을 하는 오브젝트를 찾아서 일을 시키면 되는 것이다 그런데 엑셀에게 일을 시키는것은 엑셀을 수작업으로 할수 있는일만 자동화시킬수 있다 그런데 엑셀이 아닌 어떤 데이타베이스에서 정보를 찾아오라는 작업을 시키고 싶다면 엑셀의 기능의 한계를 넘어간다 그 대신에 다른 외부기능을 끌어다 쓸수 있는 능력이 있다 그래서,필요하면 엑셀이 갖고 있는 오브젝트가 아닌.. 외부의 오브젝트를 엑셀로 불러들여서 작업을 하면 되는것이다 이제 외부데이타를 엑셀로 불러 들이는 작업.. 엑셀에서 외부데이타로 정보를 보내는 작업.. 엑셀에서 외부데이타의 어떤 정보를 수정하거나 삭제하는 작업등을 해도보록 하자 데이타/외부데이타가져오기를 수작업으로 실행하여 갖여오는 외부데이타는 Range오브젝트의 QueryTable이라는 오브젝트가 있지만 이것은 읽기만 할뿐이다 그래서,이 부분은 이번 페이지에서 하려고 하는 자동화방법을 알면 별로 매력이 없는지라..나중에 기회나면 다루기로 하고 VBA로 하기 좋은 또 다른 외부데이타접근 방법을 해보도록 하자 물론 수작업으로 하고 싶을때는 위의 메뉴(데이타/외부데이타가져오기)에서 하면 된다 단지 끌어들여온 정보를 읽기만 할뿐이지만.. 아래의 그림과 같이 개체탐색기에서 보면 Range오브젝트의 메소드중에 CopyFromRecordset이라는 것이 있다 이것이 도대체 뭣에 쓰는 물건이냐?? Copy는 복사하겠다는것이고.. From Recordset은 Recordset이라는으로 부터 가져 오는것 같은데.. 도대체 Recordset이라고 하는 것이 무엇인가?? 이런 의문점에서 부터 시작하면 외부데이타의 궁금증이 벗겨지기 시작한다 Recordset이라는 물건이 어디에 있는지를 알아야 갖여 오지.. Recordset!!요것이 바로 외부오브젝트(External Object)인것이다 Recordset이라는 오브젝트를 갖여 오는것도 DAO(Data Access Object)라는 외부라이브러리(오브젝트들의 집단)에서 갖여 오기도 하고 ADO(ActiveX Data Object)라는 외부라이브러리에서 갖여 오기도 한다 아래의 그림과 같이 외부라이브러리를 각각 참조시켜 사용할수 있다 DAO는 엑셀과 같은 식구인 Access의 자체 엔진(라이브러리)이고.. 즉 Access자체가 바로 DAO라는 소리나 마찬가지다 ADO는 어놈 저놈 외부데이타베이스는 모두 다룰수 있는 가장최근의 데이타를 다루는 기술이다 Web상에서나 어느 곳에서나 활용하는 것이 ADO인 것이다 ADO가 좀더 많은 기능을 갖고 있고 DAO보다 훨씬 발전된 전천후 데이타를 다루는 도구라고 할수 있다 쉽게 말해..ADO가 DAO보다 쎈놈이다 ADO는 DAO+RDO(Remote Data Objects)라고 할수 있다 PC상에서 데이타베이스와 통신을 하고 싶다면 거창한 ADO보다는 DAO를 사용하면 좋을것이다 특히 Access와 통신을 하고 싶다면 DAO가 제격이다 앞으로 몇페이지동안 다룰 것이 DAO의 활용이 될것이고 상황에 따라서 ADO도 곁들여서 해보도록 하자 DAO나 ADO나 뭐 대단한 것은 아니다.. (물론 이것을 만든 프로그래머들은 골을 싸메고 만들었지만..) 개념상 엑셀오브젝트나 별반 다른게 없다는 의미에서 별것 아니라는 소리다 하드드라이버에 있는 데이타베이스를 읽어내고 관리하는 복잡한 코드들을 하나의 오브젝트군단으로 엮은 오브젝트라이브러리를 만들어서 사용하고 싶은 사람들은 그냥 이 오브젝트를 불러다가 사용하라는 것이다 엑셀오브젝트를 사용하는 것이나 똑같은것이고 앞전의 몇페이지에서 소개한 크래스모듈은 그런 개념을 감각적으로 익히라고 준비하였던 것들이다.. 아직도 감각이 갖추어지지 않았겠지만.. 어느날 갑자기 오브젝트들에 대한 시각이 팍 바뀔때 프로그래밍은 끝장이 난다 그럼 맛보기로 Range.CopyFromRecordset을 구현하기 위한 코딩을 하나 해보자 우선 외부오브젝트를 사용하려면 외부오브젝트를 사용하겠다고 등록해야 한다..아래의 그림과 같이 도구/참조/참조대화상자../ 그리고 아래의 코드를 실행해보시기 바란다 물론 데이타베이스(여기에서는 억세스쌤플화일인 Northwind.mdb)를 이 코드를 실행시키는 통합문서가 있는 폴더에 넣으시고..
순간 시트가 채워졌을것이다 OpenDatabase라는 메소드의 매개변수에 어느 데이타베이스를 읽어오냐는 정보를 주어야 할것이니 원하는 데이타베이스의 경로명과 화일명을 문자열정보로 주어야 하는것이고.. 그러면 데이타베이스와 DAO와 연결이 이루어지는 것이다 그런후 DAO라이브러리내의 Recordset이라는 오브젝트는 연결된 데이타베이스오브젝트의 OpenRecordset이라는 메소드로 얻어내고 이 메소드에는 어떤 테이블의 것을 갖여 오냐는 정보를 매개변수로 전달하여야 한다 그래서 Set oRst=oDB.OpenRecordset("Products")는 Products라는 이름의 테이블을 갖여와서 Recordset오브젝트를 생성하라는 이야기가 된다 Recordset은 눈에 보이지 않는 RAM 즉 메모리상에 하나의 테이블이 올라온 것이 되는것이다 이것을 엑셀이 갖여다 사용하면 되는것이다 Range("A1").CopyFromRecordset oRst 바로 이 Recordset(oRst변수)이 맨위에서 이야기 하였던 도대체 Recordset이라고 하는것이 어디있는거야???!! 하고 의문하였던..Recordset인것이다 이것을 엑셀의 Range오브젝트의 CopyFromRecordset의 매개변수로 전달하면 상황끝이다!! DAO에 속해 있는 오브젝트들을 앞으로 전개하여 나가 보도록 할것이니..잘 챙기시기 바란다