来自和excel表的VBA Copyfile:无效的过程调用或参数(错误5)

时间:2016-05-31 07:52:00

标签: excel vba excel-vba

list file image

如果没有任何文件,我想从excel表中的列表中复制文件。但我在fso.CopyFile filepath, Destination中有一个错误5。 我不知道是什么问题,你能帮我吗?

Set fso = CreateObject("scripting.filesystemobject")
Destination = "C:\Users\test\"
Set oFolder = fso.GetFolder(Destination)

Set workboo = Workbooks.Open("C:\Users\listing.xlsx")
Set worksh = workboo.Worksheets("List_File")
For j = 1 To 10
    numrows = worksh.Range("A" & Rows.Count).End(xlUp).Row
        For i = 2 To numrows
            icol = 2 * j - 1
            filepath = worksh.Cells(i, icol).Value
            If Not fso.FileExists(Destination) Then
             fso.CopyFile filepath, Destination

            End If
        Next
Next

workboo.Close
    End Sub

3 个答案:

答案 0 :(得分:1)

您的代码希望Destination是一个文件,但它是一个目录。 FSO documentation告诉你:

  

如果source包含通配符或目标以路径分隔符()结尾,则假定destination是现有的   用于复制匹配文件的文件夹。否则,目的地是   假设是要创建的文件的名称。在任何一种情况下,三个   复制单个文件时可能会发生这种情况。

     
      
  • 如果目标不存在,则会复制源。这是通常的情况。

  •   
  • 如果destination是现有文件,如果overwrite为False则会发生错误。否则,尝试复制源   现有文件。

  •   
  • 如果destination是目录,则会发生错误。

  •   

确保将Destination设置为文件名,而不是目录,或者使用通配符将filepath设置为多个文件。

顺便说一句,如果预计Destination仍然是目录,则不应该对fso.FileExists(Destination)进行测试。

如果需要,您可以使用BuildPath()GetFileName()构建目标文件名:

Public Sub SomeName()
    Set fso = CreateObject("scripting.filesystemobject")
    Destination = "C:\Users\test\"
    Set oFolder = fso.GetFolder(Destination)

    Set workboo = Workbooks.Open("C:\Users\listing.xlsx")
    Set worksh = workboo.Worksheets("List_File")
    For j = 1 To 10
        numrows = worksh.Range("A" & Rows.Count).End(xlUp).Row
        For i = 2 To numrows
            icol = 2 * j - 1
            filepath = worksh.Cells(i, icol).Value
            filedest = fso.BuildPath(Destination,fso.GetFileName(filepath))
            If Not fso.FileExists(filedest) Then
                fso.CopyFile filepath, filedest
            End If
        Next
    Next
    workboo.Close
End Sub

我没有编辑你的代码,但用Dim ...定义变量应该是个好主意。

答案 1 :(得分:0)

看到你的代码我同意Trimax他指出的问题领域。除此之外,你需要确保以下内容:
1.确保“filepath”变量是文件的完全限定路径,例如“d:\ yourdirctoryname \ yourfilename.extension”
2.确保文件存在于源位置,如果不是您为“目标”执行的“文件路径”编写的相同验证 3.如果要复制相同的扩展文件,则应使用通配符将文件复制到目标,这样可以减少系统工作量。有关更多详细信息,请参阅https://msdn.microsoft.com/en-us/library/e1wf9e7w(v=vs.84).aspx以获取通配符代码。

我相信它会解决这个问题。

答案 2 :(得分:0)

根据您收集的信息,我设计了该计划。我分别保留了源文件夹和文件字符串。为了提取文件名,我使用了TRIM和MID函数。

 sFile = Trim(Mid((worksh.Cells(i, icol).Text), 39, 99))

您可以检查源文件夹的长度" P:\ Desktop \ Nouveau档案(4)\来源\"完全按LEN函数,然后将1加到该长度以开始文件名。此外,我暂时保留了99个字符总数,您可以根据您使用的最大文件名长度进行调整。还请确保程序中的源文件夹和目标文件夹正确,并与计算机上的物理文件夹路径匹配。我已经在我的计算机上对它进行了测试,它在样本数据上运行良好。我还设置了对Microsoft Scripting Runtime Library的引用。

Sub CopyingFiles_Q37539919()
    'Declaration
    Dim FSO
    Dim sFile As String
    Dim sSFolder As String
    Dim sDFolder As String
    Dim i As Integer, j As Integer
    Dim icol As Long
    Dim numrows As Long

    Set workboo = Workbooks.Open("C:\Users\listing.xlsx")
    Set worksh = workboo.Worksheets("List_File")
    numrows = worksh.Range("A" & Rows.Count).End(xlUp).Row
    Debug.Print numrows

    'Change to match the source folder path.
    sSFolder = "C:\mydir_s\" '

    'Change to match the destination folder path.
    sDFolder = "C:\Users\test\"

    For j = 1 To 10
    For i = 2 To numrows
                icol = 2 * j - 1
        sFile = Trim(Mid((worksh.Cells(i, icol).Text), 39, 99)) ' Adjust the figure 39 for start of file name and 99 for maximum length of file name

        Debug.Print sFile
        Debug.Print sSFolder & sFile

        'Create Object for File System
        Set FSO = CreateObject("Scripting.FileSystemObject")

        If Not FSO.FileExists(sSFolder & sFile) Then
         MsgBox "Specified File Not Found in Source Folder", vbInformation, "Not Found"
        End If

        'Copying If the Same File is Not Located in the Destination Folder
        If Not FSO.FileExists(sDFolder & sFile) Then
        FSO.CopyFile (sSFolder & sFile), sDFolder, True
        MsgBox "Specified File Copied to Destination Folder Successfully", vbInformation, "Done!"

        Else
           MsgBox "Specified File Already Exists In The Destination Folder", vbExclamation, "File Already Exists"

        End If
    Next
    Next

End Sub