[엑셀 VBA] 자동화 - 엑셀 데이터베이스의 기본 작동 원리 및 구현 방법
질문의 내용 속에 DATABASE에 대한 목마름이 많이 계신듯 하여 기본적인 내용을 포스팅하려 합니다.
이 부분이 DB를 자동화 할 수 있는 매우 중요한(?) 초석입니다.
1. ADODB.Connection 개체
일종의 PipeLine의 역할을 하는 개체로서 Data Transaction의 핵심을 담당 하는 부분입니다.
이녀석한테 어떠한 데이터베이스를 쓰는지, 데이터 파일이 어디에 있는지 기본 정보를 넘겨 주어야 제 역할을 할 수 있습니다.
그 기본 정보를 넘져 주기 위해서 문자열에 그 정보를 담아 두는데, 그 정보를 Connection String이라 합니다.
Connection String에 관련된 정보를 담아 둔 아래 참조 사이트를 보시면 이해가 쉽습니다.
https://www.connectionstrings.com/
xlsx : "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES";" Treating data as text : "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";" xlsb : "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myBinaryExcel2007file.xlsb;Extended Properties="Excel 12.0;HDR=YES";" xlsm : "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsm;Extended Properties="Excel 12.0 Macro;HDR=YES""
파일 형식에 따른 커넥션 스트링들입니다.
"Microsoft.ACE.OLEDB.12.0;" 이 부분이 엑셀을 DATABASE로 쓰겠다고 알려주는 영역입니다.
"c:\myFolder\myExcel2007file.xlsx;" 이 부분이 소스 파일의 경로를 알려 주는 것입니다.
이 정보를 이용하여 ADODB.Connection 개체를 연결하고 Open 메서드를 실행하면 서로 연결이 됩니다.
이 부분의 좋은 점은 파일을 열지 않고 데이터를 주고 받을수 있다는 것입니다. 다음은 개체 연결하여 구성하는 소스 코드 입니다.
Public ConXl As ADODB.Conneciton '전역변수로 커넥션 개체 선언 Function ConnectionOpen(srcPath As String) As Boolean On Error Goto ErrOpenCon Set ConXl = New ADODB.Conneciton With ConXl .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _" "Data Source=" & srcPath & ";" & _ "Extended Properties="Excel 12.0 Xml;HDR=YES";" .Open '개체를 연결하고 파일을 연다 (눈에 보이지는 않음). End With ConnectionOpen= True Exit Function ErrOpenCon: ConnectionOpen= False End Function
2 기본 INSERT, UPDATE와 DELETE는 ADODB.Recordset 개체 없이도 바로 가능합니다.
Sub Update() Dim SQL As String Dim recAff As Long '업데이트가 몇개가 되었는지 받아주는 변수 Dim reQ SQL = "UPDATE 구문..." Call ConnectionOpen(scrPath) reQ = ConXl.Execute(SQL, recAff) '이부분이 Connection개체를 이용하여 업데이트 하는 부분입니다. Call ConnectionClose End Sub
3 기본 SELECT는 ADODB.Recordset 개체를 통해 워크시트에 뿌려 주어야 합니다.
Sub ImportData() Dim rs As new ADODB.RecordSet '레코드세트 개체 생성 Dim fIndex As Long '필드열의 갯수를 받아줄 변수 Dim SQL As String SQL= "SELECT * FROM [시트이름$]" Call ConnectionOpen(srcPath) rs.Open SQL, ConXl, adOpenDynamic, adLockPessimistic, adCmdTable '이 부분이 데이터를 가져오라 하는 부분입니다. Sheet1.Cells.Clear '필드명 삽입하기 For fIndex = 0 To rs.Fields.Count-1 Sheet1.Cells(1, fIndex+1).Value = rs.Fields Next fIndex Sheet1.Cells(2,1).CopyFromRecordset rs '여기가 시트에 붙여 넣는 부분입니다. Range.CopyFromRecordset rs.Close Call ConnectionClose End Sub
4. 당연히 사용이 끝났으면 Connection개체를 닫아 주어야 열린 DB도 같이 닫히게 됩니다. 안 그러면 나중에 에러가 생길 수도 있습니다.
Function ConnectionClose() As Boolean On Error Goto ErrCloseCon If CBool(ConXl.State and adStateOpen) = True Then CoonXl.Close ConnectionClose= True Exit Function ErrCloseCon: ConnectionClose= False End Function
5. INSERT 구분은 Recordset 개체의 AddNew 메서들 이용하는 방법도 있고, SQL로 하는 방법도 있습니다. 다음은 AddNew 메서드를 사용하는 예제 코드입니다. 물론 "Connection.Execute SQL" 로 해도 됩니다. Recordset 개체는 확실히 공부해두는 것이 좋습니다. 배열과 Dictionary를 통해 수 많은 데이터를 한번에 INSERT하는 기능이 있습니다.
Sub AddNew() Dim rs As new ADODB.RecordSet Call ConnectionOpen(srcPath) rs.Open "[시트이름$]", conXl, adOpenDynamic, adLockPessimistic, adCmdTable rs.AddNew rs!필드명1 = "값1" '= rs.Fields("필드명1") = "값1" 이렇게 써도 됩니다. rs!필드명2 = "값2" rs!필드명3 = "값3" rs.Update Call ConnectionClose End Sub
뭐 그렇게 대단한 코드는 아니지만 제가 처음 공부할 때는 이런 코드들에 많이 목말라 했었습니다. 사실 Connection개체가 무엇인지도 모르고 따라하다 보니 이해가 잘 안되서, 안되겠다 싶더군요. 그래서 공부하고 정리하다 보니 여기까지 왔네요. 외국 유튜버 강좌에는 널려 있는데 한국 유튜버들은 잘 안합니다. 아마 클릭 횟수가 떨어져서 그럴 듯 ...
사족1) Connection, Command, Properties, Recordset, Fields, Field, ListObjects, ListObject, QueryTable, WorksheetConnection 등 상당히 많은 개체들이 연결되어 있어 전체적인 맥락으로 보아야 좀 이해가 됩니다.
사족2) Connection개체의 ConnectionString으로 "OLEDB;Provider=Microsoft.Mashup.oledDb.1;" 이 부분이 PowerQuery와 연결되는 부분입니다. 위의 참조 싸이트에도 안 나옵니다. 매크로 기록을 해보면 등장합니다. 아직도 공부중이라 이 부분은 나중에.
이 부분들을 Class에 때려 담고 한방에 처리하는 것이 편합니다.
번호 | 제목 | 작성자 | 작성일 | 추천 | 조회 |
[📚진짜쓰는 실무엑셀] IT/오피스 '1위' 베스트셀러! 엑셀 공부, 이 교재로 마스터하세요! (315)
![]() ![]() |
![]() ![]() |
2022.02.03 | 575 | 609847 | |
78094 |
[M365] 수식으로 고급필터 구현하기
![]() ![]() |
![]() |
2025.04.11 | 1 | 138 |
78009 |
LOOKUP을 XLOOKUP 처럼 사용 (2019 이하 필독)
![]() ![]() |
![]() |
2025.04.06 | - | 133 |
78002 |
[VBA] 괄호가 대응되게 문자열 잘라주는 함수
![]() |
![]() |
2025.04.05 | - | 74 |
77792 |
엑셀 그림 삽입이 안될 때.. (그림 삽입 비활성화 해결)
(1)
![]() ![]() |
![]() ![]() |
2025.03.24 | 2 | 455 |
77667 |
언피벗 툴 업그레이드 버전입니다.
![]() ![]() |
![]() |
2025.03.17 | - | 121 |
77635 |
머리글로 데이터 합치기 툴
![]() ![]() |
![]() |
2025.03.15 | 1 | 132 |
77598 |
MERGE(자석처럼 자료 붙이기) 툴입니다.
![]() ![]() |
![]() |
2025.03.13 | - | 173 |
77577 |
[VBA] 시트명들 가져오는 함수
![]() ![]() |
![]() |
2025.03.12 | 1 | 136 |
77544 |
LOOKUP 함수 사용법(2019 이하 필독)
![]() ![]() |
![]() |
2025.03.11 | - | 211 |
77543 |
[함수TIP] Date함수로 Eomonth함수 대체하기
(3)
![]() |
![]() |
2025.03.11 | 3 | 90 |
77481 |
쉽게 쓸 수 있는 언피벗 툴
![]() ![]() |
![]() |
2025.03.08 | 2 | 137 |
77468 |
월간단위 월주차 함수
![]() ![]() ![]() |
![]() ![]() |
2025.03.07 | - | 160 |
77385 |
TEXTJOIN 을 SUMPRODUCT 공식으로 2차원 데이터 다루기
![]() ![]() |
![]() |
2025.03.04 | - | 110 |
77355 |
TEXTJOIN 으로 2차원 데이터 다루기
![]() ![]() |
![]() |
2025.03.02 | 1 | 115 |
77353 |
& 기호로 SUMPRODUCT 2차원 데이터 다루기
![]() ![]() |
![]() |
2025.03.02 | - | 90 |
77351 |
단어 포함 여부 검색, 원하는 단어로 출력
![]() ![]() |
![]() |
2025.03.02 | 1 | 122 |
77238 |
휴일이면 1 아니면 0이 나오는 함수
![]() ![]() |
![]() |
2025.02.24 | - | 161 |
77072 |
SUMPRODUCT로 VLOOKUP 대체 (2차원 룩업 가능)
![]() ![]() |
![]() |
2025.02.16 | - | 278 |
76915 |
SUMPRODUCT로 2차원 데이터 다루기[응용]
![]() ![]() |
![]() |
2025.02.09 | 1 | 243 |
76913 |
SUMPRODUCT로 2차원 데이터 sumifs 처럼 다루기
![]() ![]() |
![]() |
2025.02.09 | - | 204 |
@dra**** 님 sybase에서 배워온것이죠
@dra**** 님 ADODB!!! 참 유용한 라이브러리이지만.. 막상 현업에 적용하려면 제한이 많이 생기죠 ㅜ
그래도 엑셀 db를 지속적으로 받아올 수 있는 써드파티앱 있다면 정말 무궁무진하게 활용할 수 있는 것 같습니다 ㅎㅎ
사실 한 페이지에 다 담기 어려운 내용이지만.. 중요 팁이 여러개 있는 듯 합니다 ㅎㅎ 정말 좋은 내용!! 추천박고갑니다
@더블유에이 님 요사이 파워쿼리 자동화 관련 공부를 하다 보니, 엑셀을 DB처럼 쓰면 매우 편하다는 생각을 갖게 되었습니다.
서버에서 조회해서 원하는 결과를 도출해 내는데는 SQL 만큼 빠른 것도 없으니.
마소가 파워쿼리에 공을 들인 이유를 어렴풋이나마 이해하고 있는 중입니다.
@dra**** 님 헐... 대박. 빨리 시간내서 열심히 공부해야겠네요. 감사합니다.
@dra**** 님 감사합니다!!!
@dra**** 님 와... 아직 이해를 못하겠네요
@dra**** 님 좋은 정보 감사합니다😄
@dra**** 님 저한테는 좀 이해하기 어려운 내용이네요. ㅎㅎ;;
@dra**** 님 감사합니다!!
@dra**** 님 정보 감사합니다
@dra**** 님 아직 초짜라 집어넣는데 머리가 아프지만 고수가 될 그날을 고대합니다
@dra**** 님 머리 아파오지만 견디어 내야겠죠?
@dra**** 님 대단하십니다
@dra**** 님 감사합니다
@dra**** 님 감사합니다!!
@dra**** 님 대단하십니다.
@dra**** 님 감사합니다
@dra**** 님 좋은자료 감사합니다..!
@dra**** 님 감사합니다.
@dra**** 님 좋은글 인것 같지만 저한테는 너무나 어려운 내용이네요ㅠㅠ
@dra**** 님 좋은 정보 감사드립니다.
@dra**** 님 감사합니다.
@dra**** 님 너무 감사합니다!!!
@dra**** 님 감사합니다.
@dra**** 님 좋은 정보 감사합니다.
@dra**** 님 감사합니다ㅠㅠㅠ
@dra**** 님 감사합니다.
@dra**** 님 좋은 자료 감사합니다.
@dra**** 님 @dra**** 님 헐... 대박. 빨리 시간내서 열심히 공부해야겠네요. 감사합니다.
@dra**** 님 감사합니다