【问题标题】:Excel VBA Dir() default path?Excel VBA Dir() 默认路径?
【发布时间】:2017-05-02 15:21:53
【问题描述】:

我正在做一个练习,它使用 Dir() 来确定当前目录(即与我正在使用的工作簿相同的目录)中是否存在文件。给出的代码 - 并且显然在视频示例中工作 - 是这样的:

IsThere = (Dir("SomeFile.xlsx") <> "")

当我运行此代码时,IsThere 返回False。我可以使用以下方法解决它:

IsThere = (Dir(ActiveWorkbook.Path & "\SomeFile.xlsx") <> "")

但我想知道为什么 Dir 默认没有按预期在当前目录中查找。

我正在努力寻找任何相关的建议。我发现的有关如何使用 Dir() 的大多数示例都带有指定的文件路径,因此它们并没有真正阐明我的问题。我找到的最接近的是this (obsolete) MSDN reference,上面写着:

为了正确运行,Dir​​ 函数需要将 FileIOPermission 的 Read 和 PathDiscovery 标志授予执行代码。

问题是,我不太了解其中有关如何将 PathDiscovery 设置为 1 的链接建议。

至于 StackOverflow,this 可能是最接近我的问题的 - 尽管它使用指定的路径,并且我 引用网络位置。我注意到this question答案似乎假定 Dir() 应该以预期的方式工作,即使用简单的文件名而不是完全指定的路径。

【问题讨论】:

  • 这里的答案是,如果您正在测试特定位置的文件,则在对 Dir() 的调用中包含路径 - 例如,不要使用(例如)Dir("test.xlsx"),而是使用 Dir("C:\Folder\Folder2\test.xlsx")

标签: excel vba


【解决方案1】:

检查 Excel 选项 --> 保存 --> 默认文件位置以查看您的默认位置。默认情况下它不会使用文件所在的位置。

【讨论】:

    【解决方案2】:

    这与宿主应用程序认为它的目录是什么无关。您始终可以通过调用CurDir 函数找出Dir 的默认目录:

    Debug.Print CurDir$
    

    如需更改,请致电ChDir

    Debug.Print CurDir$
    Debug.Print Dir$("*.*")
    ChDir "C:\"
    Debug.Print CurDir$
    Debug.Print Dir$("*.*")
    

    把它想象成坐在命令提示符下并输入dircd - 它的作用完全相同。请注意,当前目录在宏执行之间保持其状态,因此您不能依赖它位于某个默认位置。

    如果您需要相对于打开的工作簿的路径,请使用 Workbook.Path 如果您需要相对于默认路径的路径,请使用 Application.Path。如果您需要测试文件是否存在,请不要使用 Dir - 改用 Scripting.FileSystemObject。如果您开始考虑弃用旧文件功能,您会帮自己一个大忙。

    【讨论】:

    • 关于 FSO - 只要您的代码永远不需要在 Mac 上运行就可以了,但Dir() 确实没有问题:它肯定不是“遗留”...
    • @TimWilliams - 一旦您习惯了 Dir 的特性,它就没有什么固有错误,但 FSO 更加强大。也许“遗产”不是最好的术语——我使用它的意思是“在更好的选择出现之前很久就已经存在了”。
    • 非常清晰、全面的答案 - 很有魅力 - 谢谢!
    • 奇怪,因为无论我从哪里打开文件,CurDir$ 总是返回 Excel 默认文件位置...直到它被更改。这似乎是有道理的,因为这将是它的第一个价值。并且....更改默认文件位置更改CurDir$
    猜你喜欢
    • 2013-09-24
    • 2017-01-20
    • 1970-01-01
    • 2012-02-02
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    相关资源
    最近更新 更多