Excel VBA:获取网络路径上的文件状态不一致

Excel VBA:获取网络路径上的文件状态不一致,vba,excel,Vba,Excel,我试图修复Excel VBA宏中的一个间歇性错误,我将其归结为Excel在网络驱动器上的文件上运行Open命令时返回不一致的错误代码 下面的GEN_File_Status函数返回一个整数代码,我的其他代码使用它来确定文件的状态(作为fName参数传递)。一些错误代码(例如52和53)导致返回相同的值,因为我的调用代码不需要区分这些错误代码。fName应包含完整的文件路径和文件名 Public Function GEN_File_Status(ByVal fName As String) As I

我试图修复Excel VBA宏中的一个间歇性错误,我将其归结为Excel在网络驱动器上的文件上运行Open命令时返回不一致的错误代码

下面的GEN_File_Status函数返回一个整数代码,我的其他代码使用它来确定文件的状态(作为fName参数传递)。一些错误代码(例如52和53)导致返回相同的值,因为我的调用代码不需要区分这些错误代码。fName应包含完整的文件路径和文件名

Public Function GEN_File_Status(ByVal fName As String) As Integer

  Dim fileInd As Long

  On Error GoTo errHandle
  fileInd = FreeFile()
  Open fName For Input Lock Read As #fileInd
  Close fileInd
  On Error GoTo 0

  GEN_File_Status = 0       ' File exists and is unopened
  Exit Function

errHandle:
  Select Case Err.Number
    Case 52                 ' Bad filename or number
      GEN_File_Status = -1
    Case 53                 ' File not found
      GEN_File_Status = -1
    Case 70                 ' Permission denied (file may already be open)
      GEN_File_Status = 1
    Case 76                 ' Path not found
      GEN_File_Status = -2
    Case Else               ' Unknown error code
      GEN_File_Status = -2
  End Select
End Function
如果我在本地驱动器上运行,这很好,但是当我在网络驱动器上运行时,我偶尔会在调用代码中崩溃,这显然是因为Excel在确定文件路径是否不存在或是否无法通过网络确定时太快“放弃”了。按照“人类”的标准,这种故障并不要求网络速度慢——根据代码执行时间,Excel必须相当快地放弃

为了排除故障,我在fName参数中故意使用了网络上的无效路径,以查看Excel将返回什么错误代码。果然,大多数时候我都会遇到Err.Number=76(找不到路径),但也有一些时候会遇到Err.Number=53(找不到文件),这会导致调用代码出现问题。显然,这两个错误代码在某种意义上都是正确的,但如果我在本地C驱动器上使用无效路径,我会得到“76”错误代码。因此,显然“未找到路径”76错误优先,我需要一种方法来一致地确定这一点

有没有办法让Excel或多或少地“放慢速度,把错误代码弄对”?在此之前,我尝试插入DoEvents,以至少使处理器以最佳方式运行,但这没有帮助,因此这似乎确实是一个网络问题。最终,使用此方法或其他方法,我需要一种在网络驱动器上持续区分以下情况的方法:

  • 文件已存在

  • 文件不存在,但文件路径存在

  • 文件路径不存在


  • 任何帮助都将不胜感激,谢谢。

    我刚刚尝试了你的代码,得到了同样的结果。作为黑客,当你得到76个错误代码时,你可以尝试重新运行这个函数一次。当我这样做时,它“总是”(10000次试验)返回正确的结果-1,而在10000次试验中返回错误的结果是3倍。当涉及到网络驱动器时,我会使用其他方法。感谢Xtream和PatricK,这两种方法都有效,我最终选择了FSO,因为内置的FileExists和FolderExists方法允许我区分可能的情况。我想接受FSO答案,并对另一个进行upvote,但是我不熟悉堆栈溢出,并且没有看到我认为需要使用的答案左侧的upvote/accept选项。我会在网上查找更多信息来尝试解决这个问题,谢谢你在任何情况下的帮助。我刚刚尝试了你的代码,得到了相同的结果。作为黑客,当你得到76个错误代码时,你可以尝试重新运行这个函数一次。当我这样做时,它“总是”(10000次试验)返回正确的结果-1,而在10000次试验中返回错误的结果是3倍。当涉及到网络驱动器时,我会使用其他方法。感谢Xtream和PatricK,这两种方法都有效,我最终选择了FSO,因为内置的FileExists和FolderExists方法允许我区分可能的情况。我想接受FSO答案,并对另一个进行upvote,但是我不熟悉堆栈溢出,并且没有看到我认为需要使用的答案左侧的upvote/accept选项。我会在网上寻找更多的信息来解决这个问题,谢谢你在任何情况下的帮助。