【问题标题】:Faster Way to copy files from one folder to another with Excel VBA使用 Excel VBA 将文件从一个文件夹复制到另一个文件夹的更快方法
【发布时间】:2026-02-06 20:20:06
【问题描述】:

我有一个可以工作的代码,但想知道是否有一种方法可以更快地复制。 FromPath 在共享文件夹中,ToPath 在我的桌面上。

Sub Update_Circulation_folder1()
Dim FSO As Object
Dim FromPath As String
Dim ToPath As String
Application.ScreenUpdating = False
        FromPath = Sheets("status").Range("H1").Value & "\"   ' DESKTOP

    ToPath = Sheets("status").Range("H2").Value & "\"     ' DESKTOP

    If Right(FromPath, 1) = "\" Then
        FromPath = Left(FromPath, Len(FromPath) - 1)
    End If

    If Right(ToPath, 1) = "\" Then
        ToPath = Left(ToPath, Len(ToPath) - 1)

    End If

    Set FSO = CreateObject("scripting.filesystemobject")

    If FSO.FolderExists(FromPath) = False Then
        MsgBox FromPath & " doesn't exist"
        Exit Sub
    End If

    FSO.CopyFolder source:=FromPath, Destination:=ToPath
 Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 复制一行:FSO.CopyFolder source:=FromPath, Destination:=ToPath。您是在问如何加快速度?
  • 总是FromPathToPath的末尾添加一个反斜杠,然后检查是不是这样,如果是这样, 删除它。 ......
  • 要使 I/O 工作得更快,您需要更快的 I/O 设备。从/到本地硬盘驱动器复制(不涉及网络),具有高速 SSD。没有任何代码可以使您的硬盘驱动器的读写器磁头工作得更快。
  • 如果您对工作代码的任何/所有方面的反馈感兴趣,我建议您将您的代码提交到 Code Review 以供同行评审 - 请注意,Rubberduck 检查会获得您在此处获得的潜在问题的数量,包括implicit ActiveWorkbook referencesuntyped function usages 等。
  • 你可以提前绑定它——什么会将 FSO 成员调用的绑定从运行时移动到编译时(这有其非常真实的优势,但这将是几毫秒, 不明显),但成员调用本身是 I/O 绑定的……如果您需要它运行得更快,请在更快的网络上运行它。

标签: excel vba directory path copy


【解决方案1】:

我不知道您是否可以在技术上使 复制 部分更快(正如@BigBen 提到的那样,这已经是一行),但正如我所提到的,您可以跳过检查 @987654321 @ 通过使用 Application.PathSeparator 来确保它是“合法”路径样式。

另外,我稍微调整了一下——怀疑它实际上会影响速度——但如果FromPath 不存在,你想退出子,就没有必要创建/检查ToPath

Sub Update_Circulation_folder1()
Dim FSO As Object
Dim FromPath As String
Dim ToPath As String
Application.ScreenUpdating = False
    FromPath = Sheets("status").Range("H1").Value ' DESKTOP
    If Right(FromPath, 1) <> Application.PathSeparator Then FromPath = FromPath & Application.PathSeparator
    If FSO.FolderExists(FromPath) = True Then

        ToPath = Sheets("status").Range("H2").Value ' DESKTOP
        If Right(ToPath, 1) <> Application.PathSeparator Then ToPath = ToPath & Application.PathSeparator

        Set FSO = CreateObject("scripting.filesystemobject")
        FSO.CopyFolder Source:=FromPath, Destination:=ToPath
    Else
        MsgBox FromPath & " doesn't exist"
    End If
    Application.ScreenUpdating = True
End Sub

当然,这有点微不足道,但我认为值得一提,因为它使用 Application.PathSeparator

【讨论】:

    【解决方案2】:

    我创建了一个免费的电子表格程序,可以非常快速地复制文件。 页面参考为:http://sam308.com/copy-multiple-files

    复制多个文件

    程序类型:免费程序

    系统要求

    支持 Visual Basic for Applications (VBA) 的任何 Microsoft Excel 版本。

    此程序将允许您将多个文件从任何源目标文件夹复制到任何目标目标文件夹。

    复制例程有两个版本,如下图所示:

    • 通过 Excel 复制文件

    • 创建副本批处理文件

    通过 Excel 复制文件使用宏例程通过 Excel 复制文件。它对于中小型文件非常有用,并且运行速度很快。

    创建复制批处理文件旨在用于大型文件,例如电影媒体和数据库文件。它会创建一个批处理 (.bat) 来复制文件。

    原因如下:

    如果您将大文件从一个文件夹拖放或复制粘贴到另一个文件夹,则复制过程非常缓慢。这是因为 Microsoft Windows 将每个文件缓存在内存中,以防再次将其拖放或粘贴到另一个位置。发生这种情况时,Microsoft Windows 必须在每次复制新文件时将缓存文件转储出内存。当一次复制多个大文件时,这会显着减慢复制过程。因此,我们使用 Microsoft Windows 的 xcopy 命令并创建一个绕过内存缓存的批处理文件 (.bat) 并使复制过程更快。创建批处理文件后,您只需双击批处理文件即可执行 xcopy 例程。

    以下是示例批处理文件的内容:

    Copy_Files.bat

    @echo 关闭

    echo 复制:[1/6] Home Video 1.mp4 & xcopy "D:\Media\Home Movies\Home Video 1.mp4" "E:\Media\Home Movies" /Q /J & echo。

    echo 复制:[2/6] Home Video 2.mp4 & xcopy "D:\Media\Home Movies\Home Video 2.mp4" "E:\Media\Home Movies" /Q /J & echo。

    echo 复制:[3/6] Home Video 3.mp4 & xcopy "D:\Media\Home Movies\Home Video 3.mp4" "E:\Media\Home Movies" /Q /J & echo。

    echo 复制:[4/6] Home Video 4.mp4 & xcopy "D:\Media\Home Movies\Home Video 4.mp4" "E:\Media\Home Movies" /Q /J & echo。

    echo 复制:[5/6] Home Video 5.mp4 & xcopy "D:\Media\Home Movies\Home Video 5.mp4" "E:\Media\Home Movies" /Q /J & echo。

    echo 复制:[6/6] Home Video 6.mp4 & xcopy "D:\Media\Home Movies\Home Video 6.mp4" "E:\Media\Home Movies" /Q /J & echo。

    下载

    您可以在这里下载程序:Copy_Multiple_Files.xls

    【讨论】:

      最近更新 更多