在 Excel VBA 中,我们可以使用 FileSystemObject(FSO)对象或 VBA 内置文件处理函数来复制、移动、删除或重命名文件。
复制文件
使用 CopyFile 方法复制文件
Sub CopyFileUsingFSO()
Dim fso As Object
Dim sourceFile As String
Dim destinationFile As String
sourceFile = "D:\Demo\test.txt" ' 源文件路径
destinationFile = "D:\Demo\Temp\test.txt" ' 目标文件路径
' 创建 FileSystemObject 实例
Set fso = CreateObject("Scripting.FileSystemObject")
' 始果代码出错会跳转到 ErrorHandler 标签
On Error GoTo ErrorHandler
' 复制文件,False 参数表示不覆盖同名文件
fso.CopyFile sourceFile, destinationFile, False
' 清理
Set fso = Nothing
Exit Sub
' 如果文件复制过程中发生错误(例如文件不存在、目标路径不存在等),显示错误信息。
ErrorHandler:
MsgBox "复制文件时出错:" & Err.Description, vbCritical
End Sub
注意
FileSystemObject 对象的 CopyFile 方法默认会覆盖目标路径下的同名文件,如果需要不覆盖目标路径下的同名文件,要设置第三参数为 False
,或者你可以先检查目标文件是否存在并根据需要不否覆盖。
目标路径必须是一个有效的路径,且必须具有写入权限。
若要重命名复制的文件,只需在目标路径中包含新文件名即可:
FileSystemObject.CopyFile "D:\Demo\test.txt", "D:\Demo\Temp\test_new.txt"
使用 FileCopy 语句复制文件
Sub CopyFileUsingFileCopy()
Dim sourceFile As String
Dim destinationFile As String
sourceFile = "D:\Demo\test.txt" ' 源文件路径
destinationFile = "D:\Demo\Temp\3test.txt" ' 目标文件路径
' 始果代码出错会跳转到 ErrorHandler 标签
On Error GoTo ErrorHandler
' 使用 FileCopy 复制文件
FileCopy sourceFile, destinationFile
MsgBox "文件复制成功!", vbInformation
Exit Sub
' 如果文件复制过程中发生错误(例如文件不存在、目标路径不存在等),显示错误信息。
ErrorHandler:
MsgBox "复制文件时出错:" & Err.Description, vbCritical
End Sub
注意
使用 FileCopy 会覆盖目标路径下的同名文件,所以要确保目标文件夹中没有同名文件,或者你可以先检查目标文件是否存在并根据需要不否覆盖。
目标路径必须是一个有效的路径,且必须具有写入权限。
若要重命名复制的文件,只需在目标路径中包含新文件名即可:
FileCopy "D:\Demo\test.txt", "D:\Demo\Temp\test_new.txt"
移动文件
使用 MoveFile 方法移动文件
Sub MoveFileUsingFSO()
Dim fso As Object
Dim sourceFile As String
Dim destinationFile As String
sourceFile = "D:\Demo\test.txt" ' 源文件路径
destinationFile = "D:\Demo\Temp\test.txt" ' 目标文件路径
' 创建 FileSystemObject 实例
Set fso = CreateObject("Scripting.FileSystemObject")
' 检查源文件是否存在
If fso.FileExists(sourceFile) Then
' 检目标文件路径是否存在同名文件
If fso.FileExists(destinationFile) Then
MsgBox "文件已存在!", vbCritical
Else
' 移动文件
fso.MoveFile sourceFile, destinationFile
MsgBox "文件移动成功!", vbInformation
End If
Else
MsgBox "源文件不存在!", vbCritical
End If
' 清理
Set fso = Nothing
End Sub
注意
使用 FileSystemObject 对象的 MoveFile 方法移动文件时,如果目标路径否存在同名文件会出错,为避免出错,应该检查目标路径否存在同名文件。
若要移动并重命名文件,只需在目标路径中包含新文件名即可:
FileSystemObject.MoveFile "D:\Demo\test.txt", "D:\Demo\Temp\test_new.txt"
使用 Name 语句移动文件
Sub MoveFileUsingName()
Dim sourceFile As String
Dim destinationFile As String
sourceFile = "D:\Demo\test.txt" ' 源文件路径
destinationFile = "D:\Demo\Temp\test.txt" ' 目标文件路径
' 移动文件
On Error GoTo ErrorHandler
Name sourceFile As destinationFile
MsgBox "文件移动成功!", vbInformation
Exit Sub
ErrorHandler:
MsgBox "移动文件时出错:" & Err.Description, vbCritical
End Sub
注意
Name 语句不但可以用来重命名文件,而且也可以用来移动文件。当源文件和目标文件位于不同目录时,Name 语句会将文件从源路径“移动”到目标路径。
删除文件
使用 DeleteFile 方法删除文件
Sub DeleteFile()
Dim fso As Object
Dim filePath As String
filePath = "D:\Demo\test.txt" ' 要删除的文件路径
' 创建 FileSystemObject 实例
Set fso = CreateObject("Scripting.FileSystemObject")
' 检查文件是否存在
If fso.FileExists(filePath) Then
' 删除文件
fso.DeleteFile filePath
MsgBox "文件已删除!"
Else
MsgBox "文件不存在!"
End If
' 清理
Set fso = Nothing
End Sub
注意
使用 FileSystemObject 对象的 DeleteFile 方法时,如果要删除带有只读属性的文件,则应该设置 DeleteFile 的第二参数为 True
(如:fso.DeleteFile filePath, True
),否则会出错显示"拒绝的权限"。
使用 Kill 语句删除文件
Sub DeleteFileUsingKill()
Dim filePath As String
filePath = "D:\Demo\test.txt" ' 要删除的文件路径
' 始果代码出错会跳转到 ErrorHandler 标签
On Error GoTo ErrorHandler
' 删除文件
Kill filePath
Exit Sub
' 如果文件删除过程中发生错误(例如文件不存在、只读文件等),显示错误信息。
ErrorHandler:
MsgBox "删除文件时出错:" & Err.Description, vbCritical
End Sub
注意
如果对一个已经打开的文件使用 Kill 语句删除时会产生运行错误。
在 Microsoft Windows 中,Kill
支持使用多字符通配符 (*
) 和单字符通配符 (?
) 来指定多个文件。如:
Kill "D:\Demo\test.txt" ' 删除 test.txt
Kill "D:\Demo\2024年*.txt" ' 删除2024年开头的txt文件
Kill "D:\Demo\2024年?月.txt" ' 删除以2024年开头以月结尾,中间一个任意字符的txt文件
Kill "D:\Demo\*.txt" ' 删除所有txt文件
重命名文件
如前面的例子所示,使用 FSO 对象的 CopyFile
方法、MoveFile
方法或 FileCopy
语句、Name
语句均可以重命名文件。如果你只需要重命名文件,使用 Name
语句简单,如果你需要更多的控制(例如检查文件是否存在、删除多个文件等),FileSystemObject 对象更适合。
总结
- 复制文件:
fso.CopyFile
(可设置是否覆盖同名文件)或FileCopy
语句 - 移动文件:
fso.MoveFile
或Name
语句 - 删除文件:
fso.DeleteFile
(可删除只读属性文件)或Kill
语句(支持通配符) - 重命名文件:使用
fso.CopyFile
或fso.MoveFile
或Name
语句
使用 Excel VBA 内置语句操作文件不需要额外引用,简单易用,如果你需要更多的控制,FileSystemObject
对象更适合。