엑셀 VBA 시트에 있는 내용을 파일, 텍스트로 출력하는 방법

엑셀(Excel)/VBA

엑셀 VBA 시트에 있는 내용을 파일, 텍스트로 출력하는 방법

 

환경: Microsoft Excel 2013

 

엑셀에 있는 데이터를 다른 데이터 저장소로 옮기기 위해서는 백업 기능을 이용해야 합니다. 하지만 데이터를 백업하는 과정에서 사용자가 필요 없다고 생각하는 것들을 걸러내는 기능이 미흡합니다. 이런 경우에는 VBA 를 이용해서 데이터를 백업해야 합니다. 시간은 조금 더 오래 걸리겠지만 얼마든지 데이터를 분석해서 필요한 것들만 추려서 백업하는 것이 가능합니다.

 

텍스트 파일로 백업할 내용은 다음과 같습니다. VBA 에서 이 데이터들을 모두 읽어 동일하게 입력할 것입니다.

 

먼저 함수에서 사용할 변수를 정의 합니다. 파일이 저장될 위치를 지정하기 위해서 Application.DefaultFilePath 속성을 사용하였습니다. 이것은 사용자가 이전에 파일을 저장할 때 지정했던 경로가 나옵니다. 저 같은 경우 “C:\Users\Documents” 입니다.

 

Dim filename As String, rng As Range, cellValue As Variant

Dim i As Integer, j As Integer

 

filename = Application.DefaultFilePath & "\members.txt"

 

다음은 저장할 데이터가 있는 영역을 가져올 차례입니다. 다양한 방법들 중에서 선택한 영역만 가져오기를 원한다면 Selection 을 사용해야 합니다. 그게 아니라 시트에 있는 전체 영역을 저장하고자 한다면 CurrentRegion 속성을 사용하시면 됩니다.

 

‘Set rng = Selection

Set rng = ActiveSheet.Range("A1").CurrentRegion

 

다음은 데이터를 저장할 파일 개체를 생성해야 합니다. filename 경로에 파일을 만들어 #1 에 입력할 수 있도록 개체를 만듭니다. For Output As #1 이면 엑셀에 있는 데이터를 출력하는 것이고 For Input As #1 이면 외부 파일에 내용을 불러오는 것이 됩니다.

 

Open filename For Output As #1

 

다음은 이중 For 문을 사용해서 셀을 하나씩 꺼냅니다. 그리고 변수에 담습니다.  

 

For i = 1 To rng.Rows.Count

For j = 1 To rng.Columns.Count

        cellValue = rng.Cells(i, j).Value

Next j

Next i

 

위에서 하나씩 꺼낸 셀 값은 If j = rng.Columns.Count Then 로 행이 바뀌었는지 판단합니다. 그리고 셀 별로 데이터를 구분하기 위해서 구분자로 “,” 가 추가 됩니다.

 

If j = rng.Columns.Count Then

Write #1, cellValue

Else

Write #1, cellValue,

End If

 

마지막에 잊지 말아야 할 것이 파일 개체를 닫는 것입니다.  

 

Close #1

 

위에서 지금까지 설명한 전체 소스는 다음과 같습니다. 실행한 결과 모든 데이터에는 쌍따움표(“) 로 감싸고 있으며 데이터간의 구분은 “,” 가 추가 되어 있습니다.

 

Sub TextWrite()

   

    Dim filename As String, rng As Range, cellValue As Variant

    Dim i As Integer, j As Integer

   

    filename = Application.DefaultFilePath & "\members.txt"

   

    'Set rng = Selection

    Set rng = ActiveSheet.Range("A1").CurrentRegion

   

    Open filename For Output As #1

   

    For i = 1 To rng.Rows.Count

       

        For j = 1 To rng.Columns.Count

   

            cellValue = rng.Cells(i, j).Value

            

            If j = rng.Columns.Count Then

                 Write #1, cellValue

            Else

                 Write #1, cellValue,

            End If

   

        Next j

    Next i

   

    Close #1

End Sub

 



Posted by 녹두장군