EXCEL - VBA

ChatGPT를 이용해서 VBA 코드 짜기(2)

별동산 2024. 3. 21. 08:21
반응형

1편은 여기를 클릭하면 됩니다.

 

(3) 텍스트 파일에 특정 단어를 연결해서 표시하는 VBA 코드 검색

"텍스트 파일에 특정 단어를 연결해서 표시하는 VBA 코드"라고 했더니

아래와 같이 결과가 나왔는데, 줄별로 연결하는 부분이 빠져 있습니다.

 

이 때는 당신이라고 표시된 아래의 대화 내용에 커서를 갖다 대면 없던 연필이 표시되므로 연필을 클릭합니다.

 

그리고, 아래와 같이 " 텍스트 파일에 특정 단어를 줄별로 연결하는 VBA 코드"라고 수정한 후 '저장 및 제출' 버튼을 누릅니다.

 

그러면 줄별로 단어를 연결하는 코드만 보여줘야 하는데,

어제 학습을 해서 그런건지, 아니면 이전 질문과 연결해서 답을 만든 것인지

폴더를 선택할 수 있는 창을 여는 코드와 특정 단어를 연결하는 코드가 함께 결과로 나옵니다.

 

Copy code로 내용을 살펴보면 아래와 같은데,

Sub MergeWordsInTextFiles()
    Dim folderPath As String
    Dim fileName As String
    Dim mergedFilePath As String
    Dim fileContent As String
    Dim mergedContent As String
    Dim fileNumber As Integer
    Dim wordToMerge As String
    
    ' 폴더 선택 대화상자 표시
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "폴더 선택"
        If .Show = -1 Then
            folderPath = .SelectedItems(1)
        Else
            MsgBox "폴더 선택이 취소되었습니다."
            Exit Sub
        End If
    End With
    
    ' 특정 단어 입력 받기
    wordToMerge = InputBox("어떤 단어를 줄별로 연결할까요?", "단어 입력", "단어")
    
    ' 새로운 파일 생성
    mergedFilePath = folderPath & "\MergedFile.txt"
    fileNumber = FreeFile
    Open mergedFilePath For Output As fileNumber
    
    ' 폴더 내의 모든 텍스트 파일에 대해 반복
    fileName = Dir(folderPath & "\*.txt")
    Do While fileName <> ""
        ' 텍스트 파일 열기
        Open folderPath & "\" & fileName For Input As #fileNumber
        Do Until EOF(fileNumber)
            Line Input #fileNumber, fileContent
            ' 특정 단어를 줄별로 연결
            mergedContent = mergedContent & fileContent & wordToMerge & vbCrLf
        Loop
        Close #fileNumber
        ' 다음 텍스트 파일로 이동
        fileName = Dir
    Loop
    
    ' 새로운 파일에 내용 쓰기
    Print #fileNumber, mergedContent
    
    ' 파일 닫기
    Close #fileNumber
    
    MsgBox "텍스트 파일이 성공적으로 병합되었습니다. 위치: " & mergedFilePath
End Sub

 

 

주석도 잘 되어 있어서 단계를 적어보면

폴더 선택 대화상자 표시,

특정 단어 입력 받기,

새로운 파일 생성,

폴더 내의 모든 텍스트 파일에 대해 반복,
텍스트 파일 열기,
특정 단어를 줄별로 연결,
다음 텍스트 파일로 이동,
새로운 파일에 내용 쓰기,
파일 닫기,

완료 메시지 출력 

순으로 정확합니다.

 

기존 코드를 선택한 후 ChatGPT의 새로운 코드로 덮어 씌웁니다.

 

 

다른 것은 다 맞는데,

특정 단어를 입력받는 것이 아니라, 파일명에서 발췌할 것이므로 이 부분만 수정하면 됩니다.

 

(현재)

특정 단어를 입력받으면 그것을 모든 텍스트 파일에 동일하게 추가함

    ' 특정 단어 입력 받기
    wordToMerge = InputBox("어떤 단어를 줄별로 연결할까요?", "단어 입력", "단어")
    
    ' 새로운 파일 생성
    mergedFilePath = folderPath & "\MergedFile.txt"
    fileNumber = FreeFile
    Open mergedFilePath For Output As fileNumber
    
    ' 폴더 내의 모든 텍스트 파일에 대해 반복
    fileName = Dir(folderPath & "\*.txt")
    Do While fileName <> ""

 

(수정)

While 문안에서 fileName을 기준으로 4번째부터 10개의 문자를 가져올 것입니다.

 

파일명 : RT.ZD12345678.20240312.B.txt

가져올 문자열 ZD12345678

수식 : mid(fileName,4,10)

 

수정된 코드는 아래와 wordToMerge를 가져오는 부분을 '새로운 파일 생성'위에서 While문 안으로 가져오고,

Mid 함수를 이용해 수식을 작성한 것입니다.

    ' 새로운 파일 생성
    mergedFilePath = folderPath & "\MergedFile.txt"
    fileNumber = FreeFile
    Open mergedFilePath For Output As fileNumber
    
    ' 폴더 내의 모든 텍스트 파일에 대해 반복
    fileName = Dir(folderPath & "\*.txt")
    Do While fileName <> ""
        ' 특정 단어 추출하기
        wordToMerge = Mid(fileName, 4, 10)

 

 

파일 내 모든 텍스트 파일에 대해 반복하지만,

새롭게 생성될 파일 MergedFile.txt는 

Open mergedFilePath For Output As fileNumber로 생성될 때 초기화되어

Do Until EOF(fileNumber)안으로 들어갈 수 없으므로

특정단어를 줄별로 연결하는 작업에서 제외됩니다.

 

(3) 실행

아래와 같이 중단점을 설정하고,

실행한 후 txt 파일이 있는 폴더를 선택하면 

 

위 중단점에서 멈추는데, 지역창(안보이면 보기 - 지역 창 클릭)에서 변수를 살펴보면

wordToMerge가 "gedFile.tx"로 표시됩니다.

filelName인 MergedFile.txt에서 4번째부터 10개를 가져와서 그렇습니다.

 

 

F5키를 눌러 다시 실행하면

 

'파일이 이미 열려있습니다'란 에러 메시지가 표시되는데,

이것은 위에서 Open mergedFilePath로 해서 mergedFilePath를 열었는데,

Open folderPath & "\" & fileName으로 같은 MergedFile.txt를 다시 열어서 그런 것입니다.

 

따라서 윗 부분의

Open mergedFilePath For Output As fileNumber를

Set outputFile = fso.CreateTextFile(mergedFilePath, True)로 수정하는데,

fso와 outputFile  변수 선언이 없으므로 모두 Object 형식으로 선언한 다음

Set fso = CreateObject("Scripting.FileSystemObject")라고 fso를 설정하는 부분을 추가해야 합니다.

 

또한 "새로운 파일에 내용 쓰는 부분"인

Print #fileNumber, mergedContent이 while 문 밖에 있는데,

 

while문 안으로 들여 놓은 다음

outputFile.WriteLine mergedContent라고 수정합니다.

 

이렇게 ChatGPT가 제시한 코드중 잘못된 부분은 찾아서 수정해야 합니다.

 

그리고 F5키 또는 오른쪽 세모 아이콘을 누르면

지역 창에 wordToMerge 변수가 ZD12345678로 표시됩니다.

 

계속 실행 아이콘을 눌러 실행하던가

중단점을 지운 다음 실행하면

'텍스트 파일이 성공적으로 병합되었습니다."라고 합니다.

 

 

위 텍스트 파일을 열어보면 ZD로 된 부분이 앞에 있어야 하는데 뒤에 있고,

내용이 없을 때도 ZD12345678이 추가되는 문제점이 있으므로

 

mergedContent = mergedContent & fileContent  & wordToMerge & vbCrLf라는 부분에서

fileContent와 wordToMerge의 순서를 바꿔서

mergedContent = mergedContent & wordToMerge &  vbCrLf로 만들고,

 

fileContent의 내용이 있을 때만 처리하도록

if len(fileContent) then을 추가합니다.

 

그래도 첫 줄의 공백은 지워지지 않는 문제점이 있으므로 아래와 같이 수정해야 합니다.

        Do Until EOF(fileNumber)
            Line Input #fileNumber, fileContent
            ' 특정 단어를 줄별로 연결
'            If Len(fileContent) Then mergedContent = mergedContent & wordToMerge & fileContent & vbCrLf
            If Len(fileContent) Then
                mergedContent = wordToMerge & fileContent
            Else
                mergedContent = ""
            End If
            
            ' 새로운 파일에 내용 쓰기
            outputFile.WriteLine mergedContent
        Loop

 

ChatGPT가 많은 도움을 주기는 하지만,

여전히 잘못된 부분을 수정해서 바로 잡을 수 있는 능력과

원하는 답을 얻을 수 있도록 정확하게 질문하는 능력이 필요합니다.

 

그리고, 병합 파일명이 고정인데,

B2셀에 최종 파일명을 입력한 후 이를 코드에 반영하면

 

mergedFilePath = folderPath & "\" & Range("b2")

이 됩니다.

mergeTextFile.xlsm
0.02MB

반응형