代码之家  ›  专栏  ›  技术社区  ›  PGSystemTester

VBA Dir在名为“.”或Documents.xlsx的目录中提取Ghost文件

  •  3
  • PGSystemTester  · 技术社区  · 6 年前

    我完全同意使用VBA Dir 循环浏览文件夹中文件的过程。通常,我没有问题,但是在我正在处理的一个项目中,DIR正在获取一个文件,据我所知,这个文件不存在。这最终导致我的代码调试错误。

    这是包含文件的文件夹的屏幕截图。 enter image description here

    然而,当代码试图执行open时,它会出错(总是在成功地首先执行一个文件之后),并指出问题是由于某个名为 Documents.XLSX . 我很少使用xlsx类型,所以我不知道它从何而来。

    Error VB Shows

    debug.print 它将名称打印为“.”,而不是Document.xlsx名称。

    enter image description here

    有人知道为什么会这样吗?

    我确信这与打开和关闭文件有关,因为如果删除此操作,代码 Debug.Prints 正确使用三个文件名。我想也许关闭文件就是挂着它,所以我包括 DoEvents 结束后,但没有变化。在运行下一行 myFile = Dir 但这仍然没有解决问题。

    任何关于这是为什么或如何进一步排除故障的建议都将非常有用。

    不幸的是,我甚至没有解决办法。如果我设置为仅在myFile<gt;“.”时执行,则可以跳过,但对于“.”的消失和重新出现,将放弃“下一个”选项,从而导致循环无限期重复。 代码是相当标准的。

    Dim myFile, WB as Workbook
    myFile = Dir(dirPath)
    
    Do While (myFile <> "")
    
    'I included this for my own research
    Debug.Print myFile
    
    'Opens workbook
    'This next line is where the error happens
    Set WB = Workbooks.Open(Filename:=dirPath & myFile)
    
    'Macro does stuff
    
    'Closes
    WB.Close savechanges:=False
    DoEvents
    
    myFile = Dir
    
    Loop
    

    更新感谢在评论中截取 我没想到在另一个模块中,我有一个自定义函数,用于确保用户在单元格中输入了有效的文件路径。我还应该提到我的VBA代码 'do Something

    这个代码是。。。。

    Public Function isValidPath(FilePATH as String) as Boolean
       If Right(FilePATH,1) <> "\" Then FilePATH = FilePATH & "\"
    
       If Dir(FilePath, vbDirectory) <> vbNullString then isValidPath = True
    
    End Function
    

    谁想赚一个免费的??

    1 回复  |  直到 6 年前
        1
  •  2
  •   user4039065 user4039065    6 年前

    一个文件夹总是包含两件事。一个 . 表示自身和 ..

    如果将Dir与vbDirectory参数一起使用,并在路径后面加上反斜杠,则将返回两个结果;a . ..

    如果将Dir与不带反斜杠后缀的vbDirectory参数一起使用,则将返回一个结果:文件夹的名称。不需要循环;它要么在那里,要么不在。

    虽然可以有一个没有扩展名的文件,名为“作为文件夹查找的内容”,但在同一父文件夹中不能有一个文件夹和一个没有扩展名的文件。虽然不是故障安全的,但这是一个合理的结论,如果它出错了,那么您可能应该在任何情况下仔细研究它。

    总而言之,如果您寻找一个带有或不带有反斜杠的文件夹,那么您将收到一个非零长度的字符串,除非您有一个非常特殊的情况。

    “helper”函数代码“as is”应该没问题。

    Public Function isValidPath(FilePATH as String) as Boolean
    
       isValidPath = cbool(len(Dir(FilePath, vbDirectory)))
    
    End Function
    

    顺便说一句,如果你是一个浏览错误的爱好者,那么这就完成了同样的事情,不管有没有尾随的反斜杠(即,保证文件夹存在于单个子文件夹级别)。

    on error resume next
    mkdir FilePATH 
    on error goto 0
    

    如果我没记错ms dos 3.3,即使是c:\也有。。但我记不起它指向哪里了。