Datcdt2k9
Thành viên hoạt động



- Tham gia
- 27/12/19
- Bài viết
- 109
- Được thích
- 11
Nếu tên mới trùng tên file đã có thì bằng tên mới gạch dưới 1 giúp mình( tên mới_1)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?
Bài trên có 2 phần cơ mà.Nếu tên mới trùng tên file đã có thì bằng tên mới gạch dưới 1 giúp mình( tên mới_1)
Bạn làm sao giúp mình để có thể phân biệt được là được bạn ạ( không trùng), mình thấy dữ liệu của mình ít xảy ra trường hợp nàyBài trên có 2 phần cơ mà.
Và nếu gạch dưới một vẫn trùng thì mình tính sao?
Phần 1 không phải câu hỏi, phải hỏi lạiBài trên có 2 phần cơ mà.
'Người ta' chỉ nhắc khéo thôi mà.Phần 1 không phải câu hỏi, phải hỏi lại
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é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?
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)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
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
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. 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.
Trong code trên thay "Sheet1" bằng tên sheet của mình.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
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.
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ả.1. Con người không phải là máy nên nhiều khi nhầm lẫn. ...
Đú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!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.
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!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.
Trong code trên thay "Sheet1" bằng tên sheet của mình.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
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.
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.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!