它不存在的VBA copyfile

时间:2016-08-03 11:47:10

标签: excel vba excel-vba

我在2列AB中有一个文件列表。

  • A列是B
  • 的来源
  • B列是目的地

以下代码将文件从源复制到目标。但如果目的地存在,它会给我错误。条件是什么,如果发现它存在,它将不会做任何事情?

代码有什么问题?

  Sub FC_Copy()

Dim ClientsFolderDestination
Dim fso As New FileSystemObject
Dim rep_destination
Dim source

    lastrow = ThisWorkbook.Worksheets("XClients").Cells(Application.Rows.Count, 1).End(xlUp).Row

    For i = 5 To lastrow
        source = ThisWorkbook.Worksheets("XClients").Cells(i, 1).Value
        ClientsFolderDestination= ThisWorkbook.Worksheets("XClients").Cells(i, 2).Value
        If fso.FileExists(source) Then
            rep_destination = Left(ClientsFolderDestination, Len(ClientsFolderDestination) - Len(fso.GetFileName(ClientsFolderDestination)) - 1)

         If Not fso.FolderExists(rep_destination) Then
          sub_rep = Split(rep_destination, "\")
          myrep = sub_rep(0)
          If Not fso.FolderExists(myrep) Then
              MkDir myrep
           End If
           For irep = 1 To UBound(sub_rep)
              myrep = myrep & "\" & sub_rep(irep)
               If Not fso.FolderExists(myrep) Then
                    MkDir myrep
               End If
         Next
    End If

            fso.CopyFile source, ClientsFolderDestination
        End If
    Next i
end sub

2 个答案:

答案 0 :(得分:2)

试试这个。

  1. 这不使用Microsoft Scripting Runtime Library
  2. 它使用一个常用功能来检查文件和文件夹的存在
  3. 它适合目标路径,如C:\Sample.xlsx
  4. <强>代码

    Sub FC_Copy()
        Dim ws As Worksheet
        Dim source As String, Destination As String, sTemp As String
        Dim lRow As Long, i As Long, j As Long
        Dim MyAr As Variant
    
        Set ws = ThisWorkbook.Sheets("XClients")
    
        With ws
            '~~> Find Last Row
            lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    
            For i = 5 To lRow            
                source = .Range("A" & i).Value
                Destination = .Range("B" & i).Value                
                MyAr = Split(Destination, "\")
    
                '~~> This check is required for destination paths like C:\Sample.xlsx
                If UBound(MyAr) > 1 Then
                    sTemp = MyAr(0)                
                    For j = 1 To UBound(MyAr)
                        sTemp = sTemp & "\" & MyAr(j)
                        If Not FileFolderExists(sTemp) = True Then MkDir sTemp
                    Next j
                End If
    
                If Not FileFolderExists(Destination) Then FileCopy source, Destination
            Next i
        End With
    End Sub
    
    Public Function FileFolderExists(strFullPath As String) As Boolean
        On Error GoTo Whoa
        If Not Dir(strFullPath, vbDirectory) = vbNullString Then FileFolderExists = True
        On Error GoTo 0
    Whoa:
    End Function
    

答案 1 :(得分:1)

If Not fso.FileExists(ClientsFolderDestination) Then
    fso.CopyFile source, ClientsFolderDestination
End If

或者如果您想覆盖目标文件

fso.CopyFile source, ClientsFolderDestination, True

CopyFile Method