Access VBA 检查文件是否存在

6

我有一个分为前端和后端的数据库。

我已经在以下位置运行它: i)我的办公室 ii)在我个人电脑上更新/测试。

根据计算机运行情况,我的后端文件正在不同的文件夹中运行。

我想放置一段代码并检查文件是否存在。

代码:

Sub FileExists()
Dim strPath As String   '<== Office.
Dim strApplicationFolder As String
Dim strPathAdmin As String   '<== Admin.

strPath = "\\iMac\Temp\"
strApplicationFolder = Application.CurrentProject.Path
strPathAdmin = strApplicationFolder & "\Temp\"

If Dir(strApplicationFolder & "SerialKey.txt") = "" Then
'===> Admin User.
    If Dir(strPathAdmin & "*.*") = "" Then
        '===> Empty Folder.
    Else
        '===> Files on folder.
    End If
Else
    '===> Office User.
    If Dir(strPath & "*.*") = "" Then
        '===> Empty Folder.
    Else
        '===> Files on folder.
    End If
End If
End Sub()

到目前为止,我只有这些了。

需要帮助。

谢谢...

2个回答

17
创建一个小函数来检查文件是否存在,并在需要时调用它。
Public Function FileExists(ByVal path_ As String) As Boolean
    FileExists = (Len(Dir(path_)) > 0)
End Function

既然后端数据库路径不会改变,为什么不声明两个常量并简单地检查它们的值?

Sub Exist()

    Const workFolder As String = "C:\Work Folder\backend.accdb"
    Const personalFolder As String = "D:\Personal Folder\backend.accdb"

    If FileExists(workFolder) Then
        'Work folder exists
    End If

    '....

    If FileExists(personalFolder) Then
        'Personal folder exists
    End If
End Sub

谢谢。我认为这就是我需要的。我可以在函数中添加这两个常量吗?我将在许多地方使用该代码以确保安全。 - YvetteLee
如果您计划在多个地方使用它,应将函数保留原样并调用它 If FileExists(fileName)。如果您想访问常量变量,请将它们放在模块的顶部,并将它们标记为 Public 以从应用程序中的任何位置访问,或者将它们标记为 Private 以从该模块的任何位置访问。 - Kostas K.

0

这是一个非常迟来的回复,但不要重复造轮子。VBA可以访问FileSystemObject,它包含了一组强大的方法,可以获取文件和文件夹的信息,而无需编写自己的函数,这样得到的代码更易于阅读。

其次,借鉴上一个答案,你知道你想让代码查看的文件夹,并且它们不会经常更改,但由于可能会更改,我还会将参数移动到声明中,以便在需要时可以进行自定义或默认为现有值。

最后,FileExists是一个动词,应该代表函数而不是子过程,所以我猜你想返回一些东西,并在较高级别的代码中使用它。碰巧,FileSystemObject中已经有一个名为FileExists的方法,所以我将把你的函数重命名为LocatePath。你可以返回你正在寻找的文件的有效路径,并按约定返回一个空字符串"",如果目标未找到,则在调用过程中处理它。

fs.BuildPath(strRootPath, strFileOrSubDir)会将strFileOrSubDir附加到strRootPath,构建一个格式正确的完整路径名。你不必担心两者之间是否有反斜杠(或太多了)。它可用于附加文件、子目录或子目录中的文件。

fs.FileExists(strFullPath)很简单,如果strFullPath存在,则返回True,否则返回False。

fs.GetFolder(strFolderName)返回一个Folder对象,该对象具有.Files属性,该属性是一个Collection对象。集合对象又具有.Count属性,在本例中表示strFolderName中有多少个文件。集合对象也可以用于逐个迭代文件夹中的所有文件。

以下是您的代码重构后,根据我认为您想要实现的目标所做出的所有更改。它不像我想象中那样对称,但与您的代码相似,并且简单易读,完成了某些功能。
Function LocatePath(Optional strWorkPath as String = "\\iMac", 
       Optional strHomePath as String = CurrentProject.Path,
       Optional strFile as String = "SerialKey.txt"
       Optional strSubDir as String = "Temp") as String

   Dim fs as Object
   Set fs = CreateObject("Scripting.FileSystemObject")

   If fs.FileExists(fs.BuildPath(strHomePath, strFile)) Then
      If fs.GetFolder(fs.BuildPath(strHomePath, strSubDir).Files.Count > 0 Then '===> Admin User.
         LocatePath = fs.BuildPath(strHomePath, strFile)
      ElseIf fs.GetFolder(fs.BuildPath(strWorkPath, strSubDir).Files.Count > 0 Then '===> Office User
         LocatePath = fs.BuildPath(strWorkPath, strFile)
      End If
   Else 'Target conditions not found
      LocatePath = ""
   End If
   Set fs = Nothing
End Function()

理想情况下,我可能不会指定strHomePath as String = CurrentProject.Path,因为当你在工作时,strWorkPath as String = CurrentProject.Path 也可能是正确的,而且你希望更好地区分这两个环境。这也是我提到的对称性小问题的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接