【问题标题】:VBA DIR function returning file that is not in directoryVBA DIR 函数返回不在目录中的文件
【发布时间】:2018-10-29 10:53:31
【问题描述】:

我有一个 EXCEL VBA“导出到 PDF”应用程序,它使用 DIR 来验证 EXP_PDF.dll 文件是否存在。该函数返回文件,但文件实际上位于与(我认为)DIR 路径指向的目录不同的目录中。我构建了以下简单的子来测试:

Sub RetrieveFile()
Dim Shex As Object

Set Shex = CreateObject("Shell.Application")

file = Dir(Environ("commonprogramfiles") & "\Microsoft Shared\OFFICE" & Format(Val(Application.Version), "00") & "\EXp_PDF.DLL")

Path = Environ("commonprogramfiles") & "\Microsoft Shared\OFFICE" & Format(Val(Application.Version), "00")

targetFile = Path & "\EXp_PDF.DLL"

  If Len(file) > 0 Then

    MsgBox (targetFile & " Exists")
    Debug.Print targetFile

    FileCopy targetFile, "C:\Temp\exp_pdf.dll"


   tgtfile = targetFile
   Shex.Open (tgtfile)

  Else

    MsgBox ("File Doesn't Exist")

  End If

End Sub
  1. DIR函数返回长度大于0的文件名
  2. msgbox 显示路径。 (但目录中没有文件。搜索 windows 会在不同的目录中找到该文件。)
  3. “文件复制”代码是将文件复制到临时目录
  4. “文件打开”代码启动,但报告找不到文件

背景:我们有内置在 excel 中的工程日志,它使用 VBA 应用程序导出为 pdf 和电子邮件。看起来代码起源于 MSDN,可能是为 Office 2007 构建的。最近 WIN 10 Office 16 计算机进行了 Windows 更新,现在代码失败了。我通过注释掉 EXP_PDF.dll 的搜索来恢复功能,但我想知道为什么 DIR 功能似乎在其他位置找到 dll,是的,隐藏文件和 windows 文件设置为显示。谢谢。

【问题讨论】:

    标签: excel vba active-directory directory


    【解决方案1】:

    EXp_PDF.DLL 实际上位于"C:\program files (x86)\Microsoft Office\root\vfs\ProgramFilesCommonX86\Microsoft Shared\OFFICE16"。该目录有95个文件,"C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE16"有1个文件。

    VBA 似乎正在使用虚拟文件系统(注意 ..\vfs)。

    虚拟文件系统允许应用程序有效地合并多个目录。
    这样,当您引用一个目录时,您将引用合并中的所有目录。这使得应用程序无论安装在何处都可以无缝运行。

    我相信这个文件系统实际上是在内部存在的。从 Office 产品运行下面的 Msgbox 返回 96,VBScript 返回 1。

    MsgBox CreateObject("Scripting.FileSystemObject").GetFolder("C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE16").Files.Count

    public static void main(String[] args) throws IOException {
        File folder = new File("C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE16");
    

    Java 还列出了 1 个文件。

    Getting the filenames of all files in a folder


    File[] listOfFiles = folder.listFiles();
    
        for (int i = 0; i < listOfFiles.length; i++) {
          if (listOfFiles[i].isFile()) {
            System.out.println("File " + listOfFiles[i].getName());
          } else if (listOfFiles[i].isDirectory()) {
            System.out.println("Directory " + listOfFiles[i].getName());
          }
        }
    

    【讨论】:

    • 感谢您的洞察力。是时候了解虚拟文件系统了
    • 您应该考虑将目录和活动目录标签添加到您的帖子中。
    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2013-05-30
    • 2013-01-10
    • 2012-07-25
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多