VBA-目录及文件操作代码汇总-sub文件

VBA-目录及文件操作代码汇总-sub文件

一、dir判断文件或文件夹是否存在

语法:Dir[(pathname[, attributes])]

Dir 函数的语法具有以下几个部分:

部分描述

pathname可选参数。用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到 pathname,则会返回零长度字符串 ("")。

attributes 可选参数。常数或数值表达式,其总和用来指定文件属性。如果省略,则会返回匹配 pathname 但不包含属性的文件。

attributes 参数的设置可为:

常数值描述

vbNormal 0 (缺省) 指定没有属性的文件。

vbReadOnly 1 指定无属性的只读文件

vbHidden 2 指定无属性的隐藏文件

VbSystem 4 指定无属性的系统文件 在Macintosh中不可用。

vbVolume 8 指定卷标文件;如果指定了其它属性,则忽略vbVolume 在Macintosh中不可用。

vbDirectory 16 指定无属性文件及其路径和文件夹。

vbAlias 64 指定的文件名是别名,只在Macintosh上可用。

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

说明在 Microsoft Windows 中, Dir 支持多字符 (*) 和单字符 (?) 的通配符来指定多重文件。

在第一次调用 Dir 函数时,必须指定 pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname。

Dir 会返回匹配 pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名,再一次调用 Dir,且不要使用参数。如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串,并要再次调用 Dir 时,就必须指定 pathname,否则会产生错误。不必访问到所有匹配当前 pathname 的文件名,就可以改变到一个新的 pathname 上。但是,不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用 Dir 不能连续地返回子目录。

提示由于文件名并不会以特别的次序来返回,所以可以将文件名存储在一个数组中,然后再对这个数组排序。

示例:

Sub dirtest() rem 以下两段,是attributes的属性不同,返回的结果有出入,一个是文件,一个文件夹。前提是存在test目录,如果不存在,注意下返回结果

MsgBox Dir(ThisWorkbook.Path & "\test\", vbDirectory)

MsgBox Dir(ThisWorkbook.Path & "\test\", vbNormal)

rem 使用通配符,限定文件类型,也可以限定文件名关键字等

MsgBox Dir(ThisWorkbook.Path & "\test\*.txt", vbNormal)

rem 以下两段代码的对比,可能是使用中遇到的异常情况,对比就知道差别了

MsgBox Dir(ThisWorkbook.Path & "\", vbNormal)

MsgBox Dir(ThisWorkbook.Path, vbNormal)

End Sub

反馈指定文件夹下,以t开头的文本文件列表

Sub dirlist()

flnm = Dir(ThisWorkbook.Path & "\Test\t*.txt")

Do While flnm <> ""

MsgBox ThisWorkbook.Path & "\Test\" & flnm

flnm = Dir

Loop

End Sub

二、kill 删除文件

语法:Kill pathname

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

说明在 Microsoft Windows 中,Kill 支持多字符 (*) 和单字符 (?) 的统配符来指定多重文件。

示例:

Sub Killtest()

Kill ThisWorkbook.Path & "\Test.xls"

End Sub

使用比较简单,但是需要注意文件是否存在或者打开等异常情况,不然会报错。

三、name 重命名文件名

语法:Name oldpathname As newpathname

oldpathname必要参数。字符串表达式,指定已存在的文件名和位置,可以包含目录或文件夹、以及驱动器。
newpathname必要参数。字符串表达式,指定新的文件名和位置,可以包含目录或文件夹、以及驱动器。而由 newpathname 所指定的文件名不能存在。

说明:Name语句重新命名文件并将其移动到一个不同的目录或文件夹中。如有必要,Name 可跨驱动器移动文件。但当newpathname 和 oldpathname 都在相同的驱动器中时,只能重新命名已经存在的目录或文件夹。Name不能创建新文件、目录或文件夹。

注意:在一个已打开的文件上使用Name,将会产生错误。必须在改变名称之前,先关闭打开的文件。Name参数不能包括多字符 (*) 和单字符 (?) 的统配符。

示例:文件名相同时,等同于移动文件,而不修改文件名

Sub nametest()

Name ThisWorkbook.Path & "\test\Test.txt" As "C:\Test\Test.txt"

End Sub

四、mkdir创建文件夹及rmdir删除文件夹

创建文件夹Mkdir path:必要的 path 参数是用来指定所要创建的目录或文件夹的字符串表达式。path可以包含驱动器。如果没有指定驱动器,则MkDir会在当前驱动器上创建新的目录或文件夹。

删除文件夹Rmdir path:必要的 path 参数是一个字符串表达式,用来指定要删除的目录或文件夹。path 可以包含驱动器。如果没有指定驱动器,则 RmDir 会在当前驱动器上删除目录或文件夹。

说明:如果想要使用 RmDir 来删除一个含有文件的目录或文件夹,则会发生错误。在试图删除目录或文件夹之前,先使用Kill 语句来删除所有文件。即,只能删除空文件夹。

Sub MkdirandRmdir()

rem 首先确定在当前路径下,test1是存在的才能再继续创建,不然会报错,就是路径不能一次性创建多层

fdpath = ThisWorkbook.Path & "\test1\Test2\"

MkDir fdpath

MsgBox Dir(fdpath, vbDirectory) <> ""

Dir ("")'大家可以注释掉,然后运行代码看看,会报错,原因可以自己思考下,文件夹存在!被使用?

RmDir fdpath

MsgBox Dir(fdpath, vbDirectory) <> ""

End Sub

五、filecopy拷贝文件

语法FileCopy source, destination

部分 描述
source必要参数。字符串表达式,用来表示要被复制的文件名。source 可以包含目录或文件夹、以及驱动器。
destination必要参数。字符串表达式,用来指定要复制的目地文件名。destination 可以包含目录或文件夹、以及驱动器。

说明:如果想要对一个已打开的文件使用 FileCopy语句,则会产生错误。另外在使用前建议使用dir判断下是否存在该文件

Sub FileCopytest()

FileCopy ThisWorkbook.Path & "\Test\Test.txt", "C:\Test.txt"

End Sub

本帖最后由 liulang0808 于 2016-2-6 10:59 编辑

六、filedialog文件对话框(第一部分)先上示例,因为涉及其他的方法属性

Sub Main()

Dim fd AsFileDialog

Set fd =Application.FileDialog(msoFileDialogFilePicker)

Dim vrtSelectedItem As Variant

With fd

.AllowMultiSelect = True

If .Show = -1Then

For Each vrtSelectedItem In .SelectedItems

MsgBox "Selected item's path: " &vrtSelectedItem

Next

Else

End If

End With

Set fd =Nothing

End Sub

(1)表达式.FileDialog(fileDialogType) fileDialogType 是必须的,对应的类型如下:

名称描述
msoFileDialogFilePicker3“文件选取器”对话框。
msoFileDialogFolderPicker4“文件夹选取器”对话框。
msoFileDialogOpen1打开对话框。
msoFileDialogSaveAs2另存为对话框。

(2)FileDialogFilters.Add 方法

文件对话框的文件类型下拉列表框的筛选器列表中添加一个新的文件筛选器。返回一个代表新添的文件筛选器的FileDialogFilter 对象。

语法:表达式.Add(Description, Extensions, Position)表达式必需。一个代表 FileDialogFilters 对象的变量。

名称必选/可选数据类型描述
Description必选String该文本表示要添加到筛选器列表中的文件扩展名的说明。
Extensions必选String该文本代表要添加到筛选器列表中的文件扩展名。可以指定多个扩展名,每个扩展名必须以分号分隔。例如,可以向以下字符串分配参数:“*.txt; *.htm”。注释:不需要在扩展名两侧添加括号。在说明和扩展名字符串连接成一个文件筛选器项时,Microsoft Office 将自动在扩展名字符串两侧添加括号。
Position可选Variant表示新控件在筛选列表中位置的数字。新筛选将插入到该位置的筛选之前。如果忽略该参数,筛选将添加到指定列表的末端。

说明:列表中的每个筛选器由两部分组成:文件扩展名(例如 .txt)和文件扩展名的文本说明(例如“文本文件”)。二者相结合,文件筛选器将在文件类型下拉列表框中显示为:文本文件(*.txt)。请注意,向列表中添加筛选器时,不会删除默认的筛选器。仅当选中窗口选项时才显示筛选器。如果 Position 无效,将显示超出范围运行时错误。如果 Description 和Extensions值无效,将显示运行时错误(分析)。

3FileDialog.Title 属性

设置或获取使用 FileDialog 对象显示的文件对话框的标题。可读/写

(4)FileDialog.InitialFileName 属性

设置或返回一个 String 类型的值,代表文件对话框中初始显示的路径或文件名。可读/写

说明:在指定文件名时可以使用 '*' 和 '?' 通配符,但是指定路径时不能使用这些通配符。'*' 符号代表任意数量的连续字符,而 '?' 代表单个字符。例如,.InitialFileName = "c:\c*s.txt" 将返回“charts.txt”和“checkregister.txt”。

如果指定了路径而没有指定文件名,则对话框中将显示文件筛选器所允许的所有文件。

如果指定了位于初始文件夹中的某个文件,则对话框中只显示该文件。

如果指定了初始文件夹中不存在的某个文件名,则对话框中将不包含文件。在 InitialFileName 属性中指定的文件类型将覆盖文件筛选器的设置。

如果指定了无效路径,则使用上次使用的路径。如果使用无效路径,则会向用户显示警告消息。

将此属性设置为长度大于 256 个字符的字符串将导致运行时错误。

.InitialFileName = "d:\test1\test.txt" 建议大家测试下看看,看看对话框各个部分,特别是文件名位置的情况

(5)FileDialog.AllowMultiSelect 属性

如果允许用户从文件对话框中选择多个文件,则为 True。可读/写。

说明:此属性对“文件夹选取器”对话框或“另存为”对话框无效,因为用户永远无法从这些类型的文件对话框中选择多个文件。

(6)FileDialog.Show 方法

显示文件对话框并返回一个 Long 类型的值,指示用户按下的是“操作”按钮 (-1) 还是“取消”按钮 (0)。在调用 Show 方法时,在用户关闭文件对话框之前不会执行其他代码。在“打开”和“另存为”对话框中,在使用了 Show 方法后会立即使用 Execute 方法执行用户操作。

第七部分,部分属性相关的函数

1FileLen(pathname) 返回一个Long,代表一个文件的长度,单位是字节。

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

说明:当调用 FileLen 函数时,如果所指定的文件已经打开,则返回的值是这个文件在打开前的大小。

注意若要取得一个打开文件的长度大小,使用LOF 函数(LOF 函数,返回一个Long,表示用 Open 语句打开的文件的大小,该大小以字节为单位)。

2FileDateTime(pathname) 返回一个 Variant (Date),此为一个文件被创建或最后修改后的日期和时间。必要的pathname 参数是用来指定一个文件名的字符串表达式。pathname 可以包含目录或文件夹、以及驱动器。

3GetAttr(pathname) 返回一个 Integer,此为一个文件、目录、或文件夹的属性。

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

常数描述
vbNormal0常规
vbReadOnly1只读
vbHidden2隐藏
vbSystem4系统文件 在 Macintosh 中不可用。
vbDirectory16目录或文件夹
vbArchive32上次备份以后 在 Macintosh 中不可用.,文件已经改变
vbalias64指定的文件名是别名。 只在 Macintosh中可用。

说明

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

Result = GetAttr(FName) And vbArchive

4SetAttr pathname, attributes 设置文件属性

部分描述
pathname必要参数。用来指定一个文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。
Attributes必要参数。常数或数值表达式,其总和用来表示文件的属性。

具体可设置属性同于getattr

第七部分,部分属性相关的函数-示例

Sub fileAttr()

flnm = ThisWorkbook.Path & "\Test.xls"

str1 = str1 & "文件大小:" & FileLen(flnm) & " 字节" & vbCrLf

str1 = str1 & "文件被最后修改的时间:" & FileDateTime(flnm) & vbCrLf

str1 = str1 & "文件属性:" & GetAttr(flnm) & vbCrLf

MsgBox str1

SetAttr flnm, vbReadOnly

MsgBox "文件" & flnm & "设置了只读属性" & Chr(13) & "文件当前属性:" & GetAttr(flnm)

SetAttr flnm, vbNormal

MsgBox "文件" & flnm & "去除了只读属性"

End Sub

推荐阅读