【问题标题】:Test if file exists using VBA or Excel without "DIR"使用没有“DIR”的 VBA 或 Excel 测试文件是否存在
【发布时间】:2016-06-13 06:39:28
【问题描述】:

每次找到特定文件时,我都会进入文件夹目录并查看文件夹以获取特定数据。

如果我在一个文件夹中打开我要查找的文件,但它不在其中,我会收到调试错误。很明显,我需要测试目录以查看文件是否存在,如果不存在则不要尝试打开它(这很好,并非所有文件夹都有主题文件)。

DIR 函数是测试文件是否存在的首选,但因为我使用 DIR 函数来逐步浏览文件夹,所以我的测试表明我不能使用 DIR 来测试中间的特定文件我的代码,因为 VBA 在我逐步浏览文件夹时感到困惑。

如何在不使用 DIR 的情况下测试已知文件名的存在?我尝试了我找到的功能:

函数 FileExists(fullFileName As String) As Boolean FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0 结束函数

不幸的是,我还没有弄清楚如何将其实际写入我正在构建的 SUB 中。我找到的样本(以及其他类似的样本),但通常并不清楚有抱负的新手需要什么。在这种情况下,不知道 LEN 和 DIR 中会发生什么,以及为什么在看起来像 DIM 语句的情况下需要完整文件名(因为 As Boolean)。我还发现,如果我尝试将这个函数放在我的子程序中,VBA 就会不高兴。

我可以尝试什么会奏效?我只想要一个函数周围的 IF 语句,它会告诉我文件是否存在。

【问题讨论】:

  • 只要你不需要它在 Mac 上工作,你可以使用 Scripting.FileSystemObject msdn.microsoft.com/en-us/library/x23stk5t(v=vs.84).aspx
  • 蒂姆,感谢您的参考。我提取了那里的内容,但没有得到预期的结果,因此我稍微增强了脚本以尝试提供帮助: Sub FileExistence()Dim fso Dim Folder As String Folder = Dir("c:\users\", vbDirectory) MsgBox文件夹集 fso = CreateObject("Scripting.FileSystemObject") If (fso.FileExists("c:\users\")) Then MsgBox " exists."否则 MsgBox " 不存在。"结束如果结束子
  • 抱歉,新手。蒂姆,感谢您的参考,但它并没有给我预期的结果。我添加了 DIR & MSGBOX 以确认目录存在: Sub Test_File_Existence() Dim fso Dim Folder As String Folder = Dir("c:\users\", vbDirectory) MsgBox Folder Set fso = CreateObject("Scripting.FileSystemObject") If ( fso.FileExists("c:\users\")) 然后 MsgBox “存在”。否则 MsgBox " 不存在。" End If End Sub 我得到不同的结果。 DIR 给出了一个点,即用户中的第一个目录; IF 有 msgbox 说该文件不存在。 FSO 失败。 ???
  • 通常最好在您的问题中添加任何新代码。使用 {} 按钮对其进行格式化,使其可读。
  • 编辑您的问题

标签: function excel file-exists vba


【解决方案1】:

假设我们正在文件夹 C:\TestFolder 或该文件夹的子文件夹中寻找包含 "happiness" 的文件。我们想知道:

  • 文件名
  • 它的位置

如果找不到“幸福”,我们也希望得到通知。考虑:

Dim FileIsThere As Boolean

Sub MAIN()

   Dim FileSystem As Object
   Dim TopFolder As String

   TopFolder = "C:\TestFolder"
   FileIsThere = False
   Set FileSystem = CreateObject("Scripting.FileSystemObject")

   Process FileSystem.GetFolder(TopFolder)

   If Not FileIsThere Then
        MsgBox "happiness cannot be obtained, settle for the absence of misery"
   End If
 End Sub

 Sub Process(Folder)
    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
      Process SubFolder
    Next

    Dim File
    For Each File In Folder.Files
        If InStr(1, File.Path, "happiness") > 0 Then
            tpath = Left(File.Path, Len(File.Path) - Len(File.Name))
            MsgBox tpath & "  contains  " & File.Name
            FileIsThere = True
        End If
    Next
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2011-05-04
    • 2017-01-20
    • 1970-01-01
    • 2011-02-16
    • 2019-06-05
    • 2015-04-19
    相关资源
    最近更新 更多