VBA每日一练(13) 用dir 查找文件夹,特定文件名,文件类型,遍历等

  • Post author:
  • Post category:其他


1 DIR基本功能

1.1Dir函数

  • 语法   Dir[(pathname[, attributes])]
  • 其中两个参数都是可选参数,也就是可以默认缺省  dir  或 dir()
  • 返回值缺省范围为””
  • 返回一个 String,用以表示一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配。
  • pathname    可选参数。用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到 pathname,则会返回零长度字符串 (“”)。
  • attributes    可选参数。常数或数值表达式,其总和用来指定文件属性。如果省略,则会返回匹配 pathname 但不包含属性的文件。
  • attributes 参数的设置可为:
  • vbNormal    0    (缺省) 指定没有属性的文件。
  • vbReadOnly    1    指定无属性的只读文件
  • vbHidden    2    指定无属性的隐藏文件
  • VbSystem    4    指定无属性的系统文件 在Macintosh中不可用。
  • vbVolume    8    指定卷标文件;如果指定了其它属性,则忽略vbVolume在Macintosh中不可用。
  • vbDirectory    16    指定无属性文件及其路径和文件夹。
  • vbAlias    64    指定的文件名是别名,只在Macintosh上可用。

1.2 dir()基本用法注意

  • 如果要返回文件夹,需要加入参数    ,vbDirectory
  • 如果要返回文件, 默认缺省就可以,不需要加参数
  • 可以使用* ?等通配符
  • 必须可以判断是否包含这样文字的文件     \*星期1*
  • 配合len() 判断是否为空
  • 重复输入一条语句  dir(path),指针并不会往下移动,会重置这个操作
  • 反而第一句 dir(path)  后面 dir缺省,指针会往下走
Sub ponyma11()

Debug.Print Dir("C:\Users\Administrator\Desktop\test1", vbDirectory _
)
Debug.Print ""

Debug.Print Dir("C:\Users\Administrator\Desktop\test1\test101.txt")
Debug.Print ""


Debug.Print Dir("C:\Users\Administrator\Desktop\test1\*.txt")
Debug.Print Dir("C:\Users\Administrator\Desktop\test1\*.txt")
Debug.Print ""


Debug.Print Dir("C:\Users\Administrator\Desktop\test1\*.*")
Debug.Print Dir("C:\Users\Administrator\Desktop\test1\*.*")
Debug.Print ""

End Sub

2 循环查找文件夹内的所有文件,dir用法特殊

  • 不要反复用dir(path) 这样的完整写法
  • 除了第一次,后面循环内都写缺省写法 dir 或者 dir()
  • 如果后面还继续用完整写法,那么会总是只查到一个文件
Sub jackma002()
 
Dim path1, path2
 
 path1 = "C:\Users\Administrator\Desktop\test1"
 path2 = "\*.*"
 
 
file1 = Dir(path1 & path2)
Debug.Print file1

 
 Do While file1 <> ""
      k = k + 1
      file1 = Dir()
      Debug.Print file1
 Loop
 
 Debug.Print k
 
 End Sub

3 尝试 dir() 缺省能往下移动指针的原因?

  • 完整path目录的 dir(path), 推测每次都是重新dir(path),而且如果循环里加了这句,会死循环的
  • 第一次dir(path)  后面dir,缺省会往下遍历文件
 Sub ponyma1()

 path1 = "C:\Users\Administrator\Desktop\test1"
 path2 = "\*.*"
 path3 = "\*.txt"
 
 
Debug.Print Dir(path1 & path2)
Debug.Print Dir(path1 & path2)
Debug.Print Dir(path1 & path2)


Debug.Print Dir(path1 & path3)
Debug.Print Dir
Debug.Print Dir


 End Sub

4  改为函数,带参数传入,其他地方可以引用


Sub jackma007()
    x1 = jackma008("C:\Users\Administrator\Desktop\test1", "\*.*") 
End Sub



Function jackma008(path1, path2)
'Dim path1, path2  '会报错当前范围内的声明错误
' path1 = "C:\Users\Administrator\Desktop\test1"
' path2 = "\*.*"
 
file1 = Dir(path1 & path2)
Debug.Print file1

 Do While file1 <> ""
      k = k + 1
      file1 = Dir()
      Debug.Print file1
 Loop
 Debug.Print k
 
 End Function

5 文件次序问题,和cmd

VB里调用CMD


http://club.excelhome.net/thread-1455541-1-1.html

更复杂的用法

6 其他写法

  • VBA里不知道有没有其他写法
  • 好像其他语言有其他 写法,比如下面的C#的写法

string[] fileNames = Directory.GetFiles(path);

string[] directories = Directory.GetDirectories(path);

foreach (string file in fileNames)

foreach (string file in fileNames.OrderBy(name => name))

7参考文档

子文件夹遍历


https://blog.csdn.net/yunbiao/article/details/84759151


https://wenku.baidu.com/view/e38504bcf8c75fbfc77db2e9.html


http://www.360doc.com/content/16/0628/22/15869834_571513031.shtml



版权声明:本文为xuemanqianshan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。