엑셀 / 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 개체 설명을 기준으로 작성한 예제이며 모든 업무 파일에서 직접 실행 검증한 코드는 아닙니다. 실제 데이터 적용 전 복사본에서 구조와 결과를 검증해야 합니다.

같은 카테고리의 다른 글
엑셀 / 통합 문서 모든 시트 대상으로 검색하는 방법

엑셀 / 통합 문서 모든 시트 대상으로 검색하는 방법

찾기 범위를 통합 문서로 바꾸어 여러 시트를 검색하는 방법을 설명합니다. 수식·값, 대소문자·전체 일치·서식 옵션과 일괄 바꾸기의 주의점도 다룹니다.

엑셀 / 리본 메뉴 숨기기, 탭만 표시하기

엑셀 / 리본 메뉴 숨기기, 탭만 표시하기

리본 메뉴를 접거나 탭만 표시하고 다시 고정하는 방법을 설명합니다. Ctrl+F1과 버전별 표시 옵션을 사용해 화면 공간을 조절할 수 있습니다.

엑셀 / 메모 인쇄하는 방법

엑셀 / 메모 인쇄하는 방법

메모를 화면 위치대로 또는 시트 끝에 모아 인쇄하는 방법을 설명합니다. Microsoft 365 대화형 주석과의 차이 및 잘림·개인정보 노출도 확인합니다.

엑셀 / 함수 / ABS / 절댓값을 반환하는 함수

ABS로 절댓값과 두 값의 차이 크기를 계산하는 예제를 설명합니다. 합의 절댓값·절댓값의 합 차이와 부호 정보가 사라지는 한계도 다룹니다.

엑셀 / 산술평균, 기하평균, 조화평균 구하는 방법

엑셀 / 산술평균, 기하평균, 조화평균 구하는 방법

AVERAGE·GEOMEAN·HARMEAN의 계산 의미와 선택 기준을 비교합니다. 복리 성장률·같은 거리의 속도 예제 및 양수 조건을 설명합니다.

엑셀 / 차트를 이미지 파일로 저장하는 방법

엑셀 / 차트를 이미지 파일로 저장하는 방법

Excel 차트를 복사해 PowerPoint나 그림판에서 이미지로 저장하는 방법을 설명합니다. 파일 형식, 잘림·글자 선명도와 원본 데이터 노출도 확인합니다.

엑셀 / 함수 / TEXTJOIN / 여러 텍스트를 하나로 합치는 함수

엑셀 / 함수 / TEXTJOIN / 여러 텍스트를 하나로 합치는 함수

TEXTJOIN의 구분자·빈 셀 옵션을 비교하고 여러 셀을 한 문장으로 연결하는 예제를 안내합니다. 날짜·숫자 서식과 결과 길이 제한도 설명합니다.

엑셀 / 암호 설정하는 방법, 암호 해제하는 방법

엑셀 / 암호 설정하는 방법, 암호 해제하는 방법

열기 암호·쓰기 암호·시트 보호의 목적을 비교하고 설정·해제 과정을 안내합니다. 저장 후 검증, 암호 분실과 보호의 보안 한계도 설명합니다.

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

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

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

엑셀 / 가로 방향으로 정렬하는 방법

엑셀 / 가로 방향으로 정렬하는 방법

정렬 옵션의 왼쪽에서 오른쪽 설정으로 열을 가로 정렬하는 방법을 설명합니다. 기준 행과 전체 열 데이터의 대응 관계를 확인하는 과정도 안내합니다.