天天看点

xcopy复制文件夹及其子文件_VBA学习笔记48:VBA文件夹操作

xcopy复制文件夹及其子文件_VBA学习笔记48:VBA文件夹操作

学习资源:《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:

xcopy复制文件夹及其子文件_VBA学习笔记48:VBA文件夹操作

本节课中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 语句来删除所有文件。

xcopy复制文件夹及其子文件_VBA学习笔记48:VBA文件夹操作

增加一句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 "后面有个空格,不能漏写!

二、遍历文件夹中的文件
  1. 遍历指定文件夹中的文件 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
           
xcopy复制文件夹及其子文件_VBA学习笔记48:VBA文件夹操作

运行结果展示

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
           
xcopy复制文件夹及其子文件_VBA学习笔记48:VBA文件夹操作

运行结果显示

把判断语句注释掉,看看运行结果是如何的:

xcopy复制文件夹及其子文件_VBA学习笔记48:VBA文件夹操作

没做文件名判断

它会把文件夹下所有文件的名称都粘贴上去,所以记得要做判断。

文件夹遍历是很常用,还会再讲一节,整理好笔记,明天再发啦。

以上,晚安。