• 최초 작성일: 2002-03-14
  • 최종 수정일: 2026-09-30
  • 조회수: 18 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 파일 내의 모든 시트 내보내기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

이번 시간에는 게시판에 올라온 질문을 살펴봅니다.

업무상 엑셀을 csv 형태의 파일로 변환이 자주 필요합니다. Save As를 사용하면 하나의 워크시트별로 밖에 변환이 되질 않는군요. 수십개 의 워크시트가 포함되어 있는 엑셀 파일을 Save As를 수십번 하는 것도 시간 낭비구요. 한번에 한 엑셀 파일에 포함된 복수의 워크시트를 텍스트 형태(csv)로 변환하여 저장하는 방법이 있으면 알려주시길 바랍니다. 감사합니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

파일 내의 모든 시트 내보내기

핵심 요약: 시트별 텍스트 파일 일괄 저장

시트를 차례로 순환하며 CurrentRegion의 값을 Write # 문으로 파일에 기록하면 여러 시트를 한 번에 CSV 형태의 텍스트 파일로 저장할 수 있습니다.

  • 1단계: 실습용 시트 20개를 자동으로 만듭니다(MakeSheets).
  • 2단계: 시트를 순환하며 CurrentRegion의 시작/끝 행·열을 구합니다.
  • 3단계: Open For Output과 Write # 문으로 텍스트 파일에 씁니다.

Step 1: 예제 시트 만들기

일단 예제 데이터를 만들어야 겠군요. 수십 개나 되는 시트를 일일이 손으로 만들려면 귀찮고 힘이 드니까 이것도 자동으로 만들어 보도록 하지요. 아래 버튼을 누르세요.

순식간에 20개의 시트가 만들어 졌지요? 그냥 시트만 만들어 진 것이 아니라 지점별/분기별 실적 데이터도 들어가 있을 것입니다. 물론 가상의 데이터이긴 하지만… 수작업으로 만들려면 이것도 힘이 들겠지요?

예제 시트를 만드는 코드를 간단히 보면…

Sub MakeSheets()
    Dim shtSheet As Worksheet
    Dim varQuarter As Variant
    Dim varBranch As Variant
    Dim i As Integer
    Dim intNum As Integer
    varQuarter = Array("1/4분기", "2/4분기", "3/4분기", "4/4분기")
    varBranch = Array("강동", "강서", "강남", "강북")
    intNum = 20
    '''변수를 선언하고 값을 대입(Assign)하는 부분은 여느 때와 같습니다.
    '''다만 varQuarter와 varBranch 변수에는 배열값을 담아 둔 것이 조금 다르군요.

    For i = 1 To intNum
        Worksheets.Add after:=Sheets(1)
        [B1:E1] = varQuarter
        [A2:A5] = Application.WorksheetFunction.Transpose(varBranch)
        '''시트를 삽입하고… 그 때마다 표의 타이틀 부분을 입력합니다.
        '''여기서 한 가지 주의하실 점! 가로 방향으로 배열을 입력할 때는 그냥 사용을
        '''하면 되지만 세로 방향으로 배열값을 넣어 주기 위해서 Transpose 함수를
        '''이용해 준 점을 눈여겨 보시기 바랍니다.

        With [B2:E5]
            .FormulaR1C1 = "=INT(RAND()*1000)"
            .Copy
            .PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
            .Cells(1).Select
        End With
    Next i
    MsgBox intNum & "개의 시트를 만들었습니다", , "시트 생성//By Exceller"
End Sub

변수를 선언하고 값을 대입(Assign)하는 부분은 여느 때와 같습니다. 다만 varQuarter와 varBranch 변수에는 배열값을 담아 둔 것이 조금 다르군요. 시트를 삽입하고… 그 때마다 표의 타이틀 부분을 입력합니다. 여기서 한 가지 주의하실 점! 가로 방향으로 배열을 입력할 때는 그냥 사용을 하면 되지만 세로 방향으로 배열값을 넣어 주기 위해서 Transpose 함수를 이용해 준 점을 눈여겨 보시기 바랍니다.

Step 2: 예제 시트 지우기

음지가 있으면 양지가 있듯이 만드는 코드가 있다면 지우는 코드도 필요하겠지요? 버튼을 눌러 보세요.

역시 마찬가지로 순식간에 예제 시트가 샥~ 지워졌지요? 이래도 VBA를 안 배운다고 버팅기는 분이 계실려나? Exceller가 자꾸 권할 때 못 이기는 척 하고 빨리 따라 오시기 바랍니다.

지우는 코드는 더 간단하군요. 별로 설명이 필요없을 듯…

Sub DelSheets()
    Dim shtSheet As Worksheet
    Dim strSheetName As String
    Dim i As Integer
    Dim j As Integer

    For j = ThisWorkbook.Sheets.Count To 1 Step -1
        Set shtSheet = ThisWorkbook.Sheets(j)
        strSheetName = Left(shtSheet.Name, 5)
        If strSheetName = "Sheet" Then
            Application.DisplayAlerts = False
            shtSheet.Delete
            Application.DisplayAlerts = True
            i = i + 1
        End If
    Next j
    MsgBox i & "개의 시트를 삭제하였습니다", , "시트 삭제//By Exceller"
End Sub

Step 3: 시트를 텍스트 파일로 내보내기

이제 예제 시트를 별도의 텍스트 파일로 만들어 보도록 하지요. 아래의 버튼을 눌러 보세요.

Sub ExportSheets()
    Dim rngOut As Range
    Dim lngFirstRow As Long, lngLastRow As Long
    Dim intFirstCol As Integer, intLastCol As Integer
    Dim i As Integer
    Dim r As Long
    Dim c As Integer
    Dim varData As Variant
    Dim Msg As String
    Dim shtSheet As Worksheet
    Dim shtTarget As Worksheet
    Dim intSheetNum As Integer
    On Error GoTo ET
    intSheetNum = Sheets.Count
    If intSheetNum = 1 Then
        MakeSheets
        intSheetNum = Sheets.Count
    End If

    For i = 2 To intSheetNum
        Set shtTarget = Sheets(i)
        Application.Goto shtTarget.[A1], True
        Set rngOut = ActiveCell.CurrentRegion

        lngFirstRow = rngOut.Rows(1).Row
        lngLastRow = lngFirstRow + rngOut.Rows.Count - 1
        intFirstCol = rngOut.Columns(1).Column
        intLastCol = intFirstCol + rngOut.Columns.Count - 1
        Open ThisWorkbook.Path & Application.PathSeparator & "Text" & i & ".txt" For Output As #1

        For r = lngFirstRow To lngLastRow
            For c = intFirstCol To intLastCol
                varData = Cells(r, c).Value
                If IsNumeric(varData) Then varData = Val(varData)
                If c <> intLastCol Then
                    Write #1, varData;
                Else
                    Write #1, varData
                End If
            Next c
        Next r
        Close #1
    Next i
    MsgBox "Exporting 작업을 완료하였습니다", , "Exporting 완료//By Exceller"
ET:
End Sub

코드에 대한 해설은 다음 강좌로 미루어야 할 것 같습니다. 사실은 Text 파일을 들여오기/내보내기 하는 것은 예전 강좌에서 이미 다루었던 내용이므로 복습한다 생각하고 한번 찾아보시기 바랍니다.

다시 생각해 보니… 코드에 대한 설명은 질문이 들어오면 하도록 하는 것이 좋을 것 같군요. ^^

정리 — 시트 내보내기 핵심

구분 사용한 코드 역할
시트 생성 Worksheets.Add after:=Sheets(1) 예제 시트 추가
세로 배열 입력 Application.WorksheetFunction.Transpose 배열을 세로로 입력
범위 확인 ActiveCell.CurrentRegion 데이터 영역 파악
파일 열기 Open 경로 For Output As #1 텍스트 파일 생성
값 기록 Write #1, varData; 쉼표로 구분해 기록

자주 묻는 질문 (FAQ)

Q1. Save As로는 왜 수십 개의 시트를 한꺼번에 CSV로 저장할 수 없나요?

CSV로 저장하면 활성 시트 하나만 저장되므로 시트마다 반복해야 하며 VBA로 이를 자동화할 수 있습니다.

Q2. Write # 문은 무엇을 하나요?

값을 쉼표로 구분하고 문자열에는 따옴표를 붙여 순차 파일에 기록하는 문이며, 끝에 세미콜론을 붙이면 줄바꿈 없이 이어서 씁니다.

Q3. 예제 시트를 다시 지우려면?

DelSheets 프로시저가 이름이 Sheet로 시작하는 시트를 모두 삭제합니다.

마치며

시트가 수십 개여도 VBA를 이용하면 한 번의 실행으로 텍스트 파일로 모두 내보낼 수 있습니다.