Rename file trong folder and sub folder khi có đường dẫn

Liên hệ QC

Datcdt2k9

Thành viên hoạt động
Tham gia
27/12/19
Bài viết
109
Được thích
11
Em có list danh sách rất nhiều file cần thay đổi tên, các file từ các thư mục khác nhau , có đường dẫn tới file đó
Mong mọi người giúp em đổi tên tất cả các file này ạ. Em cảm ơn

1610633874221.png
 

File đính kèm

  • rename file in folder and subfolder khi có đường dẫn.xlsm
    8.4 KB · Đọc: 17
Mình làm quá tay rồi.

1610637677019.png

Nếu tên mới trùng với tên file đã có thì mình tính sao?
 
Mình làm quá tay rồi.

View attachment 252980

Nếu tên mới trùng với tên file đã có thì mình tính

Mình làm quá tay rồi.

View attachment 252980

Nếu tên mới trùng với tên file đã có thì mình tính sao?
Mục đích mình cần là đổi tên file khi có đường link cụ thể, trên chỉ là ví dụ minh họa nên có sai xót, mong lượng thứ ạ, ngại quá, coi như 2 dòng kia mình viết sai bạn giúp mình hoàn thành theo ý của mình nhé
 
Em có list danh sách rất nhiều file cần thay đổi tên, các file từ các thư mục khác nhau , có đường dẫn tới file đó
Mong mọi người giúp em đổi tên tất cả các file này ạ. Em cảm ơn

View attachment 252977
1. Con người không phải là máy nên nhiều khi nhầm lẫn. Vì thế tôi qui định là cột C chỉ chứa tên mới không có định dạng. Cột B phải chứa tên cũ cùng định dạng, vì thiếu định dạng thì không biết phải đổi tên tập tin nào (vd. có abc.txt, abc.jpg, abc.xlsx ...). Cột C chỉ chứa tên mới, còn định dạng y như ở cột B. Vd. B2 = 6.jpg, C2 = anh01 (không được phép có định dạng .jpg)

2. Code chỉ đổi tên khi tên mới <> tên cũ. Tức nếu B2 = abc.txt, C2 = abc thì code không làm gì.

3. Nếu tên mới cùng định dạng đã tồn tại trong thư mục thì tên mới sẽ được chèn thêm "_1", "_2", ... cho tới khi tên mới không tồn tại trong thư mục.

4. Mở tập tin -> Alt + F11 -> trong VBE chọn menu Insert -> Module ... -> dán code sau vào Module1.
Mã:
Sub RenameFiles()
Dim lastRow As Long, r As Long, chiso As Long, path As String, old_name As String, new_name As String, ext As String, fso As Object, dulieu()
    With ThisWorkbook.Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        If lastRow < 2 Then Exit Sub    ' khong co du lieu thi nghi choi
        dulieu = .Range("A2:C" & lastRow).Value ' cho du lieu vao mang dulieu
    End With
    Set fso = CreateObject("Scripting.FileSystemObject")    ' tao doi tuong FileSystemObject
    For r = 1 To UBound(dulieu, 1)  ' duyet mang dulieu bao gio cung nhanh hon duyet tung o tren sheet
        path = dulieu(r, 1) ' duong dan toi thu muc hien hanh
        If Right(path, 1) <> "\" Then path = path & "\"
        old_name = dulieu(r, 2) ' ten cu
        If fso.FileExists(path & old_name) Then ' chi thao tac khi tap tin cu dang ton tai. Dung phuong thuc FileExists cua doi tuong fso kiem tra su ton tai
            ext = Mid(old_name, InStrRev(old_name, "."))    ' dinh dang cua tap tin cu
            new_name = dulieu(r, 3) & ext     ' ten moi co dinh dang giong ten cu
            If new_name <> old_name Then    ' chi doi ten khi ten moi khac ten cu
                If fso.FileExists(path & new_name) Then ' neu ten moi da ton tai thi ...
                    chiso = 1
                    new_name = dulieu(r, 3) & "_1" & ext   ' them "_1"
                    Do While fso.FileExists(path & new_name)    ' neu ton tai ten voi "_1", "_2", ... thi tang chiso
                        chiso = chiso + 1
                        new_name = dulieu(r, 3) & "_" & chiso & ext
                    Loop
                End If
                fso.MoveFile path & old_name, path & new_name   ' doi ten cu thanh ten moi
            End If
        End If
    Next r
    Set fso = Nothing
End Sub
Trong code trên thay "Sheet1" bằng tên sheet của mình.

5. Đặt trên sheet 1 Button: menu Developer -> menu Insert -> Button từ "Form Controls" -> trong cửa sổ nhẩy ra chọn macro RenameFiles

Tôi chú thích từng dòng code, hãy đọc kỹ để hiểu.
 
1. Con người không phải là máy nên nhiều khi nhầm lẫn. Vì thế tôi qui định là cột C chỉ chứa tên mới không có định dạng. Cột B phải chứa tên cũ cùng định dạng, vì thiếu định dạng thì không biết phải đổi tên tập tin nào (vd. có abc.txt, abc.jpg, abc.xlsx ...). Cột C chỉ chứa tên mới, còn định dạng y như ở cột B. Vd. B2 = 6.jpg, C2 = anh01 (không được phép có định dạng .jpg)

2. Code chỉ đổi tên khi tên mới <> tên cũ. Tức nếu B2 = abc.txt, C2 = abc thì code không làm gì.

3. Nếu tên mới cùng định dạng đã tồn tại trong thư mục thì tên mới sẽ được chèn thêm "_1", "_2", ... cho tới khi tên mới không tồn tại trong thư mục.

4. Mở tập tin -> Alt + F11 -> trong VBE chọn menu Insert -> Module ... -> dán code sau vào Module1.
Mã:
Sub RenameFiles()
Dim lastRow As Long, r As Long, chiso As Long, path As String, old_name As String, new_name As String, ext As String, fso As Object, dulieu()
    With ThisWorkbook.Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        If lastRow < 2 Then Exit Sub    ' khong co du lieu thi nghi choi
        dulieu = .Range("A2:C" & lastRow).Value ' cho du lieu vao mang dulieu
    End With
    Set fso = CreateObject("Scripting.FileSystemObject")    ' tao doi tuong FileSystemObject
    For r = 1 To UBound(dulieu, 1)  ' duyet mang dulieu bao gio cung nhanh hon duyet tung o tren sheet
        path = dulieu(r, 1) ' duong dan toi thu muc hien hanh
        If Right(path, 1) <> "\" Then path = path & "\"
        old_name = dulieu(r, 2) ' ten cu
        If fso.FileExists(path & old_name) Then ' chi thao tac khi tap tin cu dang ton tai. Dung phuong thuc FileExists cua doi tuong fso kiem tra su ton tai
            ext = Mid(old_name, InStrRev(old_name, "."))    ' dinh dang cua tap tin cu
            new_name = dulieu(r, 3) & ext     ' ten moi co dinh dang giong ten cu
            If new_name <> old_name Then    ' chi doi ten khi ten moi khac ten cu
                If fso.FileExists(path & new_name) Then ' neu ten moi da ton tai thi ...
                    chiso = 1
                    new_name = dulieu(r, 3) & "_1" & ext   ' them "_1"
                    Do While fso.FileExists(path & new_name)    ' neu ton tai ten voi "_1", "_2", ... thi tang chiso
                        chiso = chiso + 1
                        new_name = dulieu(r, 3) & "_" & chiso & ext
                    Loop
                End If
                fso.MoveFile path & old_name, path & new_name   ' doi ten cu thanh ten moi
            End If
        End If
    Next r
    Set fso = Nothing
End Sub
Trong code trên thay "Sheet1" bằng tên sheet của mình.

5. Đặt trên sheet 1 Button: menu Developer -> menu Insert -> Button từ "Form Controls" -> trong cửa sổ nhẩy ra chọn macro RenameFiles

Tôi chú thích từng dòng code, hãy đọc kỹ để hiểu.
Vâng, em cảm ơn a ạ
 
1. Con người không phải là máy nên nhiều khi nhầm lẫn. ...
Chính vì thế cho nên khi làm việc với folders và files, tôi luôn luôn có một công đoạn mà trên GPE luôn luôn bỏ qua: ghi lại kết quả.

Nếu là tôi thì tôi giành cột D để ghi kết quả.
D1: ghi ngày giờ code chạy.
D2 trở đi, ghi lại:
- nếu đổi êm xuôi thì ghi "-" (tin tôi đi, ghi cái gì đó tốt hơn để trống)
- nếu đổi ra tên khác với định sẵn ở cột C thì ghi tên này
- nếu đổi không được thì ghi "X" (đêm dài lắm mộng, ví dụ nếu quyền của người chạy code dưới quyền của chủ file thì chưa chắc đổi được)

Trong Windows rất khó mà tìm lại được lịch sử của file. Điển hình, trước đây nó tên gì? Logging là một thói quen tốt.
 
Chính vì thế cho nên khi làm việc với folders và files, tôi luôn luôn có một công đoạn mà trên GPE luôn luôn bỏ qua: ghi lại kết quả.

Nếu là tôi thì tôi giành cột D để ghi kết quả.
D1: ghi ngày giờ code chạy.
D2 trở đi, ghi lại:
- nếu đổi êm xuôi thì ghi "-" (tin tôi đi, ghi cái gì đó tốt hơn để trống)
- nếu đổi ra tên khác với định sẵn ở cột C thì ghi tên này
- nếu đổi không được thì ghi "X" (đêm dài lắm mộng, ví dụ nếu quyền của người chạy code dưới quyền của chủ file thì chưa chắc đổi được)

Trong Windows rất khó mà tìm lại được lịch sử của file. Điển hình, trước đây nó tên gì? Logging là một thói quen tốt.
Đúng là phải nên làm vậy.
 
Chính vì thế cho nên khi làm việc với folders và files, tôi luôn luôn có một công đoạn mà trên GPE luôn luôn bỏ qua: ghi lại kết quả.

Nếu là tôi thì tôi giành cột D để ghi kết quả.
D1: ghi ngày giờ code chạy.
D2 trở đi, ghi lại:
- nếu đổi êm xuôi thì ghi "-" (tin tôi đi, ghi cái gì đó tốt hơn để trống)
- nếu đổi ra tên khác với định sẵn ở cột C thì ghi tên này
- nếu đổi không được thì ghi "X" (đêm dài lắm mộng, ví dụ nếu quyền của người chạy code dưới quyền của chủ file thì chưa chắc đổi được)

Trong Windows rất khó mà tìm lại được lịch sử của file. Điển hình, trước đây nó tên gì? Logging là một thói quen tốt.
Qua bài này, tôi có thêm kinh nghiệm logging với 1 số trường hợp cụ thể mà có thể gây tổn hại không lường được với dữ liệu. Cảm ơn bác!
 
1. Con người không phải là máy nên nhiều khi nhầm lẫn. Vì thế tôi qui định là cột C chỉ chứa tên mới không có định dạng. Cột B phải chứa tên cũ cùng định dạng, vì thiếu định dạng thì không biết phải đổi tên tập tin nào (vd. có abc.txt, abc.jpg, abc.xlsx ...). Cột C chỉ chứa tên mới, còn định dạng y như ở cột B. Vd. B2 = 6.jpg, C2 = anh01 (không được phép có định dạng .jpg)

2. Code chỉ đổi tên khi tên mới <> tên cũ. Tức nếu B2 = abc.txt, C2 = abc thì code không làm gì.

3. Nếu tên mới cùng định dạng đã tồn tại trong thư mục thì tên mới sẽ được chèn thêm "_1", "_2", ... cho tới khi tên mới không tồn tại trong thư mục.

4. Mở tập tin -> Alt + F11 -> trong VBE chọn menu Insert -> Module ... -> dán code sau vào Module1.
Mã:
Sub RenameFiles()
Dim lastRow As Long, r As Long, chiso As Long, path As String, old_name As String, new_name As String, ext As String, fso As Object, dulieu()
    With ThisWorkbook.Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        If lastRow < 2 Then Exit Sub    ' khong co du lieu thi nghi choi
        dulieu = .Range("A2:C" & lastRow).Value ' cho du lieu vao mang dulieu
    End With
    Set fso = CreateObject("Scripting.FileSystemObject")    ' tao doi tuong FileSystemObject
    For r = 1 To UBound(dulieu, 1)  ' duyet mang dulieu bao gio cung nhanh hon duyet tung o tren sheet
        path = dulieu(r, 1) ' duong dan toi thu muc hien hanh
        If Right(path, 1) <> "\" Then path = path & "\"
        old_name = dulieu(r, 2) ' ten cu
        If fso.FileExists(path & old_name) Then ' chi thao tac khi tap tin cu dang ton tai. Dung phuong thuc FileExists cua doi tuong fso kiem tra su ton tai
            ext = Mid(old_name, InStrRev(old_name, "."))    ' dinh dang cua tap tin cu
            new_name = dulieu(r, 3) & ext     ' ten moi co dinh dang giong ten cu
            If new_name <> old_name Then    ' chi doi ten khi ten moi khac ten cu
                If fso.FileExists(path & new_name) Then ' neu ten moi da ton tai thi ...
                    chiso = 1
                    new_name = dulieu(r, 3) & "_1" & ext   ' them "_1"
                    Do While fso.FileExists(path & new_name)    ' neu ton tai ten voi "_1", "_2", ... thi tang chiso
                        chiso = chiso + 1
                        new_name = dulieu(r, 3) & "_" & chiso & ext
                    Loop
                End If
                fso.MoveFile path & old_name, path & new_name   ' doi ten cu thanh ten moi
            End If
        End If
    Next r
    Set fso = Nothing
End Sub
Trong code trên thay "Sheet1" bằng tên sheet của mình.

5. Đặt trên sheet 1 Button: menu Developer -> menu Insert -> Button từ "Form Controls" -> trong cửa sổ nhẩy ra chọn macro RenameFiles

Tôi chú thích từng dòng code, hãy đọc kỹ để hiểu.
Bác ơi! Cho em hỏi duyệt mảng và duyệt sheet như thế nào? Nhờ Bác có thể giải thích rõ được không Bác. Em cảm ơn Bác nhiều!
 
Bác ơi! Cho em hỏi duyệt mảng và duyệt sheet như thế nào? Nhờ Bác có thể giải thích rõ được không Bác. Em cảm ơn Bác nhiều!
Tôi cho toàn bộ vùng dữ liệu nguồn vào mảng dulieu nên sau đó tôi duyệt lần lượt từng dòng (For r = 1 To UBound(dulieu, 1)) mảng dulieu: dulieu(r, 1) chính là tên thư mục, dulieu(r, 2) là tên cũ, dulieu(r, 3) là tên mới.
Nếu tôi không cho dữ liệu nguồn vào mảng dulieu thì tôi phải duyệt từng ô trên sheet. Đại loại như:

...
For r = 2 To lastRow
path = Cells(r, "A")
If Right(path, 1) <> "\" Then path = path & "\"
old_name = Cells(r, "B")
If fso.FileExists(path & old_name) Then
ext = Mid(old_name, InStrRev(old_name, "."))
new_name = Cells(r, "C") & ext
...

Code 1 nhanh hơn code 2. Khi dữ liệu rất lớn thì việc đọc từ sheet vào mảng nguồn và "đập" cả mảng kết quả xuống sheet bao giờ cũng nhanh hơn việc đọc từng cell vào mảng nguồn hoặc ghi từng cell kết quả. Đôi khi code 1 chạy trong chớp mắt còn code 2 thì phải bỏ đấy đi nhậu về mới chạy xong.
 
Web KT
Back
Top Bottom