VBA获取指定文件夹下所有文件和子文件目录的文件

公司运营部门需要把影像资料梳理一遍,文件目录特别多,文件量也大,大概40多个G。自己写了一个读取目录下所有子文件的脚本
开始参考了 VBA获取某文件夹下所有文件和子文件目录的文件中的代码,按照此方式获取的结果有问题。
问题1 无法获取目录名中包含“.”的子目录

'-- 获得所有子目录
Do Until i > k
    f = Dir(file(i), vbDirectory)
        Do Until f = ""
            If InStr(f, ".") = 0 Then
                k = k + 1
                ReDim Preserve file(1 To k)
                file(k) = file(i) & f & "\"
            End If
            f = Dir
        Loop
    i = i + 1
Loop

代码中使用InStr(f, “.”) = 0 判断,只要名字中包含"."就按照文件处理

问题2 无法获取扩展名为空的文件

'-- 获得所有子目录下的所有文件
For i = 1 To k
   f = Dir(file(i) & "*.*")    '通配符*.*表示所有文件,*.xlsx Excel文件
   Do Until f = ""
      'Range("a" & x) = f
      Range("a" & x).Hyperlinks.Add Anchor:=Range("a" & x), Address:=file(i) & f, TextToDisplay:=f
       x = x + 1
       f = Dir
   Loop
Next

于是,自己实现了一个支持文件夹名称带“.”或文件名不带扩展名的。
实现过程
新建一个文件,在sheet1中增加两个按钮,一个用来选取文件夹,一个用来执行查询

  1. 选择文件脚本
Option Explicit
Sub 打开文件夹()

   With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = -1 Then
            Worksheets("Sheet1").Range("C5").Value = .SelectedItems(1)
        End If
    End With
 
End Sub

  1. 执行脚本

Sub 按钮1_Click()

On Error Resume Next

Dim folderObj As Object
Dim currFolder
Dim fdCnt As Integer

Dim sDir As String

Dim dirExist, f As String
Dim file(), subFolder(), allfd() As String
Dim fileNum, k, x, idx, i, j, listNum
Dim threeDir As String

fileNum = 1
x = 1
k = 1
j = 0
i = 1

sDir = Worksheets("Sheet1").Range("C5").Value

'=== 0.清除数据=============================================
Sheet2.UsedRange.Clear

Worksheets("Sheet2").Range("A1").Value = "序号"
Worksheets("Sheet2").Range("C1").Value = "文件名"
Worksheets("Sheet2").Range("D1").Value = "文件路径"
Worksheets("Sheet2").Range("E1").Value = "文件格式"
Worksheets("Sheet2").Range("E1").Interior.Color = RGB(255, 255, 0)
Worksheets("Sheet2").Range("A1").Interior.Color = RGB(255, 255, 0)
Worksheets("Sheet2").Range("C1").Interior.Color = RGB(255, 255, 0)
Worksheets("Sheet2").Range("D1").Interior.Color = RGB(255, 255, 0)
Worksheets("Sheet2").Range("E1").Borders.LineStyle = xlContinuous
Worksheets("Sheet2").Range("A1").Borders.LineStyle = xlContinuous
Worksheets("Sheet2").Range("C1").Borders.LineStyle = xlContinuous
Worksheets("Sheet2").Range("D1").Borders.LineStyle = xlContinuous

'=== 1.判断选择的文件夹是否有效===============================

dirExist = dir(sDir, vbDirectory)
If dirExist = "" Then
    MsgBox ("选择的文件夹无效")
    Exit Sub
End If

'=== 2.获取所有子目录======================================

ReDim subFolder(1 To i)

subFolder(1) = sDir & "\"
f = dir(subFolder(1), vbDirectory)
Do Until f = ""
    If f <> "." And f <> ".." Then
        If (GetAttr(subFolder(1) & f) And vbDirectory) = 16 Then
            'Worksheets("Sheet3").Range("A" & k).Value = subFolder(1) & f & "\"
            k = k + 1
            ReDim Preserve subFolder(1 To k)
            subFolder(k) = subFolder(1) & f & "\"
        End If
    End If
    f = dir
Loop
i = i + 1

Dim tmp As Integer
tmp = 0

For Each fd In subFolder
    tmp = tmp + 1
    ReDim Preserve allfd(1 To tmp)
    i = 1
    k = 1
    Erase file
    ReDim file(1 To i)
    file(i) = fd
    allfd(tmp) = fd
    Worksheets("Sheet3").Range("B" & tmp).Value = allfd(tmp)

    If subFolder(1) = file(i) Then
         f = dir
        i = i + 1
    Else

    Do Until i > k
        f = dir(file(i), vbDirectory)
        Do Until f = ""
            If f <> "." And f <> ".." Then
                If (GetAttr(file(i) & f) And vbDirectory) = 16 Then
                    k = k + 1
                    ReDim Preserve file(1 To k)
                    file(k) = file(i) & f & "\"
                    tmp = tmp + 1
                    ReDim Preserve allfd(1 To tmp)
                    allfd(tmp) = file(i) & f & "\"
                   ' Worksheets("Sheet3").Range("B" & tmp).Value = allfd(tmp)
                End If
            End If
            f = dir
        Loop
        i = i + 1
    Loop
    End If
Next

'=== 3.获取所有子目录下的文件======================================
'
Dim threeStr As String

x = 2
idx = 1
For i = 1 To tmp
  
    f = dir(allfd(i) & "*.*")
    Do Until f = ""
        Worksheets("Sheet2").Range("A" & x).Value = idx
        Worksheets("Sheet2").Range("C" & x).Value = f
        Worksheets("Sheet2").Range("D" & x).Value = Replace(allfd(i), sDir, "") & f
        'Worksheets("Sheet2").Range("E" & x).Value = getFileType(f)
        
        'Worksheets("Sheet2").Range("B" & x).NumberFormatLocal = "@"
        'Worksheets("Sheet2").Range("B" & x).Value = getToubaodanHao(sDir, allfd(i))

      
        f = dir
        x = x + 1
        idx = idx + 1
    Loop
  
Next


End Sub



最终效果:
在这里插入图片描述
在这里插入图片描述

参考

  1. W3CSchool VBA教程
  2. VBA获取某文件夹下所有文件和子文件目录的文件
  3. VBA 快速入门
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀不封

打赏就是对作者的一种赞赏和鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值