excel - VBA DIR 函数返回不在目录中的文件
问题描述
我有一个 EXCEL VBA 'export to 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
- DIR函数返回长度大于0的文件名
- msgbox 显示一个路径。(但目录中没有文件。搜索 windows 会在不同的目录中找到该文件。)
- “文件复制”代码是将文件复制到临时目录
- “文件打开”代码启动,但报告找不到文件
背景:我们有内置在 excel 中的工程日志,它使用 VBA 应用程序导出为 pdf 和电子邮件。看起来代码源自 MSDN,可能是为 Office 2007 构建的。最近 WIN 10 Office 16 计算机进行了 Windows 更新,但代码现在失败了。我通过注释掉 EXP_PDF.dll 的搜索来恢复功能,但我想知道为什么 DIR 功能似乎在其他位置找到 dll,是的,隐藏文件和 windows 文件设置为显示。谢谢。
解决方案
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"
.
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 个文件。
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());
}
}
推荐阅读
- xamarin.forms - Arduino ESP32 通过 BLE 接收文件(用于 OTA 更新)
- c++ - 寻找递归阿克曼函数的值
- node.js - 为节点运行的节点项目创建引导脚本
- ios - GCMouse.mice() 总是空的,尽管我的鼠标工作
- python - Python / Pandas for loop..为什么我的这么慢?
- android - 有没有一种方法可以在多个集合中搜索文档而不必全部阅读?火库
- python - 从 Pandas 中的季度/月度数据创建年度总和列
- typescript - 结合 RN 和 ts-node 时,`Cannot use import statement outside a module`
- list - 第一:球拍/打印出列表程序组合的方案中的合同违规错误
- javascript - 将“事件”与另一个参数一起使用