엑셀 / VBA / 여러 시트의 내용을 하나의 시트에 모으는 방법

엑셀에서 같은 열 구조의 여러 시트를 하나로 모으려면 VBA로 각 시트의 행을 순서대로 복사할 수 있습니다. 아래 예제는 새 ‘통합결과’ 시트를 만들고 머리글은 한 번만, 데이터는 값으로 이어 붙입니다. 원본 시트나 기존 결과의 내용을 삭제하지 않으며 실행 전 복사본에서 확인해야 합니다.

메뉴 경로와 단축키는 Windows용 데스크톱 Excel 기준입니다. 버전과 리본 메뉴 구성에 따라 이름·위치가 다를 수 있습니다.

원본 자료의 조건

같은 형식의 여러 시트에 나누어 저장된 자료를 모으는 예입니다. 시트 순서를 번호로 가정하기보다 아래 코드의 원본 이름 목록을 명시적으로 지정합니다.

같은 형식의 여러 시트에 나누어 저장된 자료를 모으는 예입니다. 시트 순서를 번호로 가정하기보다 아래 코드의 원본 이름 목록을 명시적으로 지정합니다.

  • 각 원본 시트의 A1부터 표가 시작하고 첫 행에 같은 이름·순서의 머리글이 있어야 합니다.
  • 표 안에 완전히 빈 행·열이 없어야 합니다. CurrentRegion은 빈 행·열을 경계로 범위를 잡으므로 그 뒤의 자료를 놓칠 수 있습니다.
  • 병합 셀·중간 소계·반복 머리글은 먼저 정리합니다. 이 코드는 그런 행을 알아서 판별해 제거하지 않습니다.
  • 필터로 숨긴 행도 포함합니다. 보이는 행만 모으는 매크로가 아닙니다.
  • 원본 자료는 보호되지 않은 시트에 있어야 하며 결과를 추가할 수 있도록 통합 문서 구조도 확인합니다.

수식 자체가 아니라 계산 결과의 값을 복사합니다. 서식·열 너비·주석·개체와 연결은 복제하지 않습니다. 날짜는 일련번호로, 백분율은 소수로 보일 수 있으므로 결과 열에 필요한 표시 형식을 별도로 적용하세요.

표준 모듈에 코드 넣기

  1. [개발 도구] → [Visual Basic] 또는 Alt+F11로 편집기를 엽니다. 코드를 저장할 프로젝트가 자료 파일인지 확인합니다.

[개발 도구] → [Visual Basic] 또는 Alt+F11로 편집기를 엽니다. 코드를 저장할 프로젝트가 자료 파일인지 확인합니다.

  1. 해당 프로젝트에서 [삽입] → [모듈]을 선택합니다. 개발 도구가 없다면 개발 도구 탭 표시 방법을 참고하세요.

해당 프로젝트에서 [삽입] → [모듈]을 선택합니다. 개발 도구가 없다면 개발 도구 탭 표시 방법을 참고하세요.

모듈에 시트 통합 코드를 입력하는 화면의 예입니다. 기존 화면 속 코드는 첫 시트에 모으는 방식이며, 아래 새 예제는 원본 보존을 위해 별도의 결과 시트를 만듭니다. 실제 실행에는 아래 코드를 사용하세요.

모듈에 시트 통합 코드를 입력하는 화면의 예입니다. 기존 화면 속 코드는 첫 시트에 모으는 방식이며, 아래 새 예제는 원본 보존을 위해 별도의 결과 시트를 만듭니다. 실제 실행에는 아래 코드를 사용하세요.

Option Explicit

Sub MergeSheets()
    Dim wb As Workbook, src As Worksheet, dst As Worksheet, ws As Worksheet
    Dim names As Variant, n As Variant, rg As Range, block As Range
    Dim headers As Variant, cols As Long, c As Long
    Dim totalRows As Long, nextRow As Long, first As Boolean

    Set wb = ThisWorkbook
    names = Array("자료1", "자료2", "자료3")
    On Error GoTo Failed

    For Each ws In wb.Worksheets
        If ws.Name = "통합결과" Then
            MsgBox "통합결과 시트가 이미 있습니다. 이름을 바꾼 뒤 다시 실행하세요."
            Exit Sub
        End If
    Next ws

    first = True
    totalRows = 1
    For Each n In names
        Set src = wb.Worksheets(CStr(n))
        If src.ProtectContents Then Err.Raise vbObjectError + 1, , "보호된 원본 시트입니다."
        If Len(CStr(src.Range("A1").Value2)) = 0 Then Err.Raise vbObjectError + 2, , "A1 머리글을 확인하세요."
        Set rg = src.Range("A1").CurrentRegion
        If first Then
            cols = rg.Columns.Count
            ReDim headers(1 To cols)
            For c = 1 To cols
                headers(c) = CStr(rg.Cells(1, c).Value2)
            Next c
            first = False
        Else
            If rg.Columns.Count <> cols Then Err.Raise vbObjectError + 3, , "열 개수가 다릅니다."
            For c = 1 To cols
                If CStr(rg.Cells(1, c).Value2) <> headers(c) Then Err.Raise vbObjectError + 4, , "머리글 순서 또는 이름이 다릅니다."
            Next c
        End If
        totalRows = totalRows + rg.Rows.Count - 1
    Next n
    If totalRows > wb.Worksheets(1).Rows.Count Then Err.Raise vbObjectError + 5, , "결과가 시트 행 한도를 초과합니다."
    If MsgBox("새 통합결과 시트를 만들까요? 원본은 지우지 않습니다.", vbYesNo) <> vbYes Then Exit Sub

    Set dst = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
    dst.Name = "통합결과"
    nextRow = 1
    first = True
    For Each n In names
        Set src = wb.Worksheets(CStr(n))
        Set rg = src.Range("A1").CurrentRegion
        If first Then
            Set block = rg
            first = False
        ElseIf rg.Rows.Count > 1 Then
            Set block = rg.Offset(1, 0).Resize(rg.Rows.Count - 1, cols)
        Else
            Set block = Nothing
        End If
        If Not block Is Nothing Then
            dst.Cells(nextRow, 1).Resize(block.Rows.Count, cols).Value2 = block.Value2
            nextRow = nextRow + block.Rows.Count
        End If
    Next n
    MsgBox "완료: 머리글을 제외한 " & (nextRow - 2) & "개 행을 모았습니다."
    Exit Sub
Failed:
    MsgBox "중단: " & Err.Description & vbCrLf & "원본은 삭제하지 않았습니다. 새 결과 시트가 생겼다면 미완성 결과인지 확인하세요."
End Sub

코드의 names = Array("자료1", "자료2", "자료3")를 실제 원본 시트 이름으로 바꿉니다. 순서대로 결과에 들어가며 같은 이름을 중복 지정하면 그 자료도 중복됩니다. 이름 사이에 결과 시트를 넣지 않습니다.

ThisWorkbook은 매크로가 저장된 파일입니다. 개인용 매크로 통합 문서 등에 코드를 저장하면 다른 파일을 가리키므로 이 예제는 원본 자료가 있는 통합 문서의 표준 모듈에 넣습니다. 데이터는 사용자가 확인한 복사본을 기준으로 작업하세요.

기능과 적용 제품은 Microsoft의 ThisWorkbook 설명, Microsoft의 Range.Value2 설명, Microsoft의 CurrentRegion 설명, Microsoft의 Worksheets.Add 설명, Microsoft의 매크로 보안 설정 안내에서 확인할 수 있습니다.

실행과 결과 확인

  1. Excel로 돌아가 Alt+F8로 매크로 목록을 엽니다. 실행 전에 코드의 원본 이름과 파일 백업을 확인합니다.

Excel로 돌아가 Alt+F8로 매크로 목록을 엽니다. 실행 전에 코드의 원본 이름과 파일 백업을 확인합니다.

  1. 새 코드의 MergeSheets를 선택하고 실행합니다. 기존 화면에는 Merge가 보이지만 이 예제의 이름은 MergeSheets입니다. 확인 창에서 [예]를 선택하면 새 결과 시트가 만들어집니다.

새 코드의 MergeSheets를 선택하고 실행합니다. 기존 화면에는 Merge가 보이지만 이 예제의 이름은 MergeSheets입니다. 확인 창에서 [예]를 선택하면 새 결과 시트가 만들어집니다.

여러 시트의 행이 이어진 결과의 예입니다. 새 코드의 결과는 첫 시트가 아니라 ‘통합결과’에 생성되므로 해당 시트를 열어 확인합니다.

여러 시트의 행이 이어진 결과의 예입니다. 새 코드의 결과는 첫 시트가 아니라 ‘통합결과’에 생성되므로 해당 시트를 열어 확인합니다.

각 원본의 데이터 행 수를 더한 값이 결과의 머리글 제외 행 수와 같은지 확인합니다. 원본별 첫 행·마지막 행, 금액 합계와 날짜·식별자도 비교하세요. 빈 행으로 범위가 잘려 누락된 경우에는 실행 완료 메시지만으로 정상이라고 판단할 수 없습니다.

이 코드는 중복 레코드를 제거하거나 날짜 형식을 통일하지 않습니다. 식별번호의 선행 0이 표시 형식에만 있었다면 값 복사 후 사라져 보일 수 있으므로 원자료와 결과의 실제 값·표시 형식을 구분합니다.

오류와 다시 실행할 때 주의할 점

원본 시트가 없거나 머리글·열 수가 다르면 결과 생성 전에 중단합니다. ‘통합결과’가 이미 있으면 덮어쓰지 않고 종료합니다. 다시 실행하려면 기존 결과를 확인한 뒤 다른 이름으로 바꾸어 보관합니다.

결과 시트 생성 이후 오류가 나면 미완성 결과가 남을 수 있으므로 메시지와 행 수를 확인하세요. 원본을 자동 삭제하지는 않지만 일반적인 실행 취소에 의존하면 안 됩니다. 코드는 공식 VBA 개체 설명을 기준으로 작성한 예제이며 모든 업무 파일에서 직접 실행 검증한 코드는 아닙니다. 실제 데이터 적용 전 복사본에서 구조와 결과를 검증해야 합니다.

같은 카테고리의 다른 글
엑셀 / 날짜를 텍스트로, 텍스트를 날짜로 변환하는 방법

엑셀 / 날짜를 텍스트로, 텍스트를 날짜로 변환하는 방법

TEXT·DATEVALUE로 날짜와 텍스트를 변환하는 방법을 설명합니다. 일련번호·표시 형식의 차이와 지역별 문자열 해석, 값으로 저장하는 과정도 다룹니다.

엑셀 / 함수 / VAR.P, VAR.S, VARP, VAR / 분산과 표본분산 구하는 함수

엑셀 / 함수 / VAR.P, VAR.S, VARP, VAR / 분산과 표본분산 구하는 함수

모집단 전체와 표본 자료에 따라 VAR.P·VAR.S를 선택하는 기준을 설명합니다. 분모 차이와 숫자 0·빈 셀 처리, 호환 함수의 관계도 정리합니다.

엑셀 / 워크시트 이름 바꾸는 방법, 탭 색 변경하는 방법

엑셀 / 워크시트 이름 바꾸는 방법, 탭 색 변경하는 방법

시트 탭에서 이름과 색을 바꾸는 방법을 설명합니다. 이름의 금지 문자·길이, 중복과 외부 참조·매크로 영향을 확인하는 과정도 다룹니다.

엑셀 / 로그 또는 상용로그의 값 구하기, 상용로그표 만들기

엑셀 / 로그 또는 상용로그의 값 구하기, 상용로그표 만들기

LOG·LOG10·LN의 차이와 로그 계산의 입력 조건을 설명합니다. 혼합 참조를 사용해 행과 열로 펼쳐지는 상용로그표를 만들 수 있습니다.

엑셀 / 스파크라인 / 데이터를 시각적으로 보여주기

엑셀 / 스파크라인 / 데이터를 시각적으로 보여주기

스파크라인의 원본·위치 범위를 지정하고 모양·축·강조 지점을 설정하는 방법을 설명합니다. 일반 차트와의 차이와 올바른 삭제 방법도 다룹니다.

엑셀 / 함수 / DATEDIF / 두 날짜 사이의 일수, 월수, 년수 등을 계산하는 함수

엑셀 / 함수 / DATEDIF / 두 날짜 사이의 일수, 월수, 년수 등을 계산하는 함수

DATEDIF로 완성된 연수·월수와 날짜 차이를 구하는 방법을 설명합니다. 인수 순서, 공식 문서에 안내된 MD의 한계, 윤년·월말 확인 사항도 다룹니다.

엑셀 / 피벗 테이블 / 만드는 방법

엑셀 / 피벗 테이블 / 만드는 방법

피벗 테이블 원자료·보고서 위치·행·열·값 영역을 설정하는 방법을 설명합니다. 합계가 개수로 나오는 이유와 데이터 추가 후 범위·새로 고침도 안내합니다.

엑셀 / 틀 고정 하는 방법, 틀 고정 취소하는 방법

엑셀 / 틀 고정 하는 방법, 틀 고정 취소하는 방법

선택 셀 위·왼쪽의 행·열을 틀 고정하는 방법을 설명합니다. 첫 행·첫 열 고정, 취소와 인쇄 제목 설정의 차이도 안내합니다.

엑셀 / 함수 / SUMSQ / 제곱의 합 구하는 함수

엑셀 / 함수 / SUMSQ / 제곱의 합 구하는 함수

SUMSQ로 여러 수의 제곱합을 구하는 구문과 범위 예제를 안내합니다. 합의 제곱과의 차이, 통계의 편차 제곱합과의 구분도 설명합니다.

엑셀 / 중복된 값 찾는 방법, 중복 항목 제거하는 방법

엑셀 / 중복된 값 찾는 방법, 중복 항목 제거하는 방법

중복 값을 표시하는 조건부 서식과 실제 제거를 구분합니다. 한 열·여러 열의 기준 선택, 행 관계 보존과 제거 후 검증·복구도 설명합니다.