运行 .exe 直接 & 通过 Shell VBA 返回不同的结果
Running .exe directly & through Shell VBA returning different results
当我直接点击.exe文件"PrintUsers.exe"时,输出是正确的。
但是当我通过 VBA 使用 Shell 这样做时,结果是不同的。它会尝试在另一个目录中查找文本文件。为什么?见图:
解决方案:我现在使用:GetModuleFileName(NULL, szEXEPath, 2048) 而不是 GetCurrentDir(buff, FILENAME_MAX);
PrintUsers.exe
似乎希望在当前目录中找到文件 doNotEdit.txt
。
最好的解决方案是更改该程序以在与程序本身所在的同一目录中查找文件,但如果不可能,请获取 Excel 以在 [= 之前更改当前目录25=] 程序,即 insert
ChDir ActiveWorkbook.Path
在调用 Shell
.
之前
此外,正如 Yahya Hussein 在评论中提到的那样,路径中的空格可能会导致问题。在您的具体情况下没有任何问题,但为了确保您将来不会遇到问题,请考虑使用
myFile = """" & ActiveWorkbook.Path & "\PrintUsers.exe"""
ChDir ActiveWorkbook.Path
Shell myFile, vbNormalFocus
解决方案:我现在使用:GetModuleFileName(NULL, szEXEPath, 2048) 而不是 GetCurrentDir(buff, FILENAME_MAX);
当我直接点击.exe文件"PrintUsers.exe"时,输出是正确的。 但是当我通过 VBA 使用 Shell 这样做时,结果是不同的。它会尝试在另一个目录中查找文本文件。为什么?见图:
解决方案:我现在使用:GetModuleFileName(NULL, szEXEPath, 2048) 而不是 GetCurrentDir(buff, FILENAME_MAX);
PrintUsers.exe
似乎希望在当前目录中找到文件 doNotEdit.txt
。
最好的解决方案是更改该程序以在与程序本身所在的同一目录中查找文件,但如果不可能,请获取 Excel 以在 [= 之前更改当前目录25=] 程序,即 insert
ChDir ActiveWorkbook.Path
在调用 Shell
.
此外,正如 Yahya Hussein 在评论中提到的那样,路径中的空格可能会导致问题。在您的具体情况下没有任何问题,但为了确保您将来不会遇到问题,请考虑使用
myFile = """" & ActiveWorkbook.Path & "\PrintUsers.exe"""
ChDir ActiveWorkbook.Path
Shell myFile, vbNormalFocus
解决方案:我现在使用:GetModuleFileName(NULL, szEXEPath, 2048) 而不是 GetCurrentDir(buff, FILENAME_MAX);