这是一个非常迟来的回复,但不要重复造轮子。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
也可能是正确的,而且你希望更好地区分这两个环境。这也是我提到的对称性小问题的原因。
If FileExists(fileName)
。如果您想访问常量变量,请将它们放在模块的顶部,并将它们标记为Public
以从应用程序中的任何位置访问,或者将它们标记为Private
以从该模块的任何位置访问。 - Kostas K.