본문으로 건너뛰기

이 블로그의 소박한 목표

적게 일하고,
많이 벌자.

매번 하는 일인데, 매번 하기 싫어서.
귀찮은 일을 줄이고 작은 수익을 만들어보는 기록.

시간은 좀 남기고 살고 싶습니다.

귀찮음 자동화

엑셀 파일 10개 합치기: 폴더 연결부터 새로 고침까지

덜 일하는 연구소 2026. 9. 6. 23:27

같은 양식의 엑셀 파일이 열 개 있다. 하나를 열고, 제목 줄을 빼고 복사하고, 합본의 마지막 행에 붙인다. 이 일을 다음 달에도 해야 한다면 폴더를 연결해두는 편이 낫다.

엑셀의 Power Query에 어느 폴더에서 어떤 표를 읽을지 정해두면, 이후에는 파일을 넣고 새로 고침하는 방식으로 바꿀 수 있다. 이번에는 직접 만든 주문 파일 10개로 그 연결을 해봤다.

글 아래에 실습 ZIP을 첨부했다. 원본 파일 10개, 나중에 추가할 파일, 일부러 틀리게 만든 파일, 정답 대조표, 전체 쿼리 코드를 넣었다. 자료는 모두 가상 데이터이며 실제 매출이 아니다.

내 엑셀에서도 되는지 먼저 확인

Windows는 Excel 2016 이후 버전의 데이터 탭에서 Power Query를 사용할 수 있다. Mac은 Microsoft 365용 Excel을 기준으로 봐야 하고, Windows의 ‘폴더에서’ 메뉴가 그대로 있지는 않을 수 있다. 이 글에는 Windows 기본 메뉴와 Mac에서 사용한 빈 쿼리 방법을 함께 적었다. 버전별 지원 범위

이 작업에 AI 구독이나 자동화 서버는 필요 없다. 사용할 수 있는 데스크톱 Excel과 실습 파일을 준비하면 된다. 웹용 Excel이나 휴대폰 앱을 대상으로 한 설명은 아니다.

폴더를 잘 나누면 절반은 끝난다

ZIP을 먼저 풀어둔다. 파일 선택창에서 지정할 곳은 input 폴더 하나다. 실습 꾸러미 전체를 지정하지 않는다.

  • input: orders_01.xlsx부터 orders_10.xlsx까지, 각 10행의 정상 원본.
  • add-later: 새로 고침 연습에 쓸 orders_11.xlsx.
  • broken: 열 이름과 날짜가 잘못된 오류 연습 파일. 처음에는 원본 폴더에 넣지 않는다.
  • expected-results.xlsx: 행 수와 금액을 비교하는 정답 파일. Power Query 연결이 들어 있는 파일은 아니다.
  • combine-orders.pq: 빈 쿼리나 고급 편집기에 붙여넣을 전체 코드.

원본 파일 하나를 열면 ‘주문’ 시트 안에 Orders라는 이름의 표가 있다. 읽어야 할 것은 이 표다. 표 위에 있는 제목이나 ‘가상 데이터’라는 설명까지 합치지 않도록 범위를 구분해뒀다.

표의 열은 주문일, 주문번호, 채널, 상품, 수량, 매출액이다. 내 파일로 바꿀 때도 열 이름과 의미를 통일해야 한다. ‘매출’, ‘매출액’, ‘매출액 ’은 서로 다른 이름으로 취급될 수 있다.

Windows: 메뉴로 먼저 합쳐보기

  1. 새 통합문서를 열고 데이터 → 데이터 가져오기 → 파일에서 → 폴더에서로 들어간다.
  2. 압축을 푼 위치의 input 폴더를 선택한다. 목록에 orders_01~10.xlsx 열 개가 있는지 확인한다.
  3. 결합 및 변환을 선택한다. 버전에 따라 ‘결합’ 아래에 들어 있다.
  4. 샘플 파일에서 Orders 표를 선택한다. 시트 전체인 ‘주문’과 구분한다.
  5. 편집기에서 주문일은 날짜, 주문번호·채널·상품은 텍스트, 수량·매출액은 정수로 맞춘다. 원본 파일명을 나타내는 열은 남겨두면 나중에 추적하기 쉽다.
  6. 홈 → 닫기 및 로드로 결과를 시트에 불러온다. 합본 통합문서는 input 바깥에 저장한다.

Windows 메뉴 순서는 Microsoft의 폴더 결합 안내를 기준으로 정리했다. 이 메뉴가 자동으로 만드는 쿼리와 아래에 제공하는 직접 작성한 쿼리는 구성과 오류 표시가 다를 수 있다.

합본을 원본 폴더 안에 두면 다음번에 결과 파일까지 읽게 될 수 있다. 원본과 결과를 다른 위치에 두는 이유다. 기본 폴더 가져오기는 하위 폴더도 대상으로 삼을 수 있으므로 백업이나 오류 파일도 바깥에 둔다.

Mac: 빈 쿼리에 코드를 넣어서 연결했다

확인한 Mac Excel의 데이터 원본 선택 화면에는 Excel workbook, Text/CSV, Blank query 등이 있었고, Windows와 같은 폴더 버튼은 없었다. 그래서 Blank query, 즉 빈 쿼리에서 연결했다.

  1. 데이터 → 데이터 가져오기(Power Query) → 빈 쿼리(Blank query)를 연다.
  2. 첨부한 combine-orders.pq를 일반 텍스트 편집기로 열고, FolderPath의 값을 본인 컴퓨터의 input 폴더 절대 경로로 바꾼다.
  3. 기본으로 들어 있는 내용을 지우고 코드 전체를 붙여넣는다. 이미 편집기가 열려 있다면 홈 → 고급 편집기(Advanced editor)에서 넣는다.
  4. 폴더 접근을 요청하면 지정한 실습 폴더가 맞는지 확인하고 선택한다. 데이터를 읽은 뒤 표가 표시되는지 확인한다.
  5. 쿼리 이름을 CombinedOrders로 바꾸고 닫기 및 로드(Close & load)를 선택한다. 통합문서는 input 바깥에 저장한다.

경로는 Windows라면 C:\lessworklab\input 같은 형태이고, Mac이라면 /Users/본인계정/Downloads/excel-folder-lab/input 같은 형태다. 실제 압축을 푼 위치에 맞춰야 한다. 따옴표는 코드에 들어 있는 직선 큰따옴표를 유지한다.

아래 화면은 Mac Power Query 편집기에서 원본 10개가 합쳐진 실제 미리보기다. 결과가 100행·7열임을 확인했다. 여섯 개 원본 열에 추적용 ‘원본파일’ 열을 하나 더 붙였다.

정상 원본 10개를 읽어온 Mac Power Query 미리보기.

새 파일을 넣었을 때 맞아야 할 숫자

표가 보인다고 끝내지 않고 행 수와 금액을 같이 대조한다. 아래 숫자는 첨부 원본 파일의 값을 별도로 합산해 검산한 정답이다.

  • 처음 10개: 100행, 매출액 합계 1,932,000원.
  • 추가할 파일 1개: 10행, 매출액 합계 192,000원.
  • 추가한 뒤의 정답: 110행, 매출액 합계 2,124,000원.

add-later의 orders_11.xlsx를 input에 복사한 뒤 합본에서 데이터 → 모두 새로 고침을 누른다. 이어서 파일을 더 넣지 않고 한 번 더 새로 고침한다. 원본을 다시 읽어 만드는 방식이므로 두 번째에도 110행이어야 한다.

예를 들어 결과를 A1부터 불러왔다면, 처음에는 주문번호가 든 B2:B101에 =COUNTA(B2:B101), 금액이 든 F2:F101에 =SUM(F2:F101)을 써서 대조할 수 있다. 추가 후에는 마지막 행을 111로 바꾼다. 검사 수식은 결과 표 밖에 적는다.

확인 범위도 남겨둔다. 이번에 Excel에서 직접 확인한 것은 정상 10개 파일을 결합한 미리보기 100행이다. 첨부 파일의 저장 내용과 100행·110행의 합계는 별도 검산했다. 파일 추가 후 반복 새로 고침과 아래 오류 사례는 이 글을 쓰는 시점에 Excel에서 실행 확인을 끝내지 못했다. 해당 부분은 실습 절차와 예상 동작으로 구분해서 읽으면 된다.

일부러 틀린 파일도 넣어보자

input을 복사한 연습 폴더에서 하나씩 시험한다. 아래의 사용자 정의 오류 검사와 문구는 첨부 코드로 만든 쿼리를 기준으로 한다. Windows 기본 결합 메뉴만 사용했다면 표시가 다를 수 있다.

‘매출액’ 열이 ‘매출’로 바뀐 경우. broken/header/orders_01.xlsx를 연습 폴더의 같은 이름 파일과 교체한다. 제공 코드는 필요한 열이 빠지면 파일명과 열 이름을 알리도록 작성했다. 해당 파일을 열어 F4를 ‘매출액’으로 고치고 저장한 다음 새로 고침한다. 열 이름은 엑셀이 합칠 대상을 찾는 기준이므로, 값이 같은 숫자여도 이름부터 맞춰야 한다.

날짜가 2026-02-30인 경우. 이번에는 broken/date의 파일로 교체한다. 겉모양은 날짜 같지만 실제로 없는 날이다. A5를 2026-08-01로 고쳐 저장한다. 실제 업무에서는 ‘날짜처럼 보이는 문자’와 실제 날짜 값이 섞여 있는지도 살핀다. Power Query의 형식 변환 설명

같은 파일을 두 번 넣은 경우. 정상 파일 하나를 orders_copy.xlsx라는 이름으로 복제해 넣어본다. 이 예제는 주문번호 하나가 한 행을 뜻하므로 중복 번호를 발견하면 중단하도록 작성했다. 복사본을 원본 폴더 밖으로 옮긴 뒤 다시 읽는다. 주문 하나가 여러 품목 행으로 나뉘는 실제 자료라면 주문번호와 품목번호 등으로 검사 기준을 바꿔야 한다.

오류 난 파일을 무조건 건너뛰거나 금액을 전부 0으로 바꾸면, 결과는 깔끔해 보여도 합계가 작아질 수 있다. 원인을 확인하고 원본을 고친 뒤 다시 읽는 쪽으로 실습한다. 원본 경로나 열 이름 때문에 나는 오류의 구분은 Microsoft의 오류 해결 문서에서도 확인할 수 있다.

코드에서 내 업무에 맞게 바꿀 곳

전체 코드는 ZIP 안에 있다. 폴더 경로 외에는 다음 네 군데가 내 자료와 맞는지 보면 된다.

  • orders_: 읽어올 파일명의 시작 부분. 다른 파일을 섞어 읽지 않기 위한 조건이다.
  • Orders: 각 엑셀 파일 안의 표 이름. 시트 이름과 다르다.
  • Required와 Typed: 필요한 열 목록과 날짜·문자·숫자의 형식.
  • Counts: 중복을 판단할 기준. 이 실습은 주문번호를 사용한다.

첨부 코드는 Folder.Contents로 지정 폴더 바로 아래의 파일만 읽고, Excel.Workbook에서 Orders 표를 꺼낸다. 표를 합친 뒤 원본 파일명으로 거슬러 올라갈 수 있도록 구성했다.

let
    // 본인의 input 폴더 절대 경로로 바꾸세요.
    FolderPath = "C:\lessworklab\input",
    Required = {"주문일", "주문번호", "채널", "상품", "수량", "매출액"},
    Files = Table.SelectRows(Folder.Contents(FolderPath), each
        [Extension] = ".xlsx" and Text.StartsWith([Name], "orders_")),
    CheckedFiles = if Table.RowCount(Files) = 0 then
        error "orders_로 시작하는 xlsx 파일이 없습니다. 폴더 경로를 확인하세요."
        else Files,
    ReadTables = Table.AddColumn(CheckedFiles, "Rows", (file) =>
        let
            Raw = Excel.Workbook(file[Content], null, true){[Item="Orders", Kind="Table"]}[Data],
            Missing = List.Difference(Required, Table.ColumnNames(Raw)),
            Columns = if List.Count(Missing) > 0 then
                error Error.Record("열 이름 확인", file[Name] & ": " & Text.Combine(Missing, ", "), null)
                else Table.SelectColumns(Raw, Required),
            Typed = Table.TransformColumnTypes(Columns, {
                {"주문일", type date}, {"주문번호", type text},
                {"채널", type text}, {"상품", type text},
                {"수량", Int64.Type}, {"매출액", Int64.Type}
            }, "ko-KR"),
            Errors = Table.SelectRowsWithErrors(Typed),
            Checked = if Table.RowCount(Errors) > 0 then
                error Error.Record("날짜 또는 숫자 형식 확인", file[Name], null)
                else Typed,
            WithFile = Table.AddColumn(Checked, "원본파일", each file[Name], type text)
        in
            WithFile),
    Combined = Table.Combine(ReadTables[Rows]),
    Counts = Table.Group(Combined, {"주문번호"}, {{"개수", each Table.RowCount(_), Int64.Type}}),
    Duplicates = Table.SelectRows(Counts, each [개수] > 1),
    Result = if Table.RowCount(Duplicates) > 0 then
        error "주문번호가 중복됩니다. 복사본 파일 또는 원본 주문번호를 확인하세요."
        else Table.Sort(Combined, {{"주문일", Order.Ascending}, {"주문번호", Order.Ascending}})
in
    Result

다음 달에 다시 쓰려면

처음 연결한 폴더를 유지하고 같은 구조의 파일을 넣는다. 기존 파일까지 계속 넣어두면 누적 자료가 된다. 매달 별도 결과가 필요하면 지난달 원본을 바깥으로 옮기거나, 날짜 열에서 해당 월만 걸러야 한다.

원본 값이 바뀌었을 때는 저장을 마친 뒤 새로 고침한다. 합쳐진 결과 표를 직접 수정하면 다음번 새로 고침 때 바뀔 수 있으므로, 수정은 원본이나 쿼리의 변환 단계에 남기는 편이 낫다.

이 실습에서는 처리 시간을 재지 않았다. 대신 다음 달에도 다시 쓸 수 있는 연결 하나와, 결과가 맞는지 확인할 숫자를 남겼다. 내 업무에 적용한다면 처음 설정한 시간과 이후에 파일을 정리하고 오류를 고친 시간까지 같이 적어보면 좋겠다.

실습 파일 다운로드

원본 10개, 추가 파일 1개, 오류 파일 2개, 정답 대조표, 전체 쿼리와 사용 설명서를 한 꾸러미로 묶었다. 자유롭게 고쳐 써도 된다. ZIP을 풀고 input 폴더부터 시작하면 된다.

excel-folder-lab.zip
0.07MB

 

작성 기준: 2026년 9월 6일. 실습 데이터는 직접 만든 가상 자료다. 화면은 Mac Excel의 실제 결합 미리보기이며, Windows 메뉴는 공식 문서를 바탕으로 정리했다.

'귀찮음 자동화' 카테고리의 다른 글

5분짜리 일을 줄이려고 1시간을 쓴다면  (0) 2026.09.06