【问题标题】:FileSystemObject code has started to throw an errorFileSystemObject 代码已开始抛出错误
【发布时间】:2012-06-06 22:27:14
【问题描述】:

不知道为什么,但是下面的代码已经开始抛出一个未知错误。当宏运行时 Excel 停止响应。

  • 为什么会出现这个错误?
  • 具有相同功能的替代路由是什么?

此代码位于 Windows 7 机器上的 Excel 2010 xlsm 文件中。

 Sub CopyFolderToCasinoDirectory()

        'reference Microsoft Scripting Runtime
        On Error Resume Next

        Dim fso As Scripting.FileSystemObject
        Set fso = New Scripting.FileSystemObject
        fso.CopyFolder _
              "\\xxxfileserve\department$\DBA\Opers\All Operators\yyy", _
              "\\xxxfileserve\department$\DBA\Cas\yyy", _
              True

        On Error GoTo 0
        Set fso = Nothing

    End Sub

好的 - 我已经更改了路径,以便它尝试移动更少的文件 - 它犹豫不决,但最终还是通过了。我怀疑上述失败是因为指定目录中的文件太多?目前有 753 个文件 - 可能太多了?

RonDeBruin 给了我很多关于如何测试或改变逻辑的想法。一种可能是先在目标文件夹上使用 DeleteFolder,然后在目标文件夹上使用 CopyFolder?

【问题讨论】:

  • 删除On Error Resume Next你得到什么错误?
  • 我试过把这条线去掉,但 Excel 没有响应,即崩溃!
  • 当你说“没有反应”时,你有没有试过让它离开一分钟?它在复制大量文件时可能会挂起。
  • @Bridge 我已经尝试将其放置几分钟并且 excel 变灰并且是 (Not Responding) ...也许如果我非常耐心它会回来,但我想我会寻找一个解决问题。我相信每次都复制所有这些文件确实有点多。

标签: vba vb6 excel filesystemobject


【解决方案1】:

抱歉这么晚才回复。我无法获取网络目录,我想在发布代码之前对其进行测试:)

试试这个。运行Sub Sample() 它仍然挂起吗?您还将在 Windows 对话框中看到正在传输的文件。

Private Declare Function SHFileOperation _
Lib "shell32.dll" Alias "SHFileOperationA" _
(lpFileOp As SHFILEOPSTRUCT) As Long

Private Type SHFILEOPSTRUCT
    hWnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAborted As Boolean
    hNameMaps As Long
    sProgress As String
End Type

Private Const FO_COPY = &H2

Sub Sample()
    Dim path1 As String, path2 As String

    path1 = "\\xxxfileserve\department$\DBA\Opers\All Operators\yyy"
    path2 = "\\xxxfileserve\department$\DBA\Opers\All Operators\yyy"

    If CopyFolder(path1, path2) Then
        MsgBox "Copied"
    Else
        MsgBox "Not copied"
    End If
End Sub

Private Function CopyFolder(ByVal sFrom As String, _
ByVal sTo As String) As Boolean
    Dim SHFileOp As SHFILEOPSTRUCT
    On Error GoTo Whoa
    CopyFolder = False
    With SHFileOp
        .wFunc = FO_COPY
        .pFrom = sFrom
        .pTo = sTo
    End With
    SHFileOperation SHFileOp
    CopyFolder = True
    Exit Function
Whoa:
    MsgBox "Following error occurred while copying folder " & sFrom & vbCrLf & _
    Err.Description, vbExclamation, "Error message"
End Function

【讨论】:

  • 顺便说一句 - 如何开始学习 Win32 代码?我看到人们经常使用它,但我应该参考哪些资源来开始了解它?
  • 这是 Bob 的一个不错的提示集合。看看你喜不喜欢? :) bobmoore.mvps.org/Win32/W32main_ns.htm
  • +1 不是严格意义上的答案,而是一个有效但乏味的替代方案!
【解决方案2】:

关于fso.CopyFolder方法有几点:

  • 如果目标不存在,则复制源文件夹及其所有内容。这是通常的情况。
  • 如果目标是现有文件,则会发生错误。
  • 如果目标是一个目录,则会尝试复制该文件夹及其所有内容。
  • 如果源中包含的文件已存在于目标中,则如果覆盖为 False,则会发生错误。否则,它将尝试将文件复制到现有文件上。
  • 如果目标是只读目录,如果尝试将现有只读文件复制到该目录并且覆盖为 False,则会发生错误。

确保这些都不会成为您的sub 的障碍。

但是用另一种方式测试它

fso.CopyFolder _
              "\\xxxfileserve\department$\DBA\Opers\All Operators\yyy\*", _
              "\\xxxfileserve\department$\DBA\Cas\yyy", _
              True

希望这会有所帮助。

【讨论】:

  • 之前运行正常,但本月运行时挂起 - 所以我不确定,虽然相关,但您的 cmets 如何提供帮助?
  • @whytheq:你有没有费心检查这 5 种情况中的一种现在是否出现了,而以前可能没有出现过?这就是这条评论可能会有所帮助的方式。在你的问题中,你没有表明你自己检查过这个。 +1 有助于发现问题
  • @Jean-FrançoisCorbett 这些条件只是来自MSDN 的直接副本。如果我减少文件夹的内容,那么应用程序会挂起,但最终会完成 - 但完整的内容会挂起
  • 明天我将使用 Cylian 建议的通配符替代方法进行测试
猜你喜欢
  • 2014-12-25
  • 2014-07-13
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
相关资源
最近更新 更多