1. 코드에 한글 주석 추가 및 설명 📝
더보기
vba
Option Explicit ' 변수 선언을 강제하여 코드의 안정성을 높임
Sub Haja_Guid_ADODB()
' ADODB 참조를 위한 GUID를 문자열로 선언
Dim StrGuid$: StrGuid = "{B691E011-1797-432E-907A-4D8C69339129}"
' 오류 발생 시 무시하고 다음 코드로 넘어감 (참조 추가 시 에러 방지)
On Error Resume Next
' 가장 최신 버전의 ADODB를 참조에 추가함
ThisWorkbook.VBProject.References.AddFromGuid StrGuid, 0, 0
On Error GoTo 0 ' 이후 코드에서 정상적인 오류 처리 복구
' 기초방95 서브 프로시저 호출 (데이터 조회 및 출력)
Call 기초방95
End Sub
Sub 기초방95()
' ADODB 레코드셋 객체 생성 (데이터 조회용)
Dim Rs As New ADODB.Recordset
' 파일 경로, SQL 쿼리, 연결 문자열 선언
Dim strPath$, strSQL$, strConn$
' 데이터 범위와 반복문에 사용할 변수들 선언
Dim rngAll As Range, rngA As Range, rngX As Range
Dim i& ' 정수형 변수
' 현재 열려 있는 엑셀 파일의 전체 경로를 strPath에 저장
strPath = ThisWorkbook.FullName
' 성명 목록이 있는 E4:E11 범위를 rngAll에 저장
Set rngAll = [e4:e11]
' 출력 시작 셀을 X3으로 설정 (데이터가 여기에 기록됨)
Set rngX = [X3]
' 엑셀 파일을 데이터베이스로 사용할 수 있도록 ADODB 연결 문자열 생성
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strPath & ";" & _
"Extended Properties=Excel 12.0;"
' SQL 쿼리 작성: 기초방95 시트의 B3:K23 범위에서 데이터를 열 순서대로 조회
strSQL = " SELECT 열10,열9,열8,열7,열6,열5,열4,열3,열2,열1" & _
" FROM [기초방95$B3:K23] "
' SQL 쿼리를 실행하고 결과를 Recordset 객체에 저장
Rs.Open strSQL, strConn
' 열 제목을 X3 셀에 출력
rngX.Resize(1, 10) = Array("열10", "열9", "열8", "열7", "열6", "열5", "열4", "열3", "열2", "열1")
' 만약 Recordset에 데이터가 있을 경우
If Not Rs.EOF Then
' 출력 위치를 한 행 아래로 이동
Set rngX = rngX.Offset(1)
' Recordset의 데이터를 복사하여 엑셀에 출력
rngX.CopyFromRecordset Rs
End If
' 작업이 끝난 후 Recordset을 닫음
Rs.Close
' 사용한 객체 메모리 해제
Set Rs = Nothing
End Sub
2. 코드의 구간별 동작 설명 📋
Haja_Guid_ADODB 프로시저
- ADODB GUID 참조 추가:
- ThisWorkbook.VBProject.References.AddFromGuid를 사용해 ADODB 라이브러리 참조를 추가한다. GUID는 ADODB 라이브러리의 고유 식별자다.
- On Error Resume Next로 참조 추가 실패 시에도 오류를 무시하도록 처리했다.
- 기초방95 프로시저 호출:
- 데이터베이스 접근 및 엑셀 시트에 데이터 조회 결과를 출력하는 서브 프로시저 기초방95를 호출한다.
기초방95 프로시저
- ADODB Recordset 객체 생성:
- SQL 쿼리를 통해 조회한 데이터를 저장하는 용도로 ADODB.Recordset 객체를 사용한다.
- 경로 및 데이터 범위 설정:
- ThisWorkbook.FullName을 사용해 현재 엑셀 파일의 경로를 가져온다.
- 성명이 있는 범위(E4:E11)와 데이터 출력 위치(X3)를 각각 설정한다.
- ADODB 연결 문자열 생성:
- 엑셀 파일을 데이터베이스로 사용할 수 있도록 ACE OLEDB 공급자를 사용해 연결 문자열을 생성한다.
- SQL 쿼리 실행:
- SQL 쿼리를 사용해 기초방95 시트의 B3범위 데이터를 열 순서대로 조회한다.
- 쿼리 결과를 Recordset에 저장한다.
- 데이터 출력:
- 데이터가 있으면 CopyFromRecordset 메서드를 사용해 조회 결과를 엑셀 시트에 복사한다.
- 열 제목을 X3 셀에 기록한 후, 데이터를 그 아래에 출력한다.
- 메모리 정리:
- 사용한 Recordset 객체를 닫고 메모리를 해제한다.
3. 확장 기능 및 실무 응용 🚀
- 조건부 조회 추가
- 성명 목록을 순회하며 각 성명에 대해 조건부 SQL 쿼리를 실행할 수 있다.
- 성명 목록을 순회하며 각 성명에 대해 조건부 SQL 쿼리를 실행할 수 있다.
- 다중 시트 데이터 조회
- 여러 시트에서 데이터를 조회하고 결과를 통합 출력하도록 수정할 수 있다.
- 동적 범위 처리
- E4:E11 대신 동적으로 범위를 설정하여 변동되는 데이터를 처리할 수 있다.
Set rngAll = Sheet1.Range("E4", Sheet1.Cells(Sheet1.Rows.Count, "E").End(xlUp))
- E4:E11 대신 동적으로 범위를 설정하여 변동되는 데이터를 처리할 수 있다.
5. 오류 해결 및 디버깅 팁 🛠️
- ADODB 참조 오류
- ADODB GUID를 찾지 못하는 경우, VBA 환경설정에서 Microsoft ActiveX Data Objects Library를 수동으로 참조 추가해야 한다.
- SQL 쿼리 오류
- 쿼리 구문이 잘못된 경우 데이터 조회에 실패할 수 있다. 이때 Debug.Print strSQL로 쿼리를 출력해 확인한다.
- OLEDB 드라이버 문제
- ACE OLEDB 드라이버가 설치되지 않은 경우 드라이버를 설치하거나 다른 방법을 고려해야 한다.
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #97 [시트 요약하기] (0) | 2024.10.27 |
---|---|
[기초방] VBA 100제 #96 [데이터를 PIVOT 시키기 feat. ADODB] (0) | 2024.10.26 |
[기초방] VBA 100제 #95 [열을 역순으로 복사] (0) | 2024.10.25 |
[기초방] VBA 100제 #94 [ ADODB 데이터조회 ] (6) | 2024.10.20 |
[기초방] VBA 100제 #93 [ 엑셀 테이블 변환 ] (0) | 2024.10.20 |
댓글