【问题标题】:fastest way to copy files/folders vba复制文件/文件夹的最快方法vba
【发布时间】:2021-07-24 21:07:02
【问题描述】:

我已经编写了一个带有几个 if 语句的递归脚本,以使用 FSO 将所有文件/文件夹附加到 vba 中,但这需要很长时间,我正在寻找其他方法或更快的附加文件的方法。使用 DIR 或 Call shell 是否更快?任何推理将不胜感激。

Option Explicit

Sub BackUpEverything()

Dim Sourcefolder As String
Const DestinationFolder As String = "C:\Users\Person1\FolderX"


Dim i As Long
Dim copyfolders(3) As String
copyfolders(0) = "C:\Users\FolderA"
copyfolders(1) = "C:\Users\FolderB"
copyfolders(2) = "C:\Users\FolderC"
copyfolders(3) = "C:\Users\FolderD"


For i = 0 To 3

Sourcefolder = copyfolders(i)
backupfiles Sourcefolder, DestinationFolder

Next i

Mgsbox "Done"

End Sub
Sub backupfiles(Sourcefolder As String, DestinationFolder As String)


Dim FSO As filesystemobject
Dim oFile As File
Dim oFolder As Folder

Set FSO = New filesystemobject

If Not FSO.folderexists(DestinationFolder) Then FSO.Createfolder DestinationFolder
On Error Resume Next
For Each oFile In FSO.Getfolder(Sourcefolder).Files

If FSO.getextensionname(oFile.Path) <> "pdf" Then

FSO.copyfile oFile.Path, DestinationFolder & " \ " & oFile.Name

Else


End If

Next oFile

On Error Resume Next

For Each oFolder In FSO.Getfolder(Sourcefolder).SUbfolders

backupfiles oFolder.Path, DestinationFolder & " \ " & oFolder.Name

Next oFolder


End Sub

【问题讨论】:

  • 如果您需要代码方面的帮助,您需要向我们展示您的代码。
  • 您发布的代码有几个问题,包括非法字符、未定义的变量以及谁知道还有什么问题。我建议你 (1) 将 Option Explicit 放在模块的顶部,从菜单中选择 Debug / Compile VBA Project,并继续修复错误,直到没有更多错误为止。 (2) 从代码中删除两个On Error Resume Next 语句。 (3) 运行宏,让我知道会发生什么。我可能可以帮助您解决任何剩余的问题。
  • @NicholasHunter 什么非法字符? On Error Resume Next 的原因是因为我有未知的文件夹/文件给了我权限被拒绝错误。这是唯一的原因,但我还没有找到更好的方法来避免这些问题。
  • 如果您将上面发布的代码粘贴到 VBA 模块中,您会很快发现语法错误——非法字符、未闭合的引号等。您可以通过将 Option Explicit 放在模块顶部并从菜单中选择 Debug / Compile VBA Project 来识别未定义的变量。 On Error Resume Next 语句意味着您将忽略该语句后面所有代码中的所有错误。即使那是你想做的,你也只需要做一次。如果您想忽略特定行中的特定错误,有更好的方法来做到这一点。
  • 哦,好吧,我明白了。我认为这些主要是我在这里复制/重新格式化时的拼写错误。当我运行它时它不会显示错误..不确定那是否有任何不同。我在这里的脚本中修复了一个或 2 个。更重要的是,如果您收到错误 70 权限被拒绝,您如何跳过文件夹或文件?

标签: vba shell directory copy fso


【解决方案1】:

事实证明这比我想象的要棘手,这可能不是一个完整的解决方案,但您可以尝试一下,看看它是否适合您。我认为问题的一部分是每次调用函数时都会创建文件系统对象。我将 fso 移到了模块级别,因此一遍又一遍地使用同一个。这意味着在迭代子文件夹的过程中不能递归,因此我使用 fso 创建子文件夹路径和名称的集合。错误处理主要针对单个代码块中的单个错误。

Option Explicit
    
Private fso As New FileSystemObject

Sub backupFiles(ByVal sourceFolder As String, ByVal destinationFolder As String)

    Dim oFile As File
    Dim oFolder As Folder
    Dim subfolders As Collection
    Dim var As Variant
    
    ' Create destination folder if it does not already exist.
    If Not fso.FolderExists(destinationFolder) Then fso.CreateFolder destinationFolder

    '** COPY FILES IN THIS FOLDER
    
    ' Set custom error handler.
    On Error GoTo GetFolder_Error
    
    ' Copy everything except pdf files.
    For Each oFile In fso.GetFolder(sourceFolder).Files
        If fso.GetExtensionName(oFile.Path) <> "pdf" Then
            fso.CopyFile oFile.Path, fso.BuildPath(destinationFolder, oFile.Name)
        End If
    Next oFile
    
    ' Resume default error handling.
    On Error GoTo 0

    '** BACK UP SUBFOLDERS

    Set subfolders = New Collection
    
    ' Set custom error handler.
    On Error GoTo GetFolder_Error
    
    ' Add all subfolders paths and names to collection.
    For Each oFolder In fso.GetFolder(sourceFolder).subfolders
        subfolders.Add Array(oFolder.Path, oFolder.Name)
    Next oFolder
    
    ' Resume default error handling.
    On Error GoTo 0
    
    ' Iterate collection.
    For Each var In subfolders
        backup var(0), fso.BuildPath(destinationFolder, var(1))
    Next var
    
Exit_Sub:
    Exit Sub
    
GetFolder_Error:
    ' If permission denied, print message and exit sub.
    If Err.Description = "Permission denied" Then
        Debug.Print Err.Description
        Resume Exit_Sub
    Else
        ' Default VBA error handler.
        Err.Raise Err.Number
    End If

End Sub

【讨论】:

  • 如果我没看错你会在出错后退出 sub 吗?我正在寻找它以跳过文件或文件夹,然后继续到下一个文件或文件夹
  • 还有你模块的第一部分在哪里?
  • Sub BackupEverything 没有改变,所以我没有费心去复制它。是的,如果子文件夹不能遍历子文件夹,它就会退出。在父文件夹中继续执行,与您的原始代码完全相同。
  • 它不喜欢 err.raise err.number,我不太确定它的作用。此外,如果您退出子程序,是否会跳过相应文件夹中可能已复制的所有其他潜在文件?
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2012-07-02
  • 2014-04-17
  • 2010-11-25
  • 1970-01-01
  • 2018-09-07
相关资源
最近更新 更多