|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 peter199083 于 2023-2-14 20:16 编辑
本人VBA水平不高,各位请轻喷
最近学习如何遍历文件夹中所有子文件夹,教程中称为“父子转换法”,即使用双层循环:
- 一层是循环查找所有父文件夹下面的子文件夹;
- 一层是循环记录一个父文件夹下面的子文件夹路径,子文件夹可转换为父文件夹,直至没有新的子文件夹出现,循环结束。
核心技术是:设置一个数组arr1放置文件夹的路径。
一层是循环查找所有父文件夹下面的子文件夹,循环变量设为i;
另一层是循环记录一个父文件夹下面的子文件夹路径,循环变量设为k。初始值i=1,k=1
- Do While i < k Or i = k
- f = Dir(arr1(i), vbDirectory) '查找文件或文件夹路径返回到f,arr1()长度初始化设置非常大
- On Error Resume Next 'vbDirectory找出无拓展名的文件,导致遍历遇到无拓展名文件会报错,所以要加上这句忽略报错
- Do
- If InStr(f, ".") = 0 And f <> "" Then
- 'vbDirectory返回的值有文件路径,所以要判断返回的路径是否为文件的(文件格式会带".",如".xls"),和路径是否为空
- k = k + 1
- arr1(k) = arr1(i) & f & ""
- End If
- f = Dir
- Loop Until f = ""
- i = i + 1
- Loop
复制代码
我自己在复原上述功能的过程中想到使用“for循环+动态数组”代替上例中的第一层循环(如下),我期待的结果是在程序完成第一个循环以后,会自动更新arr的上限,因此循环的上限也同时更新,整个循环不停止。
但是我发现我的程序在完成了一次循环以后就自动停止了,所以我只能理解成for循环的上限是不能动态调整的。我的理解正确么?是否可以考虑用ByRef来传递参数?谢谢。
For i = 1 To UBound(arr1)
f = Dir(arr1(i), vbDirectory)
On Error Resume Next
Do
If InStr(f, ".") = 0 And f <> "" Then
k = k + 1
ReDim arr1(k)
arr1(k) = arr1(i) & f & "\"
End If
f = Dir
Loop Until f = ""
i = i + 1
Next i |
|