Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 8226|回复: 13

[已解决][vba] dir函数如何区分文件与文件夹

[复制链接]
发表于 2013-1-18 14:42 | 显示全部楼层 |阅读模式
Sub 遍历当层目录下的文件夹()
  Dim Filename As String, mypath As String, k As Integer
  mypath = ThisWorkbook.path & "\2011年报表\"
  Range("A1:A10") = ""
  Filename = Dir(mypath, vbDirectory)
  Do
    If Not Filename Like "*.*" Then
      k = k + 1
      Cells(k, 1) = Filename
    End If
    Filename = Dir
  Loop Until Filename = ""
End Sub

如这段代码,用文件带不带点来区文件与文件夹,感觉不是很准确,
如一文件夹名称里带点,或文件无扩展名,文件名不带点之类的,如何区分 ?

最佳答案
2013-1-18 15:12
  1. Sub 遍历当层目录下的文件夹()
  2.     Dim Filename As String, mypath As String, k As Integer
  3.     mypath = ThisWorkbook.Path & "\2011年报表"
  4.     'mypath = ThisWorkbook.Path & ""
  5.     Range("A1:A10") = ""
  6.     Filename = Dir(mypath, vbDirectory)
  7.     Do While Len(Filename) > 0
  8.         If Filename <> "." And Filename <> ".." Then
  9.             If (GetAttr(mypath & "" & Filename) And vbDirectory) = 16 Then
  10.                 k = k + 1
  11.                 Cells(k, 1) = Filename
  12.             End If
  13.         End If
  14.         Filename = Dir
  15.     Loop
  16. End Sub
复制代码
发表于 2013-1-18 15:02 | 显示全部楼层
回复

使用道具 举报

发表于 2013-1-18 15:03 | 显示全部楼层
GetAttr 函数

返回一个 Integer,此为一个文件、目录、或文件夹的属性。
回复

使用道具 举报

发表于 2013-1-18 15:04 | 显示全部楼层
GetAttr(pathname)

必要的 pathname 参数是用来指定一个文件名的字符串表达式。pathname 可以包含目录或文件夹、以及驱动器。

返回值

由 GetAttr 返回的值,是下面这些属性值的总和:

常数 值 描述
vbNormal 0 常规
vbReadOnly 1 只读
vbHidden 2 隐藏
vbSystem 4 系统文件 在 Macintosh 中不可用。
vbDirectory 16 目录或文件夹
vbArchive 32 上次备份以后 在 Macintosh 中不可用.,文件已经改变
vbalias 64 指定的文件名是别名。 只在 Macintosh中可用。



注意 这些常数是由 VBA 指定的,在程序代码中的任何位置,可以使用这些常数来替换真正的值。

说明

若要判断是否设置了某个属性,在 GetAttr 函数与想要得知的属性值之间使用 And 运算符与逐位比较。如果所得的结果不为零,则表示设置了这个属性值。例如,在下面的 And 表达式中,如果档案 (Archive) 属性没有设置,则返回值为零:

Result = GetAttr(FName) And vbArchive
回复

使用道具 举报

发表于 2013-1-18 15:12 | 显示全部楼层    本楼为最佳答案   
  1. Sub 遍历当层目录下的文件夹()
  2.     Dim Filename As String, mypath As String, k As Integer
  3.     mypath = ThisWorkbook.Path & "\2011年报表"
  4.     'mypath = ThisWorkbook.Path & ""
  5.     Range("A1:A10") = ""
  6.     Filename = Dir(mypath, vbDirectory)
  7.     Do While Len(Filename) > 0
  8.         If Filename <> "." And Filename <> ".." Then
  9.             If (GetAttr(mypath & "" & Filename) And vbDirectory) = 16 Then
  10.                 k = k + 1
  11.                 Cells(k, 1) = Filename
  12.             End If
  13.         End If
  14.         Filename = Dir
  15.     Loop
  16. End Sub
复制代码
回复

使用道具 举报

发表于 2013-1-18 15:12 | 显示全部楼层
.和..有点讨厌,
回复

使用道具 举报

 楼主| 发表于 2013-1-18 15:16 | 显示全部楼层
Filename = Dir(mypath, vbDirectory)

这里已经设置了 vbDirectory 属性 , 但还是把新建文本文件给带了出来


如用上面那段代码

我的文件下有

文件夹:《1.1》、《测试文件夹》
文件:《新建文本文件.TXT》、《新建文本文件》

用代码之后,得到的结果是

《测试文件夹》、《新建文本文件》
回复

使用道具 举报

 楼主| 发表于 2013-1-18 15:17 | 显示全部楼层
能否,把上面的代码改了,让结果出来的是:《1.1》、《测试文件夹》

回复

使用道具 举报

 楼主| 发表于 2013-1-18 15:26 | 显示全部楼层
用GetAttr 怎么试都报错,如果能用,能否直接写到代码,再全部代码复制一下
回复

使用道具 举报

发表于 2013-1-18 15:27 | 显示全部楼层
vbDirectory 16 指定无属性文件及其路径和文件夹。
你看帮助里对这个的说明嘛。

你要判断是否是文件或文件夹,就再用GETATTR对返回的进行判断。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 04:38 , Processed in 0.309594 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表