[엑셀 VBA] 파워쿼리 자동화 2. 자동화 실습
이 전에는 쿼리 동적 생성의 개념에 대해서 간략히 포스팅 해보았습니다. 그 과정을 간단히 살펴보면
- WorkbookQuery 생성 ▶ Formula 속성에 M Script 표현식 대입
- WorkbookConnection 생성 ▶
- ListObject 생성 ▶
- (Option) ListObject.QueryTable 설정
1. WorkbookQuery 생성 : M SCript 언어에 MySQL 설정 및 SQL 대입하기
1.1 기본 문법
let Source = MySQL.Database(server, database, [ReturnSingleDatabase=true, Query="SELECT * FROM tableTest"]), Transformed = Table.TransformColumnTypes(Source,{{"DATE", type date}, {"AMOUNT", Currency.Type}}) in Transformed
1.2 server, database, query를 동적으로 생성하는 변수를 반들어 할당하기
formula:="let Source = MySQL.Database(" & serverName & ", " & dbName & ", [ReturnSingleDatabase=true, Query=" & strSQL & "]), Transforemd = Table.TransformColumnTypes(Source,{{""DATE"", type date}, {""AMOUNT"", Currency.Type}}) in Transformed"
각각의 변수를 주입하면 이제 서버명, DB명, SQL이 상황이 바뀔때마다 동적으로 만들면 알아서 자동 갱신이됩니다.
1.3 실전 코드
ActiveWorkbook.Queries.Add _ NAME:=qryName, _ formula:="let Source = MySQL.Database(" & serverName & ", " & dbName & ", [ReturnSingleDatabase=true, Query=" & strSQL & "]), Transformed = Table.TransformColumnTypes(Source,{{""DATE_CA"", type date}, {""AMOUNT"", Currency.Type}}) in Transformed", _ Description:="Cash Advance Query Table"
여기서 qryName, serverName, dbName 등등은 변수로 할당 받아 넘겨 주는 것입니다.
이렇게 하면 qryName으로 지정한 WorkbookQuery가 생성이 됩니다. 이를 WorkbookConnection에 넘겨 주어야 합니다.
2. WorkbookConnection 생성
Workbooks("YS_MANAGE.xlsm").Connections.Add2 _ NAME:=connName, _ Description:="Connection To '" & qryName & "'.", _ ConnectionString:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location="& qryName & ";Extended Properties=", _ CommandText:="""qryCA""", _ lCmdtype:=6, _ CreateModelConnection:=True, _ ImportRelationships:=False
connName은 ListObject에 넘겨주기 위한 변수입니다. ConnectionString에서 qryName으로 위에 생성한 WorkbookQuery를 전달해 줍니다. CommandText 에 있는 qryCA는 제가 실제 qryName="qryCA"로 할당해 놓은 부분입니다. 일부러 저 부분은 변수가 아닌 할당한 String으로 남겨두었습니다.
3. ListObject 생성
With ActiveSheet.ListObjects.Add(SourceType:=4, Source:=ActiveWorkbook.Connections(connName), Destination:=Range(pastAddress)).QueryTable .RowNumbers = False .PreserveFormatting = True .RefreshStyle = 1 '1 = xlInsertDeleteCells, 2 = xlInsertEntireRows, 0 = xlOverwriteCells .AdjustColumnWidth = True .ListObject.DisplayName = qryName .Refresh End With
ActiveSheet ... Source:=ActiveWorkbook.Connections(connName), Destination:=Range(pastAddress)) ...
여기서 connName으로 WorkbookConnection을 넘겨주고, Destination에 지정함 범위로 표를 출력합니다.
ActiveSheet.... ).QueryTable을 통해 ListObject를 QueryTable 객체로 변환하여 추가 옵션을 지정합니다.
.Refresh를 통해 서버에서 데이터를 가지고와서 시트에 뿌려 줍니다.
아래와 같은 결과가 나오며 이제 조건에 따른 갱신, 수정, 삭제, 추가 하는 부분만 코딩하면 끝입니다.
글로 이 모든 과정을 표현하기가 상당이 어렵습니다.
파워쿼리 자동화를 다루는 유튜버과 관련 참조 자료가 없어서 이거 연구하는데 3개월 정도 걸린 듯 합니다.
이것을 이해하고 난뒤 지금은 모든 코딩이 파워쿼리로 바뀌었습니다. 시트에 자료 입력은 좋은 생각이 아닌 듯 합니다. DB Server로 자료 입력하고 엑셀에서는 조회 가공만 하는 것이 좋다는 것을 깨닫느데 꽤 오랜 시간이 걸린 듯 합니다.
지금은 생성만 수동으로 하고, 생성된 workbookquery만 복제하여 formular만 바꿔서 자동화 하는 쪽으로 진행합니다. 훨씬 빠르고 수월하게 진행이 됩니다. 위의 기초가 있어 가능하게 된 것입니다.
다음 포스팅에서는 ListObject 핸들링과 데이터 조건 조회, 수정, 생성, 삭제에 관한 내용이며, 제가 만든 MySQL 클래스를 공개하겠습니다.
번호 | 제목 | 작성자 | 작성일 | 추천 | 조회 |
[📚진짜쓰는 실무엑셀] IT/오피스 '1위' 베스트셀러! 엑셀 공부, 이 교재로 마스터하세요! (313)
![]() ![]() |
![]() ![]() |
2022.02.03 | 572 | 599177 | |
78094 |
[M365] 수식으로 고급필터 구현하기
![]() ![]() |
![]() |
2025.04.11 | 1 | 64 |
78009 |
LOOKUP을 XLOOKUP 처럼 사용 (2019 이하 필독)
![]() ![]() |
![]() |
2025.04.06 | - | 89 |
78002 |
[VBA] 괄호가 대응되게 문자열 잘라주는 함수
![]() |
![]() |
2025.04.05 | - | 38 |
77792 |
엑셀 그림 삽입이 안될 때.. (그림 삽입 비활성화 해결)
(1)
![]() ![]() |
![]() ![]() |
2025.03.24 | 2 | 331 |
77667 |
언피벗 툴 업그레이드 버전입니다.
![]() ![]() |
![]() |
2025.03.17 | - | 92 |
77635 |
머리글로 데이터 합치기 툴
![]() ![]() |
![]() |
2025.03.15 | 1 | 105 |
77598 |
MERGE(자석처럼 자료 붙이기) 툴입니다.
![]() ![]() |
![]() |
2025.03.13 | - | 142 |
77577 |
[VBA] 시트명들 가져오는 함수
![]() ![]() |
![]() |
2025.03.12 | 1 | 101 |
77544 |
LOOKUP 함수 사용법(2019 이하 필독)
![]() ![]() |
![]() |
2025.03.11 | - | 172 |
77543 |
[함수TIP] Date함수로 Eomonth함수 대체하기
(3)
![]() |
![]() |
2025.03.11 | 3 | 62 |
77481 |
쉽게 쓸 수 있는 언피벗 툴
![]() ![]() |
![]() |
2025.03.08 | 2 | 105 |
77468 |
월간단위 월주차 함수
![]() ![]() ![]() |
![]() ![]() |
2025.03.07 | - | 124 |
77385 |
TEXTJOIN 을 SUMPRODUCT 공식으로 2차원 데이터 다루기
![]() ![]() |
![]() |
2025.03.04 | - | 87 |
77355 |
TEXTJOIN 으로 2차원 데이터 다루기
![]() ![]() |
![]() |
2025.03.02 | 1 | 87 |
77353 |
& 기호로 SUMPRODUCT 2차원 데이터 다루기
![]() ![]() |
![]() |
2025.03.02 | - | 66 |
77351 |
단어 포함 여부 검색, 원하는 단어로 출력
![]() ![]() |
![]() |
2025.03.02 | 1 | 96 |
77238 |
휴일이면 1 아니면 0이 나오는 함수
![]() ![]() |
![]() |
2025.02.24 | - | 132 |
77072 |
SUMPRODUCT로 VLOOKUP 대체 (2차원 룩업 가능)
![]() ![]() |
![]() |
2025.02.16 | - | 242 |
76915 |
SUMPRODUCT로 2차원 데이터 다루기[응용]
![]() ![]() |
![]() |
2025.02.09 | 1 | 214 |
76913 |
SUMPRODUCT로 2차원 데이터 sumifs 처럼 다루기
![]() ![]() |
![]() |
2025.02.09 | - | 170 |
@dra**** 님 구조는 간단해보이지만, 첨부해주신 사진의 파일 정도의 툴을 만들려면.. (로우DB에 따라 다르겠지만..ㅎㅎ;;) M 함수에 대한 이해도가 상당히 많이 필요하지 않을까 생각됩니다. (dra**님께는 흥~ 풀어서 펭~ 하면 나오는 수준이겠지만요 ㅜㅜ)
이게 DAX랑 크게 다르지 않기 때문에 엑셀 -> DAX -> M 함수로 넘어가면 난이도는 높지 않을것 같지만.. 예전에 살펴보니 이게 비스무리한 함수가 복잡하게 꼬여있어서..ㅡㅡ; (텍스트, 데이트 등..) 레퍼런스를 옆에 끼고 쓰게되더라구요 ㅎㅎ
실제 툴을 구현하려면 추가로 상당한 공부가 필요하겠지만, 쿼리를 VBA로 구축하는 베이직 플로우에 대해서 다시 한 번 정리할 수 있었습니다 ㅎ 좋은 자료 감사드려요
@더블유에이 님 처음 구현하고자 마음 먹었을 때, 어떻게 해야 할 지 몰라 맨땅에 해당 했습니다.
특히 웹 공부하고 다시 돌아오니 아무것도 기억이 나지 않아 애 먹었습니다.
다행히 제가 만들어 놓은 reference들 덕에 기억을 되살려서 ...
reference들이 그사이 많이 update되었습니다. 이 말은 저도 reference 끼고 살았다는...
M Script는 DB 정보와 SQL 전달자로서의 역할만 합니다.
SQL로 다 해결합니다. transform은 거의 사용 안 합니다.
테이블을 모두 관계형으로 디자인해서 JOIN을 제일 많이 쓰네요.
합계같은것도 SUM하고 GROUP BY로 주로 하고
그리고 표에 예전에 몰랐던 너무 막강한 기능들이 있어 그걸 또 많이 사용하네요.
@dra**** 님 항상 노력하시는 모습이 정말 부럽습니다..ㅎ 저도 앞으로도 많이 배워야겠네요 ㅜㅜ
감사합니다
@dra**** 님 감사합니다.
@dra**** 님 감사 합니다.~
@dra**** 님 좋은 정보 감사합니다🥲
@dra**** 님 감사합니다
@dra**** 님 감사합니다
@dra**** 님 감사합니다.
@dra**** 님 감사합니다
@dra**** 님 정보 감사합니다
@dra**** 님 감사합니다
@dra**** 님 좋은 정보 감사드립니다.
@dra**** 님 좋은 정보 고맙습니다 ^^
@dra**** 님 좋은 정보 감사합니다~ 🙂
@dra**** 님 화이팅 하십시오~!!