VBA文件处理总结整理1: 如何用VBA查找文件夹(包含子目录)下的所有文件 或 特定文件?以及批量创建文件 您所在的位置:网站首页 vba查找文件夹下文件的内容是什么意思 VBA文件处理总结整理1: 如何用VBA查找文件夹(包含子目录)下的所有文件 或 特定文件?以及批量创建文件

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

2024-06-21 23:18| 来源: 网络整理| 查看: 265

目录

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

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

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

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

ff = "C:\Users\Administrator\Desktop\ppp"debug.print ffCall 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

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

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有