使用FileCopy语句,可以在文件夹之间复制文件:
FileCopy 来源, 目的地
该语句的第一个参数是文件来源,明确你要复制的文件名称,该名称可以包含驱动名称。第二个参数是复制的目的地,可以包括驱动和文件夹的地址。两个参数都是必须的。假设你要将用户确定的一个文件复制到一个叫做“C:\Abort”的文件夹,下面的过程示范如何完成它:
Sub CopyToAbort()
Dim folder As String
Dim source As String
Dim dest As String
Dim msg1 As String
Dim msg2 As String
Dim p As Integer
Dim s As Integer
Dim i As Long
On Error GoTo ErrorHandler
folder = "C:\Abort"
msg1 = "The selected file is already in this folder."
msg2 = "was copied to"
p = 1
i = 1
' get the name of the file from the user 从用户处获取文件名称
source = Application.GetOpenFilename
' don’t do anything if cancelled 如果取消则不进行任何操作
If source = "False" Then Exit Sub
' get the total number of backslash characters "\" in the source 获取文件来源字符
串中的反斜杠数
' variable’s contents
Do Until p = 0
p = InStr(i, source, "\", 1)
If p = 0 Then Exit Do
s = p
i = p + 1
Loop
' create the destination file name 创建目的文件名称
dest = folder & Mid(source, s, Len(source))
' create a new folder with this name 创建同名文件夹
MkDir folder
' check if the specified file already exists in the 检查该文件是否在目的地已经存
在
' destination folder
If Dir(dest) <> "" Then
MsgBox msg1
Else
' copy the selected file to the C:\Abort folder 复制所选文件到文件夹“C:\Abort”
FileCopy source, dest
MsgBox source & " " & msg2 & " " & dest
End If
Exit Sub
ErrorHandler:
If Err = "75" Then
Resume Next
End If
If Err = "70" Then
MsgBox "You can’t copy an open file."
Exit Sub
End If
End Sub
过程CopyToAbort使用了Excel应用程序的方法GetOpenFilename从用户那里获取文件名称。该方法导致弹出内置的打开对话框。使用该对话框,你可以在任何驱动的任何文件夹里选择任何文件。如果用户取消了,VB就返回值“False”并且程序结束。如果用户选取了某个文件并且点击了打开,那么该选中的文件就会赋值到变量source。因为复制的目的,你只需要文件名称(而不需路径名),所以Do…Until循环用来找到最后一个反斜杠(“\”)在变量source里的位置。
接下来,VB给FileCopy语句的第二个参数准备了一个字母字符串,并且将其赋值到变量dest。该变量储存的字符串是目标文件夹(C:\Abort)和用户指定的文件名前面加反斜杠连接起来的。函数MkDir创建了一个叫C:\Abort的文件夹,如果它不存在于C盘上的话。如果这样的文件夹已经存在的话,那么VB就需要去处理错误75了。这个错误会被在程序后面的错误处理代码捕获。注意,错误处理器是一代码片断,它用ErrorHandler带冒号标志。
当VB遇到Resume Next语句时,就会继续执行过程里面导致错误的代码行下面的代码。这意味着语句MkDirfolder不会被执行。在这之后,程序将检查被选择的文件是否已经存在于目的文件夹。如果文件在那,那么用户将收到储存于变量msg1里面的信息;如果文件不存在于目的文件夹并且该文件当前没有打开的话,VB就会将文件复制到指定的文件夹,并且用相应的信息通知用户。如果该文件被打开了,VB将遇到运行时间错误70,并且因此而运行ErrorHandler里面的相应指令。
1. 在一名为FileCopyStatement的信魔窟里输入过程CopyToAbort
2. 运行该程序几次,从不同的文件夹里选择文件
3. 试着复制该程序之前复制过的文件到文件夹C:\Abort
4. 打开某个文件,并且在其开着的情况下试图用过程CopyToAbort来复制它
5. 运行本章前面准备的过程MyFiles,在立即窗口里列出文件夹C:\Abort里面的内容
注意,不要删除文件夹C:\Abort和你复制的文件,你将在下一节里面使用一个叫RemoveMe的VBA过程来同时删除文件和文件夹。