우리나라에서는 액세스가 그리 인기가 없나부다 ㅠㅠ 액세스 VBA 관련해서 필요한 내용 찾기가 너무 힘들다.
일단 나는 엑셀에서 현재 내가 작업중인 워크시트들 중에서 특정 워크시트를 SQL Query를 이용해서 테이블로 불러왔던 기억이 있어서 액세스에서도 비슷한 방식의 조작을 하고 싶었다.
[엑셀에서는]
아래처럼 conn 이라는 컨넥션 변수를 만들어서 접속했다(ODBC, OLEDB 등등 방법이 몇 개 있다는데, OLEDB를 사용하는거였네 ㅎㅎ)
' Essential variables to use database function
' 데이터베이스 조작을 위한 변수들
Dim RecSet As New ADODB.Recordset
Dim SQL As String
Dim Conn As String
Dim aData As Variant
' 읽어온 데이터 조작을 위한 변수들
Dim aCnt As Long
Dim nRow As Long
Dim nItem As Long
' 쿼리 생성: 중복된 아이템 이름은 제거(using DISTINCT) 후 가져온다
SQL = "SELECT DISTINCT [" & stField & "] FROM [" & stWSHT & "$]"
SQL = SQL + " WHERE [" & stField & "] IS NOT NULL"
'Excel을 Database로 사용 HDR=YES; 는 첫 행이 컬럼제목이 되게 할 것인지 여부 결정
Conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " & ThisWorkbook.Path & _
"\" & ActiveWorkbook.Name & ";" & "Extended Properties=Excel 12.0;"
RecSet.Open SQL, Conn, adOpenForwardOnly, adLockReadOnly, adCmdText
If RecSet.EOF Then
액세스에도 똑같이 사용하면 되는데, 나의 고민은 바로 엑셀의 ThisWorkbook.Path 와 ActiveWorkbook.Name 이었다.
이 두가지 오브젝트 메서드?와 동일한 혹은 비슷하게라도 동작을 해 주는 녀석들을 Access에서 찾지 못하면, 액세스 작업할 때마다, 현재 내가 작업중인 파일의 경로를 VBA에 바꾸어 넣어주어야 한다.
맨땅에 헤딩하듯 찾으니 3일 씩이나 걸렸다... 엑셀보다 참조 소스나 한글 설명이 많지도 않고, 영문 예제나 설명들도 대체로 DAO (*밑에서 다시 설명)나 아니면 새 액세스 파일을 만들어서 거기에 표시하거나 하는 방식이었다.
이 DAO는
- 현재 열린 액세스 파일 내에서 [테이블], [쿼리], [폼] 의 데이터를 참조할 수 있다.
- 테이블 값을 그대로 참조하므로 필터링이 안되어있다.
- 필터링된 데이터를 참조하고 싶으면, 먼저 쿼리를 생성한 후, 그 쿼리를 데이터 소스로 해서 읽어야 한다.
즉, 액세스 파일에 만들어져 있는 테이블, 쿼리, 폼의 데이터만 참조할수 있다.
그래도 이래저래 뒤진 결과, 아래와 같이 비슷한 결과를 낼 수 있게 되었다. 다른 건 다 똑같고 Connection String만 아래처럼 바꾸면 된다
conn.Provider = "Microsoft.ACE.OLEDB.12.0"
conn.Open "Data Source =" & Application.CurrentProject.FullName
그냥 한줄로 가능한 것을 두줄로 풀어썼을 뿐, 엑셀에서의 방법과 똑같다.
다만,
1) Application.CurrentProject.FullName => 작업중인 파일의 [경로] + [파일명.확장자] 정보가 들어가있다.
2) Application.CurrentProject.Path => 작업중인 파일의 [경로] 정보가 들어가 있다.
1)번으로 한번에 해결하면 되니 굳이 2)번은 쓸 필요가 없을듯 하다.