ExplorerXL - Quản lý thư mục với Excel: tìm, đổi tên, sao chép, di chuyển và xóa

Liên hệ QC

HeSanbi

Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
Tham gia
24/2/13
Bài viết
2,382
Được thích
3,536
Giới tính
Nam
Hôm nay, tôi chia sẻ với các bạn ứng dụng quản lý thư mục và tập tin được viết dựa trên bảng tính Excel và VBA, ứng dụng giúp dễ dàng tìm kiếm thư mục và tập tin, cũng như đổi tên, sao chép, di chuyển đến thư mục khác hoặc xóa tập tin rất linh hoạt.

Hình ảnh ứng dụng:

1696497738070.png

File ứng dụng:
(***Mật khẩu VBA là 1)
 

File đính kèm

  • ExplorerXL_v2.23.xlsm
    1.2 MB · Đọc: 70
Lần chỉnh sửa cuối:
Giải pháp
***** Cập nhật mới: v2.23 27/01/2024 *****
Thêm chức năng sao chép, đổi tên và di chuyển thư mục
Thêm tính năng xóa chuyển đến thùng rác
Thêm trình tự động tìm kiếm bản cập nhật mới
----------------------------------------------
@lyviettrung
Hai hàm dưới đây sẽ giúp chúng ta thực hiện lấy tất cả File hoặc Path trong một thư mục hoặc file và các thư mục bên trong thư mục.

Hàm ListAllFiles và các tham số:
1. aFolder- Đối số là chuỗi hoặc mảng: Là Path của Folder cần lấy List File
2. FSO - Đối số Object: Truyền vào Object để giải phóng về sau.
3. Files - Đối số trả ngược lại Variant : Trả lại List File
4. IncludeSubfolders - Đối số True/False: Tìm trong tập hợp Folder Con
5. Types - Đối số là chuỗi hoặc mảng: Tìm Type cần lấy, ví dụ: "*.pdf" hoặc Array(".pdf", ".xlsb", ....)
6. NameTypes - Đối số là chuỗi hoặc mảng: Tìm Name Type cần lấy, ví dụ: "WinRAR archive" hoặc Array("WinRAR archive", "JSON File", ....)
.......................................................
View attachment 225397
....................................................
7. iShortPart - Đối số True/False: Path trả lại là một Part đã rút gọn.


Hàm ListAllFolder và các tham số:

1. aFolder- Đối số là chuỗi hoặc mảng: Là Path của Folder cần lấy List File
2. FSO - Đối số Object: Truyền vào Object để giải phóng về sau.
3. Folders- Đối số trả ngược lại Variant : Trả lại List Folder
4. IncludeSubfolders - Đối số True/False: Tìm trong tập hợp Folder Con

------------------------------
JavaScript:
Option Explicit
'Sửa EarlyBinding = True Nếu đã thêm thư viện trong Tools - Tăng hiệu năng hoặc nhà phát triển'
#Const EarlyBinding = False
Private Sub test_ListAllFiles()
  Dim Item, Files, P As String
  P = "D:\Path\"
  Call ListAllFiles(P, , Files, True, ".xlsb")
  For Each Item In Files: Debug.Print Item: Next
End Sub

Private Sub test_ListAllFiles2()
  TestPath 1
  'TestPath 2
  'TestPath "D:\Files"
End Sub
Sub TestPath(Optional ByRef Path As String, _
                       Optional ByVal inSubfolders As Boolean)

  Dim Temp As String, Files As Variant, Ext As String

  #If EarlyBinding Then
    Dim FSO  As Scripting.FileSystemObject
  #Else
    Dim FSO As Object
  #End If
  If Path = vbNullString Then
    Temp = IIf(Environ("Tmp") <> "", Environ("Tmp"), Environ("Temp")) & "\"
  Else
    Temp = Path & IIf(Right(Path, 1) <> "\", "\", "")
  End If
  Select Case CStr(Path)
    Case "2": Files = DialogExplorer
    Case Else:
      If CStr(Path) = "1" Then Path = DialogExplorer(FileDialog:=4)
      GoSub GetFiles
  End Select
  If Not IsArray(Files) Then Exit Sub
  Dim Item
  For Each Item In Files: Debug.Print Item: Next

  Set FSO = Nothing
  Exit Sub

GetFiles:
  ListAllFiles Path, FSO, Files, inSubfolders, ".pdf", , False
Return
End Sub

Sub ListAllFiles(ByVal Paths, _
        Optional ByRef FSO As Object, _
        Optional ByRef Files As Variant, _
        Optional ByVal IncludeSubfolders As Boolean = False, _
        Optional ByVal Types = "*.*", _
        Optional ByVal NameTypes = "", _
        Optional ByVal iShortPart As Boolean = False, _
        Optional ByVal HasDel As Boolean = False)

  If VBA.TypeName(Paths) = "String" Then Paths = Array(Paths)
  Dim I&, k&, T$, T2$
  Dim aTypes(), Arr(), dArr()
  Dim SF, Item, Folder, oFolder
  I = -1
  If VBA.TypeName(NameTypes) = "String" Then
    If NameTypes <> vbNullString Then ReDim aTypes(0): aTypes(0) = VBA.LCase(NameTypes)
  Else
    ReDim aTypes(UBound(NameTypes))
    For I = LBound(NameTypes) To UBound(NameTypes): aTypes(I) = VBA.LCase(NameTypes(I)): Next I
  End If
  If VBA.TypeName(Types) = "String" Then
    ReDim aTypes(I + 1)
    aTypes(I + 1) = "*" & VBA.LCase(Types)
  Else
    ReDim aTypes(UBound(Types) + VBA.IIf(I = -1, 0, I))
    For k = LBound(Types) To UBound(Types): aTypes(k + VBA.IIf(I = -1, 0, I)) = "*" & VBA.LCase(Types(k)): Next k
  End If
  If FSO Is Nothing Then Set FSO = VBA.CreateObject("Scripting.FileSystemObject")
  I = 0
  If VBA.IsArray(Files) Then
    ReDim Arr(1 To UBound(Files) - LBound(Files) + 1)
    For I = LBound(Files) To UBound(Files) - LBound(Files) + 1: Arr(I) = Files(I): Next I
    I = I - 1
  End If
  k = 0
  For Each Folder In Paths
    If FSO.FolderExists(Folder) Then
      Set oFolder = FSO.GetFolder(Folder)
      For Each Item In oFolder.Files
        T = vbNullString: T = VBA.LCase(Item.Name)
        T2 = vbNullString: T2 = VBA.LCase(Item.Type)
        For Each SF In aTypes
          If VBA.Left(T, 1) <> "~" And (T Like SF Or T2 = SF) Then
            I = I + 1: ReDim Preserve Arr(1 To I)
            Arr(I) = VBA.IIf(iShortPart, Item.ShortPath, Item.Path)
            Exit For
          End If
        Next SF
      Next Item
      If IncludeSubfolders Then
        For Each SF In oFolder.SubFolders
          k = k + 1: ReDim Preserve dArr(1 To k): dArr(k) = SF.Path
        Next SF
      End If
    End If
  Next Folder
  If I > 0 Then Files = Arr
  If IncludeSubfolders And k > 0 Then
    ListAllFiles dArr, FSO, Files, True, Types, NameTypes, iShortPart, HasDel
  End If
End Sub
Private Sub test_ListAllFolder()
  On Error Resume Next
  Dim Item, I&, Arr(0), UB, Fs
  Dim P$: P = "D:\Sounds\CayBoDe\" 'ActiveSheet.Parent.Path
  Call ListAllFolder(P, , Fs)
  For Each Item In Fs: Debug.Print Item: Next Item
End Sub

Sub ListAllFolder(ByVal Paths, _
        Optional ByRef FSO As Object, _
        Optional ByRef Folders As Variant, _
        Optional ByVal iShortPart As Boolean, _
        Optional ByVal HasDel As Boolean)
  If VBA.TypeName(Paths) = "String" Then Paths = Array(Paths)
  Dim I&, k&, LB%, UB&, Arr(), dArr(), Folder
  Dim Item As Scripting.Folder
  Dim oFolder As Scripting.Folder
  If FSO Is Nothing Then Set FSO = VBA.CreateObject("Scripting.FileSystemObject")
  If VBA.IsArray(Folders) Then
    LB = LBound(Folders): UB = UBound(Folders)
    ReDim Arr(1 To UB - LB + 1)
    For I = 1 To UB - LB + 1: Arr(I) = Folders(I): Next I
    I = I - 1
  End If
  For Each Folder In Paths
    If FSO.FolderExists(Folder) Then
      Set oFolder = FSO.GetFolder(Folder)
      For Each Item In oFolder.SubFolders
        k = k + 1: ReDim Preserve dArr(1 To k)
        dArr(k) = VBA.IIf(iShortPart, Item.ShortPath, Item.Path)
        I = I + 1: ReDim Preserve Arr(1 To I): Arr(I) = dArr(k)
      Next Item
    End If
  Next Folder
  Folders = Arr
  ListAllFolder dArr, FSO, Folders, iShortPart, HasDel
End Sub

Function DialogExplorer(Optional FolderPath As String, _
                        Optional sDesc As String = "All File", _
                        Optional sFilter As String = "*.*", _
                        Optional Title As String = "File Open", _
                        Optional FileDialog As Long = 1, _
                        Optional InitialView As Long = 2, _
                        Optional ButtonName As String = "&Select", _
                        Optional MultiSelect As Boolean = -1) As Variant
  DialogExplorer = 0
  Dim Arr(), K, it
  With Application.FileDialog(FileDialog) '1|4'
    If ButtonName <> vbNullString Then .ButtonName = ButtonName
    If FolderPath <> vbNullString Then
      .InitialFileName = FolderPath
    Else
      .InitialFileName = Application.DefaultFilePath
    End If
    If FileDialog = 1 Then
      .Filters.Clear
      .Filters.Add sDesc, sFilter
      If sDesc <> "All File" Then .Filters.Add "All File", "*.*"
    End If
    If Title <> vbNullString Then .Title = Title
    .InitialView = InitialView 'msoFileDialogViewDetails'
    .AllowMultiSelect = IIf(FileDialog = 4, False, MultiSelect)
    If .Show Then
      If FileDialog = 4 Then
        DialogExplorer = .SelectedItems(1)
      Else
        For Each it In .SelectedItems
          ReDim Preserve Arr(K): Arr(K) = it: K = K + 1
        Next it
        DialogExplorer = Arr
      End If
    End If
    If FileDialog = 1 Then .Filters.Clear
  End With
End Function

--------------------
Tag: đường dẫn file, đường dẫn thư mục, đường dẫn tệp, trong thư mục, trong folder


File ứng dụng:
Thanks bác nhiều nhé, đúng cái em cần rồi ^^
 
Upvote 0
Cập nhật ứng dụng quản lý tập tin bằng Excel

1. Code lại.
2. Thêm các nút di chuyển lên xuống qua lại thuận tiện.


@vietlong713
Mới kiểm tra 1 tính năng Đổi tên tệp thì không được (khi chạy file có hiện chữ "Gặp lỗi", còn lỗi gì thì không biết).
Sử dụng phiên bản cũ "QuanLyFile ver2.xlsm" của bạn thì tính năng đổi tên tệp vẫn chạy tốt.
Bạn xem lại nhé !
 
Upvote 0
File system object cũng được anh @quanghai1969 nói khá chi tiết trong topic này, có thể ứng dụng để lấy tên file:
 
Upvote 0
Hai hàm dưới đây sẽ giúp chúng ta thực hiện lấy tất cả File hoặc Path trong một thư mục hoặc file và các thư mục bên trong thư mục.

Hàm ListAllFiles và các tham số:

Hướng dẫn:
Thủ tục có 27 tham số :
Vì sao thủ tục lại có nhiều đối số đến vậy?, các tham số có tên ở đầu là"Return" để trả về mảng theo thuộc tính cần lấy nên khiến tham số nhiều hơn
Thuộc tính cần lấy như Cột thứ tự, tên và đuôi, chỉ có tên, kích thước tệp, thời lượng nếu là video, nhạc, đuôi tệp, kiểu tập tin, Thứ tự, đường dẫn đầy đủ, đường dẫn chứa tệp, đường dẫn lót, đường dẫn rút gọn của tệp, đường dẫn rút gọn, ngày tạo, ngày truy cập, ngày chỉnh sửa.

Vị tríTham sốKiểuGiá trị mặc địnhChức năng
1​
PathsChuỗi hoặc mảngĐường dẫn hoặc mảng chứa đường dẫn
2​
Files()MảngTrả kết quả mảng vào biến mảng
3​
FSOĐối tượngNothingNhập lớp Scripting.FileSystemObject để tiết kiệm tài nguyên hệ thống
4​
IncludeSubfoldersCó/KhôngKhôngKết quả bao gồm thư mục con
5​
TypesChuỗi*Kiểu đuôi tệp trả về kết quả
6​
NameTypesChuỗiKiểu tệp nằm trong Kiểu khái quát của tệp
7​
FileNameLikeChuỗi*Tên tệp có chứa chuỗi nhập vào
8​
FolderNameLikeChuỗi*Tên folder con có chứa chuỗi nhập vào
9​
RunProcedureDeleteIfWrongConditionsChuỗiChuỗi tên Thủ tục thực thi để xóa tệp
Ví dụ: Sub DeleteFile()
Nhập "DeleteFile" thì thủ tục này sẽ thực thi xóa tệp
10​
IsGetFileObjectCó/KhôngKhôngTrả về kết quả là đối tượng
11​
ReturnOrderSố nguyên0Trả về mảng có cột Thứ tự (Nếu lớn hơn 0, cột thứ tự thường là 1)
12​
ReturnName1Số nguyên0Trả về mảng có cột tên và đuôi (Nếu lớn hơn 0, nếu đặt 5 tức là cột 5 trong mảng kết quả)
13​
ReturnName2Số nguyên0Trả về mảng có cột chỉ có tên (Tương tự hai tham số trên)
14​
ReturnSizeSố nguyên0Trả về mảng có cột kích thước tệp
15​
ReturnLengthSố nguyên0Trả về mảng có cột thời lượng nếu là video, nhạc
16​
ReturnExtendSố nguyên0Trả về mảng có cột đuôi tệp
17​
ReturnTypeSố nguyên0Trả về mảng có cột kiểu tập tin
18​
ReturnPathBetweenSố nguyên0Trả về mảng có cột Đường dẫn lót
19​
ReturnFullPathSố nguyên0Trả về mảng có cột đường dẫn đầy đủ
20​
ReturnParentFolderSố nguyên0Trả về mảng có cột đường dẫn chứa tệp
21​
ReturnAttributesSố nguyên0Trả về mảng có cột Thứ tự
22​
ReturnShortNameSố nguyên0Trả về mảng có cột đường dẫn rút gọn của tệp
23​
ReturnShortPathSố nguyên0Trả về mảng có cột đường dẫn rút gọn
24​
ReturnDateCreatedSố nguyên0Trả về mảng có cột ngày tạo
25​
ReturnDateLastAccessedSố nguyên0Trả về mảng có cột ngày truy cập
26​
ReturnDateLastModifiedSố nguyên0Trả về mảng có cột ngày chỉnh sửa
27​
MainPathSố nguyênTham số này không nhập, vì dùng cho các lần đệ quy

.......................................................
View attachment 225397
....................................................



Hàm ListAllFolder và các tham số:


Vị tríTham sốKiểuGiá trị mặc địnhChức năng
1​
PathsChuỗi hoặc mảngĐường dẫn hoặc mảng chứa đường dẫn
2​
Folders()MảngTrả kết quả mảng vào biến mảng
3​
FSOĐối tượngNothingNhập lớp Scripting.FileSystemObject để tiết kiệm tài nguyên hệ thống
4​
IncludeSubfoldersCó/KhôngKhôngKết quả bao gồm thư mục con
5​
FolderNameLikeChuỗi*Tên folder con có chứa chuỗi nhập vào
6​
IsGetFileObjectCó/KhôngKhôngTrả về kết quả là đối tượng
7​
ReturnOrderSố nguyên0Trả về mảng có cột Thứ tự (Nếu lớn hơn 0)
8​
ReturnNameSố nguyên0Trả về mảng có cột tên và đuôi
9​
ReturnSizeSố nguyên0Trả về mảng có cột chỉ có tên
10​
ReturnFullPathSố nguyên0Trả về mảng có cột kích thước tệp
11​
ReturnParentFolderSố nguyên0Trả về mảng có cột thời lượng nếu là video, nhạc
12​
ReturnShortPathSố nguyên0Trả về mảng có cột đường dẫn rút gọn
13​
ReturnDateCreatedSố nguyên0Trả về mảng có cột ngày tạo
14​
ReturnDateLastAccessedSố nguyên0Trả về mảng có cột ngày truy cập
15​
ReturnDateLastModifiedSố nguyên0Trả về mảng có cột ngày chỉnh sửa


JavaScript:
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
'-----------------------------------
' Lâìy danh sách têòp trong thý muòc
Sub ListAllFiles(ByVal Paths, _
                 ByRef Files(), _
        Optional ByRef FSO As Object, _
        Optional ByVal IncludeSubfolders As Boolean = False, _
        Optional ByVal Types As Variant = "*", _
        Optional ByVal NameTypes As Variant = "", _
        Optional ByVal FileNameLike As Variant = "*", _
        Optional ByVal FolderNameLike As Variant = "*", _
        Optional ByVal RunProcedureDeleteIfWrongConditions As String, _
        Optional ByVal IsGetFileObject As Boolean, _
        Optional ByVal ReturnOrder As Integer, Optional ByVal ReturnName1 As Integer, Optional ByVal ReturnName2 As Integer, _
        Optional ByVal ReturnSize As Integer, Optional ByVal ReturnLength As Integer, _
        Optional ByVal ReturnExtend As Integer, Optional ByVal ReturnType As Integer, _
        Optional ByVal ReturnPathBetween As Integer, Optional ByVal ReturnFullPath As Integer, _
        Optional ByVal ReturnParentFolder As Integer, Optional ByVal ReturnAttributes As Integer, _
        Optional ByVal ReturnShortName As Integer, Optional ByVal ReturnShortPath As Integer, _
        Optional ByVal ReturnDateCreated As Integer, _
        Optional ByVal ReturnDateLastAccessed As Integer, _
        Optional ByVal ReturnDateLastModified As Integer, _
        Optional ByVal MainPath$)
' Last Edit: 25/09/2020 08:10
  On Error Resume Next
  DoEvents
  Dim K As Long
  Dim R As Long, Cols%, C%, A(16)
  Dim Correct As Boolean
  Dim ItemName As String
  Dim ItemType As String
  Dim Ext As String
  Dim aTypes() As String
  Dim sLike() As String
  Dim Arr() As String
  Dim Folders() As String
  Dim SF
  Dim Item As Object 'Scripting.File
  Dim Folder
  Dim oFolder
 
  '-------------------------------------------
  C = 1
  A(C) = ReturnOrder: GoSub g
  A(C) = ReturnName1: GoSub g
  A(C) = ReturnName2: GoSub g
  A(C) = ReturnSize: GoSub g
  A(C) = ReturnLength: GoSub g
  A(C) = ReturnExtend: GoSub g
  A(C) = ReturnType: GoSub g
  A(C) = ReturnPathBetween: GoSub g
  A(C) = ReturnFullPath: GoSub g
  A(C) = ReturnParentFolder: GoSub g
  A(C) = ReturnAttributes: GoSub g
  A(C) = ReturnShortName: GoSub g
  A(C) = ReturnShortPath: GoSub g
  A(C) = ReturnDateCreated: GoSub g
  A(C) = ReturnDateLastAccessed: GoSub g
  A(C) = ReturnDateLastModified: GoSub g

  '-------------------------------------------
  If VBA.TypeName(Paths) = "String" Then Paths = Array(Paths)
  If MainPath = vbNullString Then MainPath = Paths(0)
  '-------------------------------------------
  If VBA.TypeName(FileNameLike) = "String" Then
    If FileNameLike <> vbNullString Then
      Arr = VBA.Split(FileNameLike, "|")
      ReDim sLike(UBound(Arr))
      If VBA.Err = 0 Then
        For R = LBound(Arr) To UBound(Arr)
          sLike(R) = "*" & VBA.LCase(Arr(R)) & "*"
        Next R
      End If
    End If
  Else
    ReDim sLike(UBound(FileNameLike))
    If VBA.Err = 0 Then
      For R = LBound(FileNameLike) To UBound(FileNameLike)
        sLike(R) = "*" & VBA.LCase(FileNameLike(R)) & "*"
      Next R
    End If
  End If  '-------------------------------------------
  R = 0
  VBA.Err.clear
  If VBA.TypeName(NameTypes) = "String" Then
    If NameTypes <> vbNullString Then
      Arr = VBA.Split(NameTypes, ",")
      ReDim aTypes(UBound(Arr))
      If VBA.Err = 0 Then
        For R = LBound(Arr) To UBound(Arr)
          aTypes(R) = VBA.Trim(VBA.LCase(Arr(R)))
        Next R
      End If
    End If
  Else
    ReDim aTypes(UBound(NameTypes))
    If VBA.Err = 0 Then
      For R = LBound(NameTypes) To UBound(NameTypes)
        aTypes(R) = VBA.Trim(VBA.LCase(NameTypes(R)))
      Next R
    End If
  End If
  VBA.Err.clear
  '-------------------------------------------
  If VBA.TypeName(Types) = "String" Then
    If Types <> vbNullString Then
      Arr = VBA.Split(Types, ",")
      ReDim Preserve aTypes(R + UBound(Arr))
      If VBA.Err = 0 Then
        For R = LBound(Arr) To UBound(Arr)
          aTypes(R) = VBA.Trim(VBA.LCase(Arr(R)))
          If Not aTypes(R) Like "[*]*" Then
            aTypes(R) = "*" & aTypes(R)
          End If
        Next R
      End If
    End If
  Else
    ReDim aTypes(UBound(Types) + VBA.IIf(R = -1, 0, R))
    If VBA.Err = 0 Then
      For K = LBound(Types) To UBound(Types)
        If Not Types(K) Like "[*]*" Then
          aTypes(K + VBA.IIf(R = -1, 0, R)) = "*" & VBA.LCase(Types(K))
        Else
          aTypes(K + VBA.IIf(R = -1, 0, R)) = VBA.LCase(Types(K))
        End If
      Next K
    End If
  End If
  '-------------------------------------------
  If FSO Is Nothing Then Set FSO = VBA.CreateObject("Scripting.FileSystemObject")
  '-------------------------------------------
  R = 0
  R = UBound(Files, 2)
  For Each Folder In Paths
    If FSO.FolderExists(Folder) Then
      Set oFolder = FSO.GetFolder(Folder)
        For Each Item In oFolder.Files
          ItemName = vbNullString: ItemName = VBA.LCase(Item.Name)
          Ext = VBA.LCase(VBA.Trim(VBA.RIGHT(VBA.Replace(ItemName, ".", VBA.Space(255)), 255)))
          ItemName = VBA.LEFT(ItemName, Len(ItemName) - Len(Ext) - 1)
          ItemType = vbNullString: ItemType = VBA.LCase(Item.Type)
          Correct = False
          For Each SF In aTypes
            If VBA.LEFT(ItemName, 1) <> "~" And ("." & Ext Like SF Or ItemType = SF) Then
              Correct = True: Exit For
            End If
          Next SF
          If Correct And FileNameLike <> "*" And FileNameLike <> "" Then
            For Each SF In sLike
              If ItemName Like SF Then Correct = True: GoTo GetItem
            Next SF
            Correct = False
          End If
GetItem:
          If Correct Then
            R = R + 1
            If Not IsGetFileObject Then
              ReDim Preserve Files(1 To Cols, 1 To R)
              With Item
                C = 1: If A(C) > 0 Then Files(A(C), R) = R
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = .Name
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = VBA.LEFT(.Name, Len(.Name) - Len(Ext) - 1)
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = VBA.Round(.Size / 1024 / 1024, 2)
                C = C + 1
                If A(C) > 0 Then
                  Static Sh As Object
                  If Sh Is Nothing Then Set Sh = VBA.CreateObject("Shell.Application")
                  Dim ShFolder As Object, ParseName As Object, tTime As String
                  Set ShFolder = Sh.Namespace(CVar(.ParentFolder & "\"))
                  Set ParseName = ShFolder.ParseName(.Name)
                  If Not ParseName Is Nothing Then _
                  Files(A(C), R) = ShFolder.GetDetailsOf(ShFolder.ParseName(.Name), 27)
                  Set ParseName = Nothing
                End If
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = Ext
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = .Type
                C = C + 1
                If A(C) > 0 Then
                  Files(A(C), R) = Replace(.path, MainPath, "", , , 1)
                  Files(A(C), R) = Replace(Files(A(C), R), .Name, "", , , 1)
                End If
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = .path
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = .ParentFolder
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = .Attributes
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = .ShortName
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = .ShortPath
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = CDate(.DateCreated)
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = CDate(.DateLastAccessed)
                C = C + 1: If A(C) > 0 Then Files(A(C), R) = CDate(.DateLastModified)
              End With
            Else
              ReDim Preserve Files(1 To R)
              Set Files(R) = Item
            End If
          Else
            If RunProcedureDeleteIfWrongConditions <> "" Then
              Application.Run RunProcedureDeleteIfWrongConditions, Item.path
            End If
          End If
        Next Item
CheckSub:
      If IncludeSubfolders Then
        For Each SF In oFolder.SubFolders
          If VBA.LCase(SF.Name) Like VBA.LCase(FolderNameLike) Then
            K = K + 1: ReDim Preserve Folders(1 To K): Folders(K) = SF.path
          End If
        Next SF
      End If
    End If
  Next Folder
  If IncludeSubfolders And K > 0 Then
    Call ListAllFiles(Folders, Files, FSO, True, Types, NameTypes, _
                      FileNameLike, FolderNameLike, RunProcedureDeleteIfWrongConditions, _
                      IsGetFileObject, _
                      ReturnOrder, ReturnName1, ReturnName2, ReturnSize, ReturnLength, ReturnExtend, ReturnType, _
                      ReturnPathBetween, ReturnFullPath, ReturnParentFolder, _
                      ReturnAttributes, ReturnShortName, ReturnShortPath, _
                      ReturnDateCreated, ReturnDateLastAccessed, ReturnDateLastModified, MainPath)
  End If
On Error GoTo 0
Exit Sub
g:
  If A(C) > Cols Then Cols = A(C)
  C = C + 1
Return
End Sub
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
Sub ListAllFolder(ByVal Paths, _
                 ByRef Folders(), _
        Optional ByRef FSO As Object, _
        Optional ByVal IncludeSubfolders As Boolean = False, _
        Optional ByVal FolderNameLike = "*", _
        Optional ByVal IsGetFileObject As Boolean, _
        Optional ByVal ReturnOrder As Integer, _
        Optional ByVal ReturnName As Integer, _
        Optional ByVal ReturnSize As Integer, _
        Optional ByVal ReturnFullPath As Integer, _
        Optional ByVal ReturnParentFolder As Integer, _
        Optional ByVal ReturnShortPath As Integer, _
        Optional ByVal ReturnDateCreated As Integer, _
        Optional ByVal ReturnDateLastAccessed As Integer, _
        Optional ByVal ReturnDateLastModified As Integer)
      
  Dim R&, C%, K&, LB%, UB&, Arr(), dArr(), Folder, Cols%, A(9)
  Dim Item As Object 'Scripting.Folder
  Dim oFolder As Object  ''Scripting.Folder
  '-------------------------------------------
  C = 1
  A(C) = ReturnOrder: GoSub g
  A(C) = ReturnName: GoSub g
  A(C) = ReturnSize: GoSub g
  A(C) = ReturnFullPath: GoSub g
  A(C) = ReturnParentFolder: GoSub g
  A(C) = ReturnShortPath: GoSub g
  A(C) = ReturnDateCreated: GoSub g
  A(C) = ReturnDateLastAccessed: GoSub g
  A(C) = ReturnDateLastModified: GoSub g
 
  If VBA.TypeName(Paths) = "String" Then Paths = Array(Paths)

  If FSO Is Nothing Then
    Set FSO = VBA.CreateObject("Scripting.FileSystemObject")
  End If
  On Error Resume Next
  R = UBound(Folders)
  For Each Folder In Paths
    If FSO.FolderExists(Folder) Then
      Set oFolder = FSO.GetFolder(Folder)
      For Each Item In oFolder.SubFolders
        K = K + 1: ReDim Preserve dArr(1 To K)
        dArr(K) = Item.path
        R = R + 1
        If Not IsGetFileObject Then
          ReDim Preserve Folders(1 To Cols, 1 To R)
          C = 0
          With Item
            C = 1
            If A(C) > 0 Then: Folders(A(C), R) = R
            C = C + 1
            If A(C) > 0 Then: Folders(A(C), R) = .Name
            C = C + 1
            If A(C) > 0 Then: Folders(A(C), R) = VBA.Round(.Size / 1024 / 1024, 2)
            C = C + 1
            If A(C) > 0 Then: Folders(A(C), R) = .path
            C = C + 1
            If A(C) > 0 Then: Folders(A(C), R) = .ParentFolder
            C = C + 1
            If A(C) > 0 Then: Folders(A(C), R) = .ShortPath
            C = C + 1
            If A(C) > 0 Then: Folders(A(C), R) = .DateCreated
            C = C + 1
            If A(C) > 0 Then: Folders(A(C), R) = .DateLastAccessed
            C = C + 1
            If A(C) > 0 Then: Folders(A(C), R) = .DateLastModified
          End With
        Else
          ReDim Preserve Folders(1 To R)
          Set Folders(R) = Item
        End If
      Next Item
    End If
  Next Folder
  If K > 0 And IncludeSubfolders Then
    Call ListAllFolder(dArr, Folders, FSO, True, FolderNameLike, _
                        ReturnOrder, ReturnName, ReturnSize, _
                        ReturnFullPath, ReturnParentFolder, ReturnShortPath, _
                        ReturnDateCreated, ReturnDateLastAccessed, ReturnDateLastModified)
  End If
Exit Sub
g:
  If Cols < A(C) Then Cols = A(C)
  C = C + 1
Return
End Sub


File ứng dụng:
Cảm ơn bạn, file quá hay.
bạn có thể giúp mình cách thêm cột ghi chú không? Mỗi lần mình ghi chú (ví dụ: giá quý 3; file in;...) nhưng load lại file thì không đúng giá trị ghi chú.
Xin cảm ơn.
 
Upvote 0

File đính kèm

  • 1669355515871.png
    1669355515871.png
    301.1 KB · Đọc: 35
Upvote 0
Upvote 0
***** BẢN CẬP NHẬT MỚI - 22/06/2023 *****

Thêm cột chọn tập tin dễ dàng hơn và tối ưu mã
 
Upvote 0
Mình muốn tìm cùng 1 kiểu tên chứa nhưng ở nhiều đường dẫn và ra nhiều loại file khác nhau đồng thời chọn và copy qua một đường dẫn khác. bạn có cách nào hay không. Hiện tại mình đang sử dụng hyperlink để làm việc này nhưng chưa thấy ổn lắm
 
Upvote 0
@HeSanbi mình viết được đoạn code lặp lại qua nhiều đường dẫn để tìm nhiều file cùng một lúc rồi. Nhưng bạn có thể giúp mình đoạn code copy file theo lick chọn check box như trong hình file bạn đang sử dụng không.

Vì code bạn viết nhiều quá mình không nắm rõ được. bạn có thể tóm tắt đoạn code liên quan đến copy theo check box được không.
Hoặc khó quá bạn có thể gợi ý giúp mình rồi mình suy nghĩ thêm cũng được. Cảm ơn bạn nhiều

1688480927207.png
 
Upvote 0
@mraleno

Bạn tải ứng dụng mới về sử dụng nhé
Chọn dấu 3 chấm, chọn thư mục, chọn nhiều lần hoặc nhập danh sách thư mục với ký tự xuống dòng khi có nhiều thư mục
 
Upvote 0
Cảm ơn bạn @HeSanbi . File của bạn hoàn thiện và xử lý được rất nhiều thứ liên quan đến file.
Mình chỉ có một chút góp ý nho nhỏ mang tính xây dựng nha :)
- để xử lý một khối lượng file nhiều cỡ doanh nghiệp thì file của bạn không khả thi lắm. vì chạy khá lâu và gần như bị đơ nếu vòng lặp qua khoảng 100k file. Cảm ơn bạn rất nhiều. code của bạn cũng chứa rất nhiều thứ cần học hỏi
 
Upvote 0
Cảm ơn bạn @HeSanbi . File này mà hỗ trợ mỗi file con, folder con trong list chép đến một đường dẫn khác nhau nữa thì tuyệt vời.
 
Upvote 0
cho mình hỏi, có thể thay đổi ngày giờ tạo file và ngày giờ truy cập cuối của file k ạ?
 
Upvote 0
***** CẬP NHẬT MỚI *****
Bản cập nhật mới sẽ cho phép thực hiện sao chép hoặc di chuyển tệp sang thư mục riêng lẻ tương ứng mỗi tệp.

@duclong285
Chào anh,
Em mới chạy thử file mới, di chuyển các tệp sang thư mục riêng lẻ tương ứng thì báo lỗi "Đường dẫn không hợp lệ !!!", em đã kiểm tra thì đường dẫn không sai tuy nhiên vẫn bị lỗi. Không biết có ai gặp lỗi tương tự không.
1696469696429.png
1696469472730.png
 
Upvote 0
Web KT
Back
Top Bottom