VBA DIR函数返回不在目录中的文件

时间:2018-05-19 00:46:25

标签: excel vba active-directory directory

我有一个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显示路径。 (但目录中没有文件。搜索窗口会在不同的目录中找到该文件。)
  3. “文件复制”代码将文件复制到临时目录
  4. 启动“文件打开”代码,但报告无法找到该文件
  5. 背景:我们有excel内置的工程日志,它使用VBA应用程序导出为pdf和电子邮件。看起来代码起源于MSDN,可能是为Office 2007而构建的。最近WIN 10 Office 16计算机进行了Windows更新,现在代码失败了。我通过注释掉EXP_PDF.dll的搜索来恢复功能,但我想知道为什么DIR功能似乎在其他位置找到了dll并且是隐藏的并且windows文件被设置为显示。感谢。

1 个答案:

答案 0 :(得分:2)

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)。

EXp_PDF.DLL Directory

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

我相信这个文件系统实际上是在内部存在的。从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个文件。

enter image description here

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());
      }
    }