VBA文件处理总结整理: 如何用VBA查找文件夹(包含子目录)下的所有文件 或 特定文件?以及批量创建文件

目录

0 要解决的问题:如何遍历windows文件夹查找文件夹 (目录)和文件

0.1 原始文件夹和文件情况

0.2 目标:

0.3 为了达到复杂的目标,下面将分步骤做,从简单到难,逐步解决更难的问题

1 step1:遍历文件夹(不包含子文件)内的文件数

1.1 语法注意点:

1.1.1 取得文件夹下的文件名的方法

1.1.2 dir(path) 查找文件夹 和查找文件的语法不同

1.1.3 判断文件夹内所有文件是否遍历完成的判断条件

1.1.4 注意第一个文件的特殊性

1.2 测试代码

2 step2: 遍历文件夹内的所有子文件夹的名字

2.1 创建根目录的主函数

2.1.1 fso对象

2.1.2 传递 根目录给 子目录函数

2.1.3 子目录函数里要做递归处理

2.2 测试代码

3  step3 遍历文件夹的(含子文件)内的所有文件

3.1 因为第1个目录先读到,所以其目录名和文件名都要在,子目录函数外,单独显示

3.2  显示文件函数

3.3 测试代码

4 step4 遍历文件夹的(含子文件)内的所有文件夹和文件

4.1 综合前面的功能

4.2 注意:根目录的目录名,文件遍历都要写在主函数里

4.3 测试代码

5 step5:  遍历全部子目录,查找特定 目标 文件!

5.1 假设要查找一个target文件,是否存在这个目录下和详细路径

5.2 文件搜索函数,增加对target文件的比对判断

5.3 测试代码

6 STEP6: 批量创建子目录 和 批量创建文件(先判断是否存在) 并写入内容

6.1 这部分的目标是

6.2  用 mkdir() 批量创建文件夹/目录

6.3  批量创建文件

6.3.1 先查文件是否已经存在

6.3.2 批量创建文件

6.3.3 写入内容

6.3.4 打开和关闭文件

6.4 测试代码


0 要解决的问题:如何遍历windows文件夹查找文件夹 (目录)和文件

0.1 原始文件夹和文件情况

  • 我现在有1个文件夹
  • 桌面文件夹ppp
  •  子文件夹1(下面还有子文件夹11(下面还有子文件夹111))
  •  子文件夹2
  •  子文件夹3
  • 这些文件夹里分别有些txt文件

0.2 目标:

  • 初级目标:查找文件夹内的文件数量
  • 中级目标:查找文件夹内的下级目录(包含所有子目录)
  • 中级目标:查找文件夹内的下级目录(包含所有子目录)里的所有文件

0.3 为了达到复杂的目标,下面将分步骤做,从简单到难,逐步解决更难的问题

  • step1:
  • step2:
  • step3:
  • 。。。

1 step1:遍历文件夹(不包含子文件)内的文件数

  • 遍历文件夹内的文件数
  • 但是并不遍历子文件

1.1 语法注意点:

1.1.1 取得文件夹下的文件名的方法

  • 第一次获得文件夹下的文件名:dir(path)
  • 后面继续获得文件夹下其他文件名,不能用dir(path),而要用dir()
  • 如果继续用 dir(path) 会让指针又指到文件夹内的第一个文件

1.1.2 dir(path) 查找文件夹 和查找文件的语法不同

  • 用于查找文件
  • path1 = "C:\Users\Administrator\Desktop\ppp\*.*"
  • fn = Dir(fp)

  • 用于查找文件夹/目录
  • path1 = "C:\Users\Administrator\Desktop\ppp"
  • fn = Dir(fp)

1.1.3 判断文件夹内所有文件是否遍历完成的判断条件

  • 判断条件:dir() <> ""
  • 当fn="" 表示文件夹下面已经读到最后一个文件之后了
  • 用词用 Do While fn <> "" loop来判断

1.1.4 注意第一个文件的特殊性

  • fn = Dir(fp)
  • Debug.Print fn   '避免会少第1个文件
  • 这里如果不加这句,第一个文件名就会丢失

    fn = Dir(fp)
    Debug.Print fn   '避免会少第1个文件


    Do While fn <> ""
       fn = Dir
       Debug.Print fn
    Loop

1.2 测试代码

Function file_dir1()
    fp = "C:\Users\Administrator\Desktop\ppp\*.*"

    fn = Dir(fp)
    Debug.Print fn   '避免会少第1个文件
    Do While fn <> ""
       fn = Dir
       Debug.Print fn
    Loop
    
End Function

VBA文件处理总结整理: 如何用VBA查找文件夹(包含子目录)下的所有文件 或 特定文件?以及批量创建文件_第1张图片

2 step2: 遍历文件夹内的所有子文件夹的名字

  • 遍历文件夹的所有子文件的名字
  • 可以遍历所有文件夹,及其子文件夹
  • 只取得文件夹的名字,不管文件

2.1 创建根目录的主函数

  • 这里使用fso对象的方法

2.1.1 fso对象

  • 这里使用fso对象的方法

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

  • 并且把根目录文件夹设置为fso对象
  • 根目录folder = fso.GetFolder(ff)

   '确定根目录
    ff = "C:\Users\Administrator\Desktop\ppp"
    '遍历根目录下的子文件夹
    Dim folder As Object ' 当前正在遍历的文件夹
    Set folder = fso.GetFolder(ff)

2.1.2 传递 根目录给 子目录函数

  • Call SubProcessFolder2(folder)

2.1.3 子目录函数里要做递归处理

  • '把根目录传给子目录函数 Sub SubProcessFolder2(folder) 
  • '用 folder.subfolders  遍历根目录下的子文件夹 For Each subFolder In folder.subfolders  
  • 用 subFolder.subfolders.Count>0 判断是否每个子目录下层还有目录,如果有则进行递归,把子目录当作参数传入自己,调用自己。
  • 这样递归可以穷尽所有子目录。

Sub SubProcessFolder2(folder)    '把根目录传给子目录函数
    '子文件夹
    Dim subFolder As Object
    For Each subFolder In folder.subfolders   '遍历根目录下的子文件夹
        Debug.Print subFolder.Path


        ' 如果还有更深层次的子文件夹,则进行递归调用
        If subFolder.subfolders.Count > 0 Then
            Call SubProcessFolder2(subFolder)
        End If


    Next subFolder
End Sub

2.2 测试代码

'----------------step2---------------------------------------------
Sub Folder2()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '确定根目录
    ff = "C:\Users\Administrator\Desktop\ppp"
    '遍历根目录下的子文件夹
    Dim folder As Object ' 当前正在遍历的文件夹
    Set folder = fso.GetFolder(ff)

    Call SubProcessFolder2(folder)
    
End Sub
 

Sub SubProcessFolder2(folder)
    '子文件夹
    Dim subFolder As Object
    For Each subFolder In folder.subfolders
        Debug.Print subFolder.Path
        ' 如果还有更深层次的子文件夹,则进行递归调用
        If subFolder.subfolders.Count > 0 Then
            Call SubProcessFolder2(subFolder)
        End If
    Next subFolder
End Sub

VBA文件处理总结整理: 如何用VBA查找文件夹(包含子目录)下的所有文件 或 特定文件?以及批量创建文件_第2张图片

3  step3 遍历文件夹的(含子文件)内的所有文件

  • 遍历文件夹的,且包含含子文件内
  • 所有文件

3.1 因为第1个目录先读到,所以其目录名和文件名都要在,子目录函数外,单独显示

  • ff = "C:\Users\Administrator\Desktop\ppp"
  • debug.print ff
  • Call file3(ff)

3.2  显示文件函数

Sub file3(folder)
    fp = folder & "\*.*"
    fn = Dir(fp)
    Do While fn <> ""
       Debug.Print folder & "\" & fn
       fn = Dir()   '这句话应该放在打印后面
    Loop
End Sub

  • 先有第一个文件fn = Dir(fp)   
  • 然后,fn=dir() 需要写在获取文件名之后
  • 如果fn=dir()写在 打印文件名之前,则会导致第1个文件打印不到。
  • 也能避免打印出 空文件目录?

fn = Dir(fp)   

Do While fn <> ""
       Debug.Print folder & "\" & fn
       fn = Dir()   '这句话应该放在打印后面
Loop

3.3 测试代码

'-------------step3---------------------------------------------

Sub Folder3()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '确定根目录
    ff = "C:\Users\Administrator\Desktop\ppp"
    '遍历根目录下的文件
    Call file3(ff)

    '遍历根目录下的子文件夹
    Dim folder As Object ' 当前正在遍历的文件夹
    Set folder = fso.GetFolder(ff)

    Call SubProcessFolder3(folder)
    
End Sub
 

Sub file3(folder)
    fp = folder & "\*.*"
    fn = Dir(fp)
    Do While fn <> ""
       Debug.Print folder & "\" & fn
       fn = Dir()   '这句话应该放在打印后面
    Loop
End Sub


Sub SubProcessFolder3(folder)
    '子文件夹
    Dim subFolder As Object
    For Each subFolder In folder.subfolders
        Call file3(subFolder)
        
        ' 如果还有更深层次的子文件夹,则进行递归调用
        If subFolder.subfolders.Count > 0 Then
            Call SubProcessFolder3(subFolder)
        End If
    Next subFolder
End Sub

VBA文件处理总结整理: 如何用VBA查找文件夹(包含子目录)下的所有文件 或 特定文件?以及批量创建文件_第3张图片

4 step4 遍历文件夹的(含子文件)内的所有文件夹和文件

4.1 综合前面的功能

  • 遍历文件夹的,且包含子文件
  • 获取 文件夹(目录) / 文件

4.2 注意:根目录的目录名,文件遍历都要写在主函数里

根目录的目录名,文件遍历都要写在主函数里

4.3 测试代码

'--------step4---------------------------------------------


Sub Folder4()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '确定根目录
    ff = "C:\Users\Administrator\Desktop\ppp"
     Debug.Print ff
    '遍历根目录下的文件
    Call file4(ff)

    '遍历根目录下的子文件夹
    Dim folder As Object ' 当前正在遍历的文件夹
    Set folder = fso.GetFolder(ff)

    Call SubProcessFolder4(folder)
    
End Sub
 

Sub file4(folder)
    fp = folder & "\*.*"
    fn = Dir(fp)
    Do While fn <> ""
       Debug.Print fn   'folder & "\" & fn
       fn = Dir()   '这句话应该放在打印后面
    Loop
End Sub


Sub SubProcessFolder4(folder)
    '子文件夹
    Dim subFolder As Object
    For Each subFolder In folder.subfolders
        Debug.Print subFolder.Path
        Call file4(subFolder)
        
        ' 如果还有更深层次的子文件夹,则进行递归调用
        If subFolder.subfolders.Count > 0 Then
            Call SubProcessFolder4(subFolder)
        End If
    Next subFolder
End Sub

VBA文件处理总结整理: 如何用VBA查找文件夹(包含子目录)下的所有文件 或 特定文件?以及批量创建文件_第4张图片

5 step5:  遍历全部子目录,查找特定 目标 文件!

5.1 假设要查找一个target文件,是否存在这个目录下和详细路径

  • 假设要查找一个target文件,是否存在这个目录下,而且要找出具体的详细子目录,文件路径
  • 要找到这个target文件,只需要在 进行文件遍历时,比对判断即可

5.2 文件搜索函数,增加对target文件的比对判断

  • 如 target="" 方便用户查找设置目标文件
  • 在文件遍历中加入if 判断比对即可

Sub file5(folder)
    target = "20.txt"

    fp = folder & "\*.*"
    fn = Dir(fp)
    Do While fn <> ""
       Debug.Print fn   'folder & "\" & fn
            If fn = target Then
               Debug.Print "已经找到,位于" & folder & "\" & fn
            Else
               Debug.Print "此目录下找不到名为" & target & "的文件"
            End If

       fn = Dir()   '这句话应该放在打印后面
    Loop
End Sub

5.3 测试代码

'--------step5---------------------------------------------


Sub Folder5()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '确定根目录
    'C:\Users\snow\Desktop
'    ff = "C:\Users\Administrator\Desktop\ppp"
    ff = "C:\Users\snow\Desktop\ppp"
     Debug.Print ff
    '遍历根目录下的文件
    Call file5(ff)

    '遍历根目录下的子文件夹
    Dim folder As Object ' 当前正在遍历的文件夹
    Set folder = fso.GetFolder(ff)

    Call SubProcessFolder5(folder)
    
    
End Sub
 

Sub file5(folder)
    target = "20.txt"

    fp = folder & "\*.*"
    fn = Dir(fp)
    Do While fn <> ""
       Debug.Print fn   'folder & "\" & fn
            If fn = target Then
               Debug.Print "已经找到,位于" & folder & "\" & fn
            Else
               Debug.Print "此目录下找不到名为" & target & "的文件"
            End If
       fn = Dir()   '这句话应该放在打印后面
    Loop
End Sub


Sub SubProcessFolder5(folder)
    '子文件夹
    Dim subFolder As Object
    For Each subFolder In folder.subfolders
        Debug.Print subFolder.Path
        Call file5(subFolder)
        
        ' 如果还有更深层次的子文件夹,则进行递归调用
        If subFolder.subfolders.Count > 0 Then
            Call SubProcessFolder5(subFolder)
        End If
    Next subFolder
End Sub

C:\Users\snow\Desktop\ppp
p1.txt
此目录下找不到名为20.txt的文件
p2.txt
此目录下找不到名为20.txt的文件
p3.txt
此目录下找不到名为20.txt的文件
C:\Users\snow\Desktop\ppp\1
11.txt
此目录下找不到名为20.txt的文件
C:\Users\snow\Desktop\ppp\2
20.txt
已经找到,位于C:\Users\snow\Desktop\ppp\2\20.txt

6 STEP6: 批量创建子目录 和 批量创建文件(先判断是否存在) 并写入内容

6.1 这部分的目标是

  • 批量创建子目录 ,
  • 批量创建文件(先判断是否存在),
  • 写入内容

6.2  用 mkdir() 批量创建文件夹/目录

  • MkDir (ff & "\B" & i)
  • mrkdir() 可以用来创建目录

    '这段只能创建文件夹
    For i = 1 To 10
        If Dir(ff & "\B" & i & ".txt") = "" Then
            MkDir (ff & "\B" & i)
        End If
    Next

6.3  批量创建文件

    '这段创建文件,且先查文件是否已经存在,写入内容
    Count = 0
    For i = 1 To 20
        Filename = ff & "\AA" & i & ".txt"
        'If FileLen(Filename) = 0 Then  '判断文件长度这里不好使
        If Dir(Filename) = "" Then
            filenumber = FreeFile
            Open Filename For Output As filenumber
                Print #filenumber, i
                Count = Count + 1
            Close filenumber
        End If
    Next
    Debug.Print "运行完成,count=" & Count

6.3.1 先查文件是否已经存在

  • 错误: If FileLen(Filename) = 0 Then  '判断文件长度这里不好使
  • 正确: If Dir(Filename) = "" Then

6.3.2 批量创建文件

  • filenumber = FreeFile   '指定一个可用文件#别名序号
  • 用open  as  语句打开文件即可
  • Open Filename For Output As filenumber
  • 这样就利用 open as 语句,就创建了文件

  filenumber = FreeFile
            Open Filename For Output As filenumber
                 Print #filenumber, i
            Close filenumber

6.3.3 写入内容

  • 使用 print 语句即可
  • Print #filenumber, 内容

            Open Filename For Output As filenumber
                 Print #filenumber, i
            Close filenumber

6.3.4 打开和关闭文件

  • Open Filename For Output As filenumber
  • 这样就已经创建了文件
  • 对应的一定要加一句,防止文件的句柄泄露
  • Close filenumber

6.4 测试代码

Sub file_create1()
    ff = "C:\Users\snow\Desktop\ppp"
    fp = ff & "\*.*"

    '这段只能创建文件夹
    For i = 1 To 10
        If Dir(ff & "\B" & i & ".txt") = "" Then
            MkDir (ff & "\B" & i)
        End If
    Next

    '这段创建文件,且先查文件是否已经存在,写入内容
    Count = 0
    For i = 1 To 20
        Filename = ff & "\AA" & i & ".txt"
        'If FileLen(Filename) = 0 Then  '判断文件长度这里不好使
        If Dir(Filename) = "" Then
            filenumber = FreeFile
            Open Filename For Output As filenumber
                Print #filenumber, i
                Count = Count + 1
            Close filenumber
        End If
    Next
    Debug.Print "运行完成,count=" & Count
    
End Sub

你可能感兴趣的:(python,java,前端)