<엑셀VBA 입문 15강> 텍스트 파일쓰기, 파일읽기

<엑셀VBA 입문 15강> 텍스트 파일쓰기, 파일읽기

엑셀 VBA로 텍스트 파일쓰기, 텍스트 파일읽기를 배워본다.

1. VBA 텍스트 파일쓰기

Sub 매크로1()

‘ 매크로1 매크로

‘ 바로 가기 키: Ctrl+k

Call writeTextFile

End Sub

Function writeTextFile()
    
    On Error GoTo exmsg
    
    MsgBox (“파일쓰기 시작”)
    
    ‘파일 경로 지정
    Dim path
    path = “C:\test\test.txt”
    

    Open path For Append As #1 일 경우 이어쓰기
    Open path For Output As #1
        Print #1, “첫번째 라인”
        Print #1, “두번째 라인”
        Print #1, “세번째 라인”
    Close #1
    
    MsgBox (“파일쓰기 끝”)
    Exit Function
    
exmsg:
    Close #1
    MsgBox (“Error” & Err.Number & ” : ” & Err.Description)

End Function

파일을 쓰기 위한 가장 간단한 코드다.

C드라이브의 test 폴더 내의 test.txt 파일에 “첫번째 라인”, “두번째 라인”, “세번째 라인”, 이렇게 3줄의 텍스트를 기록하고 저장한다.

여기서 #1 이란 파일스트림이다. 파일스트림이란, 파일을 읽거나 쓰기 위한 어떤 구조다. 스트림은 원래 물줄기라는 뜻이지만, 그냥 스트림이라고 하면 긴 호스나 빨대를 생각해도 좋다.

[Open path For Output As #1] 란 path경로의 파일을 #1[샾1] 이란 명칭의 아웃풋 스트림으로 연다는 뜻이다.

1-1. test 폴더 생성 필요

C드라이브에 test 폴더를 생성 후 실행해야 한다.

그렇지 않으면 [경로를 찾을 수 없습니다] 에러가 발생할 수 있다.

1-2.  파일 이어서 쓰기

파일을 이어서 쓰려면 [Open path For Output As #1] 의 Output을 Append로 고치면 된다. 즉, [Open path For Append As #1]하면 파일 이어서 쓰기가 된다.

예를 들어 For Output 로 writeTextFile 함수를 여러 번 수행하면, 몇 번을 수행하든 결과는 3줄짜리 텍스트 파일이다.

그런데 For Append 로 writeTextFile 함수를 여러 번 수행하면, 아래와 같이 텍스트 파일 뒤에 내용이 계속 추가된다.

2. VBA 텍스트 파일읽기

Sub 매크로1()

‘ 매크로1 매크로

‘ 바로 가기 키: Ctrl+k

Call readTextFile

End Sub

Function readTextFile()
    
    On Error GoTo exmsg
    
    MsgBox (“파일읽기 시작”)
    
    ‘파일 경로 지정
    Dim path
    path = “C:\test\test.txt”
    
    Dim lineNum
    lineNum = 1
    
    Dim lineValue As String

    Open path For Input As #1
        Do While Not EOF(1)
            Line Input #1, lineValue
            Cells(lineNum, 1).Value = lineValue
            lineNum = lineNum + 1
        Loop
    Close #1
    
    MsgBox (“파일읽기 끝”)
    Exit Function
    
exmsg:
    Close #1
    MsgBox (“Error” & Err.Number & ” : ” & Err.Description)

End Function

위 코드는 텍스트 파일을 읽어 Cells(1,1) – 즉 A1 셀부터 한 줄씩 내용을 출력하는 코드다.

[Do While Not EOF(1)]라는 부분이 있는데, 여기서 1은 파일스트림의 번호를 뜻한다. EOF란 End Of File의 약자로, 파일의 끝을 의미한다.

파일의 끝일 경우, EOF는 true를 리턴한다. 파일의 끝이 아닐 경우, EOF는 false를 리턴한다.

즉 [Do While Not EOF(1)] 는 파일스트림 1이 끝나지 않는 한 계속 도는 루프문이다.

위 코드를 실행하면 아래와 같은 결과를 얻는다.

만약 텍스트 파일의 형식이 UTF-8 이라면 다음 소스코드를 사용하시면 됩니다.

Const CP_UTF8 = 65001
Private Declare Function MultiByteToWideChar Lib “kernel32” (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long


Sub 매크로1()

‘ 매크로1 매크로

‘ 바로 가기 키: Ctrl+k

Call readTextFile

End Sub

Function readTextFile()
    
    On Error GoTo exmsg
    
    MsgBox (“파일읽기 시작”)
    
    ‘파일 경로 지정
    Dim path
    path = “C:\test\test.txt”
    
    Dim utf8() As Byte
    Dim ucs2 As String
    Dim chars As Long
   
    Open path For Binary As #1
    ReDim utf8(LOF(1))
   
    Get #1, , utf8
   
    chars = MultiByteToWideChar(CP_UTF8, 0, VarPtr(utf8(0)), LOF(1), 0, 0)
    ucs2 = Space(chars)
   
    chars = MultiByteToWideChar(CP_UTF8, 0, VarPtr(utf8(0)), LOF(1), StrPtr(ucs2), chars)
    
    Close
    

    ‘엔터를 구분자로 Split 하기
    Dim tArray
    tArray = Split(ucs2 + “”, vbCrLf, , vbTextCompare)
   
    ‘파일 내용 표시
    For i = 0 To UBound(tArray)
        Cells(i + 1, 1).Value = tArray(i) + “”
    Next i

   
    MsgBox (“파일읽기 끝”)
    Exit Function
    
exmsg:
    Close #1
    MsgBox (“Error” & Err.Number & ” : ” & Err.Description)

End Function

이어지는 글 <엑셀VBA 입문 16강> VBA로 워크시트 함수 활용하기 : https://blog.naver.com/bb_/221350410698

이어지는 글 <엑셀VBA 입문 17강> 변수를 같은 이름으로 사용하면 섞일까? (지역변수와 전역변수) :

https://blog.naver.com/bb_/221417490850

이어지는 글 <엑셀VBA 입문 18강> indexOf 함수의 확장 https://blog.naver.com/bb_/221650929713