본문 바로가기
AI/AI활용

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

by OhEasy 2023. 3. 15.
728x90

우선 엑셀은 잘 알지만
AskUp은 잘 모를 것 같아서 관련 기사의 링크를 첨부한다.

 

업스테이지, ‘눈달린 챗GPT’ AskUp 카톡 론칭 3일만에 채널친구 3만명 돌파 — Upstage

2023/3/9

www.upstage.ai

간단하게 말 하면 ChatGPT를 카톡으로도 할 수 있는 그런 것


우선 개요를 설명하자면

특정 파일들을 복제 하고 싶은데
그 파일 중 한 부분의 내용을 수정해야 한다.
수정을 한 뒤에는 다른 이름들로 지정된 경로로 저장을 시켜야 한다.

아무리 생각해도
파일 목록들은 엑셀에 쓰는 것이 편할 것 같다.
근데 VBA는 모른다.

그렇기 때문에 AskUp에게
이것을 VBA코드로 짜달라 한다. 


일단 복제할 파일들을 보자.

좌측은 샘플 파일 4개, 우측은 파일 내용

우선 파일의 이름들은 일정한 규칙을 가지고 있다.
Test_ + 숫자 + 파일 형식 (여기서는 .asset)의 규칙성을 가진다.
각각의 파일들은 [ FileName = 숫자 ]에서 숫자만 바꿔주었다.
이때 파일 이름에 들어가는 숫자와 내용 중 FileName에 들어가는 숫자는 동일하다.

그 다음의 엑셀 시트를 보자면

디자인은 안했다.

A열에는 2행부터
원본 파일들의 숫자를 입력하는 공간이다.

B열은 2행부터
변환 될 파일들의 숫자를 입력하는 공간이다. 

D열에는 설명들을 입력하는 공간이고,
D열에 해당하는 내용은 E열에 입력 하는 공간이다.

F열의 [선택] 버튼 두개는 경로를 불러오는 버튼이고
각각 E1, E2셀에 경로가 입력 되는 공간이다.

H열에 있는 큰 단추라 적힌 버튼은 전체 메크로를 실행 시킬 버튼

어느정도의 준비가 마무리 되었다.

이제 AskUp을 시작한다.

우선 폴더 경로를 반환하는 코드를 물어보았다.

음... 뭔가 내용이 길다.

VBA에서는 FileDialog라는 기능을 이용하여 파일 또는 폴더를 선택할 수 있습니다.
아래의 코드를 사용하면 버튼 클릭 시 폴더 선택 대화상자가 뜨고,
선택한 폴더의 위치가 E1셀에 입력됩니다.

```VBA
Sub SelectFolder()
    Dim fDialog As FileDialog
    Dim selectedFolder As String
    
    Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
    fDialog.AllowMultiSelect = False
    fDialog.Title = "폴더 선택"
    
    If fDialog.Show = -1 Then
        selectedFolder = fDialog.SelectedItems(1)
        Range("E1").Value = selectedFolder
    End If
End Sub
```

위 코드에서는 `Sub SelectFolder()`라는 서브루틴을 만들고,
이 서브루틴을 호출하는 버튼을 만들어야 합니다.
버튼 클릭 시, `FileDialog`을 이용하여 폴더를 선택할 수 있는 대화상자가 열리게 됩니다.
사용자가 폴더를 선택하면, 선택한 폴더 경로가 E1셀에 입력됩니다. 

단, 위 코드를 사용하기 위해서는
Microsoft Office의 참조 라이브러리에 "Microsoft Office 16.0 Object Library"
(혹은 사용하는 Office 버전에 맞는 라이브러리)를 추가해야 합니다.
그리고 E1셀에 값을 입력하기 전에 해당 셀이 활성화되어 있는지 확인해야 합니다.

뭔가 긴 답변이 왔는데 생각보다 답변 시간이 짧았다.

버튼에 그대로 넣어줬다.

버튼에 AskUp이 한 답변을 그대로 넣어 주었다.

일단 브라우저도 잘 열린다.

original 폴더를 선택하고 확인을 누르면

잘 들어갔다.

변환 되어 저장 될 경로인 E2셀은 같은 내용이기에
위 코드에서
Range("E1") 부분만 Range("E2")로 바꿔 주었다.

이제 내용을 바꿀 부분이다.

최대한 자세하게 물어보자. 안그러면 이상한 답변을 내놓는다.

대략
파일의 이름 형식이 어디에 있고,
그 파일들의 상위 폴더의 경로가 입력 된 셀,
어떤 텍스트가 어떤 텍스트로 바뀔 지 등을
최대한 자세하게 작성해서 물어보았다.

아래는 요구사항에 맞게 작성된 VBA 코드입니다.
코드를 실행하기 전에 파일 경로 및 셀 참조를 적절히 수정해주시기 바랍니다.

```vba
Sub fileRenameAndSave()

Dim rng As Range
Dim oldFilePath As String, newFilePath As String, fileName As String
Dim i As Integer

' 파일 이름에 들어갈 숫자 범위 지정
Set rng = Range("A2:A5")

' 각 파일별로 작업 수행
For i = 1 To rng.Count
    ' 파일 경로 및 이름 설정
    oldFilePath = Range("E1").Value & "\" & Range("E3").Value & rng.Cells(i).Value & Range("E4").Value
    newFilePath = Range("E2").Value & Range("B" & i).Value & Range("E4").Value
    
    ' 파일 열기
    Workbooks.Open Filename:=oldFilePath
    
    ' 특정 텍스트 변경
    Cells.Replace What:=Range("E5").Value & rng.Cells(i).Value, Replacement:=Range("E5").Value & Range("B" & i).Value, LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    ' 파일 이름 변경 및 다른 경로에 저장
    fileName = Range("E5").Value & Range("B" & i).Value & Range("E4").Value
    ActiveWorkbook.SaveAs Filename:=newFilePath & fileName
    
    ' 파일 닫기
    ActiveWorkbook.Close SaveChanges:=False
Next i

End Sub
```

위 코드를 실행하면 A2에서 A5까지의 파일들을 열고,
각 파일의 내용에서 E5값과 A2에서 A5까지의 값을 찾아 
E5값과 B2에서 B5까지의 값으로 변경한 후, 
새로운 파일 이름을 E5값과 B2에서 B5까지의 값으로 변경하고 
E2값과 B2에서 B5까지의 값을 이용해 새로운 경로에 저장합니다.

바로 코드를 복사해서 붙여넣어 봤다.

붙여 넣고 돌려보니

일단 이름도 이상하고 경로도 이상하다.

경로는 conversion 폴더로 지정해주었으나
해당 폴더에 들어가있지 않고,
이름도 뭔가 이상하다.
이상한 느낌이 들어 파일을 열어보았더니

값이 많이 빠졌다.

일단 FileName의 숫자가 사라졌고,
Data의 2도 사라져있다.
해당 원본 파일이 Test_"2"였는데...
2가 다 사라졌다.

다시 VBA 코드를 봐보았다.

For i = 1 To rng.Count
    ' 파일 경로 및 이름 설정
    oldFilePath = Range("E1").Value & "\" & Range("E3").Value & rng.Cells(i).Value & Range("E4").Value
    newFilePath = Range("E2").Value & Range("B" & i).Value & Range("E4").Value

여기를 보면 For문의 i는 1부터 시작인데
변환 된 파일의 숫자는 2행부터 시작이다.
일단 Range( "B" & i ) 부분을 Range( "B" & i + 1 )로 바꿔준다.

그 다음은 2가 왜 사라졌나를 찾아야 한다.

Cells.Replace What:=Range("E5").Value & rng.Cells(i).Value, Replacement:=Range("E5").Value & Range("B" & i).Value, LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

함수 내 LookAt := xlPart 라는 부분이 보인다.
LookAt은 텍스트를
부분일치( xlPart )로 찾을 것인지,
완전 일치( xlWhole )로 찾을 것인지
설정하는 곳이다.

 

XlLookAt enumeration (Excel)

Office VBA reference topic

learn.microsoft.com

[ FileName = 숫자 ]라고 딱 정해놨기 때문에
완전 일치로 바꿔준다.

그리고 복제 된 파일의 경로인 newFilePath가 이상하게 설정이 되어 있어서
그 내용도 바꿔주었다.

전부 바꿔준 뒤 돌렸는데

FileName이 바뀌지 않았다.

잘 변환 된 것을 확인할 수 없었다.
왜 안되나 생각하다가
for문 안에서 문자를 여러 개 불러오면 제대로 안나온다.
그래서 선언을 해줘야 한다고 했던
어디선가의 기억이 났다.

그래서

문자를 두개 추가했다.

원본(바꿔줄) 텍스트를 originText로,
변환 될 텍스트를 changeText로 새로 정의 해주었다.
아래는 최종 코드다.

Sub ChangeFile()
Dim rng As Range
Dim oldFilePath As String, newFilePath As String, fileName As String
Dim i As Integer
Dim originText As String
Dim changeText As String

' 파일 이름에 들어갈 숫자 범위 지정
Set rng = Range("A2:A5")


' 각 파일별로 작업 수행
For i = 1 To rng.Count
    ' 파일 경로 및 이름 설정
    originText = Range("E5").Value & rng.Cells(i).Value
    changeText = Range("E5").Value & Range("B" & i + 1).Value
    oldFilePath = Range("E1").Value & "\" & Range("E3").Value & rng.Cells(i).Value & Range("E4").Value
    newFilePath = Range("E2").Value & "\" & Range("E3").Value & Range("B" & i + 1).Value & Range("E4").Value
    
    ' 파일 열기
    Workbooks.Open fileName:=oldFilePath
    
    ' 특정 텍스트 변경
    
    MsgBox (originText)
    
    Cells.Replace What:=originText, Replacement:=changeText, LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    ' 파일 이름 변경 및 다른 경로에 저장
    fileName = Range("E5").Value & Range("B" & i + 1).Value & Range("E4").Value
    ActiveWorkbook.SaveAs fileName:=newFilePath & fileName
    
    ' 파일 닫기
    ActiveWorkbook.Close SaveChanges:=False
Next i

End Sub

변환 후 돌려보니

드디어 되었다.

잘 바뀐 것을 확인할 수 있었다.

728x90

댓글