Функция VBA DIR возвращает файл, которого нет в каталоге - PullRequest
0 голосов
/ 19 мая 2018

У меня есть приложение 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. код "file copy" копирует файл во временный каталог
  4. Файл "file"код open »запускается, но сообщает, что файл не может быть найден

Справочная информация: у нас есть инженерный журнал, встроенный в Excel, который использует приложение VBA для экспорта в PDF и электронную почту.Похоже, что код, созданный на MSDN и, вероятно, был создан для Office 2007. Недавно компьютеры с WIN 10 Office 16 обновили Windows, и теперь код не работает.Я восстановил функцию, закомментировав поиск файла EXP_PDF.dll, но я хотел бы знать, почему функция DIR, похоже, находит dll в другом месте, и да, скрытые файлы Windows установлены на показ.Спасибо.

1 Ответ

0 голосов
/ 19 мая 2018

EXp_PDF.DLL фактически находится в "C:\program files (x86)\Microsoft Office\root\vfs\ProgramFilesCommonX86\Microsoft Shared\OFFICE16".В этом каталоге 95 файлов и 1 файл в "C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE16".

Похоже, что VBA использует виртуальную файловую систему (примечание .. \ vfs).

EXp_PDF.DLL Directory

Виртуальные файловые системы позволяют приложениям эффективно объединять несколько каталогов.
Таким образом, когда вы ссылаетесь на один каталог, вы ссылаетесь на всекаталоги в слиянии.Это позволяет приложению беспрепятственно работать независимо от того, где оно установлено.

Я считаю, что эта файловая система действительно существует внутри.При запуске приведенного ниже Msgbox из продукта Office возвращается 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

Получение имен файлов всех файлов в папке


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