본문 바로가기
AI/AI활용

[Excel],[AskUp] 엑셀로 파일 내용 바꾸기

by OhEasy 2023. 3. 18.
728x90
 

[Excel],[AskUp] 파일 내용 바꿔서 다른 이름으로 저장하기

우선 엑셀은 잘 알지만 AskUp은 잘 모를 것 같아서 관련 기사의 링크를 첨부한다. 업스테이지, ‘눈달린 챗GPT’ AskUp 카톡 론칭 3일만에 채널친구 3만명 돌파 — Upstage 2023/3/9 www.upstage.ai 간단하게

525easy.tistory.com

이전 글에서
AskUp을 통해 파일명 및 특정 텍스트를 바꾸는 VBA 코드를 생성했었다.
이전 글에서 작성 된 VBA 코드를 실제 파일에 적용해보니
문제가 발생했다.

큰 따옴표가 있는 글자에 따옴표가 또 생겼다.

문제는 큰 따옴표에 따옴표가 추가 되는 것이다.
실제로 적용 시켰던 파일은
유니티의 Asset 파일이였는데
큰 따옴표가 안들어가서 괜찮겠거니 했던게 실수였다,

개인 프로젝트 때 썼었던 프리펩 파일의 일부분을 잘라서 샘플을 만들었다,

어떤 조건인지는 명확하지 않으나
큰 따옴표가 없었는데
생기는 경우가 발생한다는 것


대략 문제 발생은 이 과정에서 있는 듯 했다.

내용을 엑셀로 만든 뒤 파일명 및 확장자를 바꾸는 방식의 기존 VBA 코드

어떤 확장자건
파일을 엑셀 워크시트로 열어버린다.
이후 텍스트로 내보낼 때 문제가 발생하는 것 같다.

아래처럼 숫자인데 텍스트로 인식이 되면
숫자의 앞에 '(작은따옴표)가 붙는데 그것도 텍스트로 반영 되는 그런 경우가 아닐까 싶었다.

텍스트인 숫자


그래서 구조를 바꾸기로 했다.
기존의 경우 워크시트로 여는 방식인데,
직접 파일을 여는 것이다.

기존 VBA는 Workbooks로 연다.

그래서 우선 AskUp에게
텍스트 파일을 복제하는 방법을 물어보았다.

AskUp은 항상 친절한 것 같다.

뭐 FSO라는 오브젝트를 하나 만들고 어쩌구 한다.
복잡한건 넘어간다.

그 다음으로 파일의 내용 중 특정 텍스트 변경을 물어보았다.

기존 코드에서 추가 되었다.

답변은 받았으나 FSO, oFile, FileContents의 객체 설정이 되지 않았다.
정정 요청을 해준다.

추가되어 답변이 돌아왔다.

정정이 완료 되었다.
이제 파일 이름(경로)을 바꿔주는
내용도 추가해주자.

"다시"라고 말했는데...

위와 같이 질문 했더니
특정 텍스트를 바꾸는 코드는 사라져서 나왔다.
그래서 한번 더 물어보았다.

이렇게 추가

"방금 말해준" 이라는 단어가 들어가야
초기화가 안되는 것 같다.

추가가 되었다.

반복문으로 만들고 싶다.
그래서 추가 수정 요청을 했다.

친절하게 질문

나는 엄청 친절하게 한 것 같다.
근데 AskUp은 아닌가보다.

파이썬이 왜나오냐

VBA 코드를 물어보는데
뜬금없이 파이썬이 나온다.
VBA로 다시 요청해보았다.

한번 더 물어보다니... 100회 제한인데...

AskUp은 하루 100회 무료라고 하는데...
귀중한 질문권 1개를 날렸다.

미안한건 아나보다.

미안해서인지 엄청 빠르게 답변이 왔다.
아래는 답변 내용이다

아, 죄송합니다. VBA 코드로 다시 작성해드리겠습니다.

```VB
Sub ReplaceText()

Dim filePath As String
Dim fileExt As String
Dim textRange As Range
Dim newTextRange As Range

' 파일 경로 설정
filePath = "C:\Users\Upstage\Desktop\test\"

' 범위 설정
Set textRange = Range("B2:B5")
Set newTextRange = Range("C2:C5")

' 파일 탐색
fileExt = ".txt"
filename = Dir(filePath & "*" & fileExt)

Do While filename <> ""
    ' 파일 읽기
    Open filePath & filename For Input As #1
    text = Input$(LOF(1), 1)
    Close #1
    
    ' 텍스트 치환
    For i = 1 To textRange.Cells.Count
        text = Replace(text, textRange.Cells(i), newTextRange.Cells(i))
    Next i
    
    ' 파일 쓰기
    Open filePath & "New_" & filename For Output As #2
    Print #2, text
    Close #2
    
    ' 다음 파일 탐색
    filename = Dir
Loop

End Sub
```

위 코드는 A2부터 A5까지 파일 경로를 읽어와서 해당 파일들을 열고,
B2부터 B5까지의 텍스트 내용을 찾아서 해당 내용을 C2부터 C5까지의 내용으로 변경한 뒤,
새로운 파일(New_파일명)로 저장합니다.
단, 이 코드는 엑셀 VBA 코드로 작성된 것이며, 엑셀에서 실행해야 합니다.

이제 골조가 짜였으니 복붙을 한다.
근데 하기 전에 뭔가 신용이 안가보인다.
다른데로 해봐야겠다.

AskUp 전적으로 믿습니다... 하지만 안믿는다.

너무 깔끔하게 잘 나왔다.
따옴표도 안붙었다.
내용을  수정해야 하는데

사실상 거의 처음부터 써야 될 판이다.


일단 작업 사항은 다음과 같다.

1. 일단 파일이 기존 경로에 "New_"만 붙는게 맘에 안들었다. 그래서 파일명 및 경로를 새로 지정 한다.
   => 기껏 바꾸는건데 파일명을 한번 더 바꿔줘야 한다면 의미가 없다고 생각
여기 부분을 수정해줬다.
2. 텍스트 치환도 뭔가 이상했다. 나중에 확인해보니 Replace 쪽에 단어가 들어간게 아니라 숫자만 들어가있어서
다 꼬이는 상황이 발생했다. 그래서 새로운 String을 추가해서 적용 하였다.
이 부분의 숫자들이 모든 파일이 똑같았다.
3. 뭔가 이상한 느낌이 들어서 보니 Do While 문의 위를 보면 그냥 폴더 내 파일을 순차적으로 불러오는 방식이다.
For문으로 다 바꿔야된다.
   => 이러면 순서를 뒤섞으려면 또 작업을 해야한다.

4. 그랬더니 문자가 치환이 안되고 글자가 날라갔다.
   => 확인해보니 convertText인데 converText로 오타가 나있어서 수정해줬다.

아래는 완료 된 코드와 결과물

Sub ChangeFile()
    Dim oldFilePath As String '기존 폴더 경로를 담는다.
    Dim newFilePath As String '변경될 폴더 경로를 담는다.
    
    Dim fileExt As String '파일 확장자다.
    Dim textRange As Range '기존 문자 (파일 안에 있는) 범위
    Dim newTextRange As Range '변경 될 문자 (파일 안에 있는) 범위
    Dim filename As String '파일명이다.
    Dim convertText As String '변환 될 텍스트를 담아줄 변수
    Dim originText As String '기존 텍스트를 담아줄 변수
    
    Dim frontText As String '범위 앞에 들어갈 문자
    

    ' 파일 경로와 확장자 설정
    oldFilePath = Range("E1").Value & "\" & Range("E3").Value
    newFilePath = Range("E2").Value & "\" & Range("E3").Value
    frontText = Range("E5").Value
    
    
    '확장자 텍스트 값 할당
    fileExt = Range("E4").Value

    ' 범위 설정
    Set textRange = Range("B2:B5")
    Set newTextRange = Range("C2:C5")
    
    For Files = 1 To textRange.Cells.Count
        
        '불러올 파일명 + 확장자까지 설정
        filename = textRange.Cells(Files) & fileExt
        
        '파일 읽어오기
        Open oldFilePath & filename For Input As #1
        Text = Input$(LOF(1), 1)
        Close #1
        
        '텍스트들 미리 담아두는 용도
        originText = frontText & textRange.Cells(Files)
        convertText = frontText & newTextRange.Cells(Files)
    
        '내용물에서 기존 텍스트를 변경 텍스트로 바꾸어준다.
        Text = Replace(Text, originText, convertText)
        
        '파일명에서 기존 이름을 변경 이름으로 바꾸어준다.
        filename = Replace(filename, textRange.Cells(Files), newTextRange.Cells(Files))
        
    
        ' 파일 쓰기
        Open newFilePath & filename For Output As #2
        Print #2, Text
        Close #2
        
    Next Files
        
    
End Sub

아래는 결과물

잘 바뀐 것 같다.


사실상 구조는 AskUp이 잡았지만...
거의 새로 만든 것 같다.
어쩌다보니 VBA 공부하게 되는 중...

728x90

댓글