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

같은 카테고리의 다른 글

엑셀 / 화살표 키 눌렀을 때 스크롤 되는 현상 해결하는 방법

화살표가 셀 대신 화면을 움직일 때 Scroll Lock 상태를 확인합니다. 키가 없는 키보드의 화면 키보드 사용과 다른 입력 상태의 점검도 안내합니다.

엑셀 / 함수 / FIND, FINDB, SEARCH, SEARCHB / 특정 문자열의 시작 위치를 반환하는 함수

엑셀 / 함수 / FIND, FINDB, SEARCH, SEARCHB / 특정 문자열의 시작 위치를 반환하는 함수

FIND와 SEARCH의 대소문자·와일드카드 차이, 검색 시작 위치와 오류 조건을 설명합니다. FINDB·SEARCHB의 바이트 방식은 문자 방식과 구분해 확인해야 합니다.

엑셀 / 하이퍼링크 제거하는 방법, 자동 하이퍼링크 안 생기게 하는 방법

엑셀 / 하이퍼링크 제거하는 방법, 자동 하이퍼링크 안 생기게 하는 방법

기존 하이퍼링크를 제거하거나 입력 시 자동 생성을 끄는 방법을 설명합니다. 텍스트·서식 보존과 HYPERLINK 수식의 별도 처리도 안내합니다.

엑셀 / 셀 안에서 강제 줄바꿈하는 방법

엑셀 / 셀 안에서 강제 줄바꿈하는 방법

Alt+Enter로 셀 안에 줄바꿈을 넣고 표시·행 높이를 조절합니다. 자동 줄 바꿈과 실제 줄바꿈의 차이, 수식에서 생성·제거하는 방법도 설명합니다.

엑셀 / 나누기, 몫 구하기, 나머지 구하기

엑셀 / 나누기, 몫 구하기, 나머지 구하기

나눗셈 연산자와 QUOTIENT·MOD의 결과를 비교합니다. 0으로 나누는 오류와 음수에서 몫·나머지가 계산되는 방식도 예제로 설명합니다.

엑셀 / 양수(이익)를 빨간색, 음수(손실)를 파란색으로 만드는 방법

엑셀 / 양수(이익)를 빨간색, 음수(손실)를 파란색으로 만드는 방법

조건부 서식과 사용자 지정 숫자 형식으로 양수·음수의 색을 구분합니다. 0·텍스트·소수 자리 표시와 색 외의 구분·규칙 충돌도 확인합니다.

엑셀 / 함수 / EVEN, ODD / 짝수 또는 홀수로 올림 또는 내림하는 함수

엑셀 / 함수 / EVEN, ODD / 짝수 또는 홀수로 올림 또는 내림하는 함수

EVEN과 ODD가 0에서 멀어지는 방향으로 짝수·홀수를 만드는 원리를 설명합니다. 음수와 0 예제로 ISEVEN·ISODD의 판별 기능과 구분할 수 있습니다.

엑셀 / 함수 / TRIM / 공백 제거하는 함수

엑셀 / 함수 / TRIM / 공백 제거하는 함수

TRIM으로 앞뒤 공백과 연속 공백을 정리하는 예제를 설명합니다. 줄바꿈·줄 바꿈 없는 공백·전각 공백이 남는 경우의 확인 방법도 다룹니다.

엑셀 / VBA / 주석 만드는 방법

엑셀 / VBA / 주석 만드는 방법

작은따옴표로 VBA 주석을 만들고 편집 도구 모음으로 여러 줄을 주석 처리하는 방법을 안내합니다. 문자열 속 작은따옴표와 코드 비활성화의 주의점도 설명합니다.

엑셀 / 함수 / DELTA / 두 숫자가 같은지 비교하는 함수

엑셀 / 함수 / DELTA / 두 숫자가 같은지 비교하는 함수

DELTA가 같은 숫자에 1, 다른 숫자에 0을 반환하는 방식과 기본값을 설명합니다. 소수 계산 오차가 있는 수를 비교할 때의 한계도 다룹니다.