Dùng VBA để sắp xếp lại file trong thư mục

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
934
Được thích
568
Chào các anh chị
Em đang có 1 thư mục chứa các file con. Tên thư mục là ngày tháng (cấu trúc yyyy.mm.dd). Các file trong mỗi thư mục này hầu đều giống với thư mục khác ngoại trừ phần đầu của tên file chính là tên thư mục. (Vui lòng xem hình minh họa)
216505
216506

Anh chị hướng dẫn giúp em cách làm (bằng VBA hay Batch Script) để em có thể sắp xếp lại những file kia vào các folder mới theo cách như hình dưới (file loại nào vào thư mục đó):

216507

Ghi chú:
1. Bình thường thì mỗi folder có 10 file, tuy nhiên do vấn đề kết xuất lỗi nên folder có thể không đủ 10 file
2. Dữ liệu của có nhiều nên không thể làm bằng tay

Xin cảm ơn
 
Lần chỉnh sửa cuối:
Chào các anh chị
Em đang có 1 thư mục chứa các file con. Tên thư mục là ngày tháng (cấu trúc yyyy.mm.dd). Các file trong mỗi thư mục này hầu đều giống với thư mục khác ngoại trừ phần đầu của tên file chính là tên thư mục. (Vui lòng xem hình minh họa)
View attachment 216505
View attachment 216506

Anh chị hướng dẫn giúp em cách làm (bằng VBA hay Batch Script) để em có thể sắp xếp lại những file kia vào các folder mới theo cách như hình dưới (file loại nào vào thư mục đó):

View attachment 216507

Ghi chú:
1. Bình thường thì mỗi folder có 10 file, tuy nhiên do vấn đề kết xuất lỗi nên folder có thể không đủ 10 file
2. Dữ liệu của có nhiều nên không thể làm bằng tay

Xin cảm ơn
Em nhớ quy tắc của Win là nếu đặt tên File thì nó căn cứ vào chữ cái đầu hoặc số đầu của tên File mà nó tự sắp sếp (giống như trong Excel Sort số từ nhỏ đến lớn hoặc chữ thì A > Z.

Vậy muốn cho nó tự sắp xếp thì cách dễ nhất là lấy tên File trong folder vào 1 sheet rồi sửa tên tên File rồi đổi tên thì nó sẽ tự sắp sếp File theo quy tắc trên.
 
Lần chỉnh sửa cuối:
Em nhớ quy tắc của Win là nếu đặt tên File thì nó căn cứ vào chữ cái đầu hoặc số đầu của tên File mà nó tự sắp sếp (giống như trong Excel Sort số từ nhỏ đến lớn hoặc chữ thì A > Z.

Vậy muốn cho nó tự sắp xếp thì cách dễ nhất là lấy tên File trong folder vào 1 sheet rồi sửa tên tên File rồi đổi tên thì nó sẽ tự sắp sếp File theo quy tắc trên.
Có vẻ em diễn đạt chưa toát lên ý của em
Là em muốn Move file sang thư mục mới theo nguyên tắc em trình bày ạ. Dữ liệu của em có liên tục từ năm 2016 (Mỗi ngày có 1 folder, mỗi folder có 10 file) không thể làm bằng tay anh ơi
 
Có vẻ em diễn đạt chưa toát lên ý của em
Là em muốn Move file sang thư mục mới theo nguyên tắc em trình bày ạ. Dữ liệu của em có liên tục từ năm 2016 (Mỗi ngày có 1 folder, mỗi folder có 10 file) không thể làm bằng tay anh ơi
Thì cũng làm tương tự như cách trên bằng cách lấy tên File vào 1 sheet rồi di chuyển nó sang Folder khác.
 
số lượng thư mục của bạn là bao nhiêu? cái này bạn làm thủ công cũng không lâu đâu. Bạn tìm kiếm các file có tên giống folder rồi cắt vào folder là được, k cần thiết code
 
Thì cũng làm tương tự như cách trên bằng cách lấy tên File vào 1 sheet rồi di chuyển nó sang Folder khác.
Bác có thể cho em xin lời giải hoàn chỉnh được không ?
Bài đã được tự động gộp:

số lượng thư mục của bạn là bao nhiêu? cái này bạn làm thủ công cũng không lâu đâu. Bạn tìm kiếm các file có tên giống folder rồi cắt vào folder là được, k cần thiết code
Cảm ơn bạn đã quan tâm.
Có lẽ bạn không hiểu yêu cầu của mình rồi. Mình cần làm tự động thông qua code nhé.
Đúng là làm thủ công bằng cách dùng Windows Search với wildcard rồi Copy-Paste thì cũng xong trong 1-2 nốt nhạc, nhưng bạn chỉ hoàn thành được lúc đó thôi. Ngày mai bạn lại làm lại cho dữ liệu ngày mai và lặp lại cái việc thủ công này cho đến năm 2030 sao ?
Tên file và tên folder như minh họa đều tăm tắp đó đều là được tạo tự động bằng Batch Script, tên folder nó liên tục đến tận ngày hôm nay đã thể hiện nó phát sinh hàng ngày rồi mà bạn.
 
Lần chỉnh sửa cuối:
Bác thử sử dụng đoạn Code VBA sau xem có đúng yêu cầu hay không

Thay thế đường dẫn MainFolder và ToFolder
Sau đó Chạy thủ tục SapXepFile

PHP:
'Thêm Tool: Microsoft Scripting Runtime
Public FSO As Scripting.FileSystemObject
Public SourceFolder As Scripting.Folder, SubFolder As Scripting.Folder
Public FileItem As Scripting.File
Public Const MainFolder = "D:\Data\Folder\"
Public Const ToFolder = "D:\Data\New2\"

Public Sub SapXepFile()
  Set FSO = New Scripting.FileSystemObject
  If Not FSO.FolderExists(ToFolder) Then
    FSO.CreateFolder ToFolder
  End If
  ListFilesInFolder FSO.GetFolder(MainFolder), True
  Set FileItem = Nothing
  Set SourceFolder = Nothing
  Set FSO = Nothing
End Sub
Public Sub ListFilesInFolder( _
              ByVal SourceFolder As Scripting.Folder, _
              ByVal IncludeSubfolders As Boolean)
  On Error Resume Next
  Dim FileFolder$, fileNameInZip, Temp1$, Temp2$
  For Each FileItem In SourceFolder.Files
    Temp1 = FileItem.ShortName
    Temp2 = Right$(Temp1, Len(Temp1) - InStr(Temp1, "_"))
    Temp1 = Left$(Temp2, InStrRev(Temp2, ".") - 1)
    FSO.CreateFolder ToFolder & Temp1
    FSO.CopyFile FileItem.Path, ToFolder & Temp1 & "\" & FileItem.Name, True
  Next FileItem
  If IncludeSubfolders Then
    For Each SubFolder In SourceFolder.SubFolders
      ListFilesInFolder SubFolder, True
    Next SubFolder
  End If
End Sub
 
Cái quan trọng ngoài mấy cái cần lấy ra còn cái khác không thì cắt cụt đi...
View attachment 216537

**********************

View attachment 216538
View attachment 216539
Hi @befaint
File của bạn chạy đúng ý mình rồi. Ngoài 3 tình huống dưới đây, mình chưa test thêm được các tình huống khác nhưng khá hài lòng
1. Nếu trong Bố đích mà chưa tạo sẵn folder có tên quy ước thì việc copy không tiến hành mà không báo lỗi --> Rất OK
2. Việc copy đè lên file cũ đã tồn tại mà ko cần hỏi --> Rất OK
3. Mình đã thử cố tình mở 1 file trong folder Bố đích để xem hiện tượng ghi đè 1 file khi đang in-use ra sao --> Không copy, không báo lỗi, ko dừng việc copy các file khác --> Rất OK

Xin chân thành cảm ơn. Mong tiếp tục được giúp đỡ !
 
Cái quan trọng ngoài mấy cái cần lấy ra còn cái khác không thì cắt cụt đi...
View attachment 216537

**********************

View attachment 216538
View attachment 216539
Bác @befaint ơi, bác vui lòng giúp em.
Em cũng có nhu cầu tương tự, nhưng thêm yêu cầu khác là:
Ở đầu mỗi file nguồn, đều có tên là "CSV-" và đuôi file cũng là *.csv.
Nhu cầu của em là đổi cái "CSV-" thành "EXCEL-" cho đầu file rồi lưu file thành *.xlsx ở thư mục đích.

Trân trọng cảm ơn bác!
 
Cái quan trọng ngoài mấy cái cần lấy ra còn cái khác không thì cắt cụt đi...
View attachment 216537

**********************

View attachment 216538
View attachment 216539
Xem lại file bài này mới nhớ lại hình như xài xCopy nó copy file nhanh hơn Filecopy thì phải
có lẻ xài Dos là nhanh nhất cho Copy Files
Link sau cho ai muốn tìm hiểu các tham số xCopy
DOS Command: XCOPY (easydos.com)
 
Bác @befaint ơi, bác vui lòng giúp em.
Em cũng có nhu cầu tương tự, nhưng thêm yêu cầu khác là:
Ở đầu mỗi file nguồn, đều có tên là "CSV-" và đuôi file cũng là *.csv.
Nhu cầu của em là đổi cái "CSV-" thành "EXCEL-" cho đầu file rồi lưu file thành *.xlsx ở thư mục đích.

Trân trọng cảm ơn bác!

Bạn đăng chủ đề mới, nêu chi tiết yêu cầu ấy.
 
Web KT
Back
Top Bottom