![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5COhBDMkFDNzIDZ4UTZlRzMyMmZwQzM5UDZlZWOwQWZ38CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
学习资源:《Excel VBA从入门到进阶》第48集 by兰色幻想
忘了之前老师有没有讲过Dir函数了,还是写一下吧,再开始正文吧:
Dir函数:返回一个
String,它表示与指定路径下的文件、目录或文件夹的名称。
语法:Dir ( pathname, 属性 )
①pathname:指定地址,第一次调用必填。
若要获取与 pathname 匹配的任何其他文件名,请重新调用
Dir且不填写参数。
简单举例:
filename = Dir("C:" & "*.doc") ‘在C盘查找word文件,并返回word文档的名称给filename
filename2 = Dir '再次调用Dir,在C盘查找第二份word文件,并返回它的文档名给filename2
Dir查找遍历的顺序是按照系统排序。如果对排序有要求,可用数组存储文件名,然后对数组进行排序。
一般会搭配循环遍历文件,结束循环的条件为Dir返回空值。
当不再有匹配的文件名时,
Dir将返回零长度字符串 ("")。在返回零长度字符串后,后续再调用需重新填写参数pathname,否则将发生错误。
②属性:选填,有如下属性c:
本节课中Dir函数第二个参数主要使用vbNormal(默认,即不写),和 vbDirectory(可以返回路径下的指定文件和文件夹)。
一、文件夹基本操作 1. 判断文件夹是否存在使用dir函数去判断文件夹路径,如果结果为"",则表示不存在。
例1:判断当前文件路径下是否存在"2011年报表2"文件夹。
Sub w1()
If Dir(ThisWorkbook.path & "2011年报表2", vbDirectory) = "" Then
MsgBox "不存在"
Else
MsgBox "存在"
End If
End Sub
2. 新建文件夹 Mkdir语句,创建一个文件夹。
语法:MkDir 路径
例2:在当前文件路径下创建"Test"文件夹。
Sub w2()
MkDir ThisWorkbook.path & "Test"
End Sub
3. 删除文件夹 RmDir语句可以删除一个空的文件夹。
语法:RmDir 路径
例3:删除当前文件路径下的"Test"文件夹。
Sub w3()
RmDir ThisWorkbook.path & "Test"
End Sub
但注意:RmDir只能删除空文件夹,如果使用 RmDir 来删除一个含有文件的目录或文件夹,会发生错误(如下图提示)。所以在试图删除目录或文件夹之前,先使用 Kill 语句来删除所有文件。
增加一句kill语句,清空Test文件夹下的所有文件:
Sub w3()
Kill ThisWorkbook.Path & "Test*"
RmDir ThisWorkbook.Path & "Test"
End Sub
4. 文件夹重命名 使用Name语句重命名。
语法:Name 路径/旧文件名 as 路径/新文件名
例4:把"Test"文件夹重命名为“Test2”。
Sub w4()
Name ThisWorkbook.path & "Test" As ThisWorkbook.path & "Test2"
End Sub
5. 文件夹移动 同样使用name方法,可以达到移动的效果,而且连文件夹的文件一起移动。
例5:把"Test2"文件夹移动到“2011年报表”文件夹下。
Sub w5()
Name ThisWorkbook.Path & "Test2" As ThisWorkbook.Path & "2011年报表Test2"
End Sub
6. 文件夹复制 用FileSystemObject对象的CreateObject方法(CopyFolder方法)复制文件夹。
语法:object.CopyFolder source, destination[, overwrite]
object:必须, FileSystemObject对象的名字。
source:必须,指明一个或多个被复制文件夹的字符串文件夹说明,可包括通配符,如*。destination:必须,被复制文件夹和子文件夹的接受端的字符串,不允许有通配符。
overwrite:可选,表示已存在的文件夹是否被覆盖。如果为True,文件被覆盖,如果为False,文件不被覆盖。缺省值为True。
例6:把"Test2"文件夹复制到“2011年报表”文件夹下,设置可复制相同名称文件夹。
Sub CopyFile_fso()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFolder ThisWorkbook.Path & "Test2", ThisWorkbook.Path & "2011年报表",1
End Sub
7. 打开文件夹 使用shell函数桌面管理程序打开文件夹。
语法:shell “explorer 路径”
例7:打开“2011年报表”文件夹。
Sub w7()
Shell "explorer.exe " & ThisWorkbook.Path & "2011年报表", 1
End Sub
注:"explorer.exe "后面有个空格,不能漏写!
二、遍历文件夹中的文件- 遍历指定文件夹中的文件 dir+循环
例:获取“2011年报表”文件夹下所有EXCEL文件的名称。
用dir获取文件夹中的文件,再用Do Loop语句循环记录。
Sub 遍历文件()
Dim Filename As String, mypath As String, k As Integer
mypath = ThisWorkbook.Path & "2011年报表"
Range("A1:A10") = "" '先清空要填写的单元格区域(加快程序运行)
Filename = Dir(mypath & "*.xls") '
Do
k = k + 1
Cells(k, 1) = Filename
Filename = Dir
Loop Until Filename = ""
End Sub
运行结果展示
2. 遍历子文件 dir(,vbDirectory
)+循环+文件名判断dir第二个参数是vbdirectory可以返回路径下的指定文件和文件夹。
例:获取“2011年报表”文件夹下所有文件夹的名称。
文件夹路径不像文件名的格式是“*
.*”,所以增加文件名判断。
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
运行结果显示
把判断语句注释掉,看看运行结果是如何的:
没做文件名判断
它会把文件夹下所有文件的名称都粘贴上去,所以记得要做判断。
文件夹遍历是很常用,还会再讲一节,整理好笔记,明天再发啦。
以上,晚安。