为何Access VBA中Dir函数默认属性会读取只读文件?
解决VBA Dir函数无法排除只读文件的问题
你的问题出在对Dir函数attributes参数的理解偏差上,微软文档的描述存在歧义,实际行为和你预期的不一样:
- 你使用
vbNormal作为参数,以为会只返回无任何属性的文件,但实际上vbNormal的实际作用是返回非系统、非隐藏、非目录的文件,不管文件是否带有只读或存档属性(存档属性是绝大多数文件默认拥有的)。所以你的只读文件test.xlsx会被正常返回。
要实现排除只读文件的需求,需要手动检查每个文件的属性,修改后的代码如下:
Dim targetPath As String Dim fileName As String targetPath = "C:\Users\" '注意:这里建议替换为具体的子目录,比如"C:\Users\你的用户名\" fileName = Dir(targetPath & "*.*", vbNormal) Do While fileName <> "" ' 检查当前文件是否带有只读属性 If Not (GetAttr(targetPath & fileName) And vbReadOnly) Then Debug.Print fileName End If fileName = Dir Loop
关键说明:
- 使用
GetAttr函数获取文件的属性值,通过按位与运算GetAttr(...) And vbReadOnly判断文件是否为只读:如果结果非零,说明文件带有只读属性,跳过输出;否则正常输出。 - 注意路径的准确性:
C:\Users\通常是用户目录的根目录,里面存放的是各个用户的子文件夹,而非直接的文件,建议确认目标路径是否正确。
内容的提问来源于stack exchange,提问作者TheMountainThatCodes
相关产品推荐
相关产品推荐

