글목록

2021년 4월 5일

Module 1. 파일명 일괄 변경 매크로 (1)

대량의 파일명을 변경하는 유틸리티는 많이 있습니다. 여러가지 규칙들을 가지고 자동으로 변경할 수 있어서 종종 사용하곤 합니다. 그런데, 이러한 유틸리티는 파일명을 내 마음대로 바꾸는데 약간 한계가 있습니다.

엑셀은 사용법이 조금만 익숙해지더면, 셀 내의 값을 자유롭게 배열할 수 있고, 규칙적인 숫자, 문자열 등을 생성하는데 매우 유용한 도구입니다. 파일명을 불러오고, 변경할 파일명을 자유롭게 구성한 후 일괄적으로 파일명을 바꿀 수 있다면, 매우 훌륭한 파일명 변경 유틸로 활용할 수 있을 것입니다.

저는 수십개의 데이터 파일이나 사진 파일을 보관할 때, 어떤 자료인지 파일명으로 간단하게 기록해두는 습관이 있습니다. 예를 들면, 디지털카메라로 찍은 사진은 파일명이 'XXX####.jpg'와 같이 일련번호로만 나오는데, 파일명을 일괄적으로 '날짜_시료명_간단한메모_일련번호.jpg' 와 같이 해두면 다음에 파일명만 보고 대략 어떤 사진을 열어봐야할지 금방 알 수 있기 때문이지요. 이렇게 정리하기 위해 별도의 유틸리티를 사용할 수도 있지만, 제 마음대로 새로운 파일명을 만드는 게 쉽지 않았습니다. 어차피 업무 중 엑셀은 항상 사용하고 있으니, 이러한 파일명 변경 매크로를 만들어두면 유용할 것 같아서 작성해보았습니다.

우선 파일명을 변경하기 위해서는 파일 목록을 만들어야 합니다.

윈도우 탐색기의 원하는 폴더에서 Drag/Drop으로 끌어올 수 있으면 좋겠지만, 엑셀에서 그렇게 하면 무수히 많은 파일을 엑셀에 삽입해버리거나 파일을 열어버리는 상황이 발생해버립니다. 따라서, 엑셀의 파일열기 창을 활용해서 목록을 만들어보겠습니다.


우선 파일명 작업을 쉽게 할 수 있도록, VBA 편집기의 메뉴에서 '도구 > 참조'로 들어가셔서

Microsoft Scripting Runtime

을 찾아서 체크해주시기 바랍니다. 이렇게 해두면, FileSystemObject라는 Object를 사용할 수 있습니다.


Sub GetFileList()
  On Error GoTo ErrorHandler
  Dim tSh As Worksheet, tFN(), tSplit, tFSO As New FileSystemObject, tStr As String, tFNExt As String, tSN As Long
  tFN = Application.GetOpenFilename(MultiSelect:=True)
  tSN = 4
  If UBound(tFN) > 0 Then
    Set tSh = ActiveWorkbook.Worksheets.Add(After:=ActiveSheet)
    tSh.Cells(1, 1).Value = "경로 : "
    tSh.Cells(tSN, 1).Value = "원본 파일명"
    tSh.Cells(tSN, 2).Value = "원본 확장자"
    tSh.Cells(tSN, 3).Value = "새 파일명"
    tSh.Cells(tSN, 4).Value = "새 확장자"
    tSh.Cells(tSN, 5).Value = "진행상태"
    For i = 1 To UBound(tFN)
      tStr = tFSO.GetFile(tFN(i)).Name
      tSh.Cells(i + tSN, 1).NumberFormatLocal = "@"
      tSh.Cells(i + tSN, 2).NumberFormatLocal = "@"
      If InStr(tStr, ".") > 0 Then
        tSplit = Split(tStr, ".")
        tFNExt = tSplit(UBound(tSplit))
        tSh.Cells(i + tSN, 1).Value = Left(tStr, Len(tStr) - Len(tFNExt) - 1)
        tSh.Cells(i + tSN, 2).Value = tFNExt
        tSh.Cells(i + tSN, 3).Value = tSh.Cells(i + tSN, 1).Value
        tSh.Cells(i + tSN, 4).Value = tFNExt
      Else
        tSh.Cells(i + tSN, 1).Value = tStr
      End If
    Next
    tSh.Range(tSh.Cells(1, 1), tSh.Cells(1, 5)).EntireColumn.AutoFit
    With tSh.Cells(1, 2)
      .Value = tFSO.GetFile(tFN(1)).ParentFolder.Path
      If Right(.Value, 1) <> "\" Then .Value = .Value & "\"
    End With
    With tSh.Cells(2, 1)
      .Value = "※원본 파일명과 경로를 변경하지마세요. 새 파일명/확장자는 각각 C, D 열에만 입력하세요. A~D열 이외의 데이터는 작업에 영향을 주지 않습니다."
      .Font.Color = RGB(0, 0, 255)
      .Font.Bold = True
    End With
    tSh.Range(tSh.Cells(tSN, 1), tSh.Cells(tSN, 5)).Font.Bold = True
    tSh.Range(tSh.Cells(tSN + 1, 3), tSh.Cells(tSN + UBound(tFN), 3)).Select
  End If
ErrorHandler:
  Erase tFN
  Err.Clear
End Sub


선택된 폴더의 여러 파일을 선택하면, 새로운 시트를 하나 생성하고, 선택된 파일의 파일명과 확장자로 나누어 목록을 만들어줍니다. VBA 편집기 모듈에 복사하신 후 실행을 시켜보면 간단하게 결과를 확인하실 수 있습니다.

원본 파일명과 확장자는 A, B열에 목록을 만들고, 새파일명 셀인 C, D 열에도 원본 파일명일 일단은 넣어줍니다. C, D열은 사용자가 새로운 파일명으로 변경할 곳입니다. E 열은 다음에 소개드릴 파일명 변경 작업시 진행 사항을 표시하기 위해 만든 열입니다.




만약 실행시 오류가 뜬다면, 참조에 Scripting Runtime을 추가하셨는지 다시 한번 확인해보시기 바랍니다.

다음 편에는 이렇게 만들어진 원본/변경 파일명 목록을 이용하여 일괄적으로 파일명을 변경하는 매크로를 추가하도록 하겠습니다.

댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :