为啥Excel VBA中调用的exe不输出文件?

Posted

技术标签:

【中文标题】为啥Excel VBA中调用的exe不输出文件?【英文标题】:Why does an exe called in Excel VBA not output a file?为什么Excel VBA中调用的exe不输出文件? 【发布时间】:2013-01-28 07:26:24 【问题描述】:

所以我有一个启用宏的 Excel/VBA 工作簿,其中有一个按钮,它写入一个 .txt 文件,然后在同一目录中调用一个 .exe。 .exe 是用 C++ 编写的,应该输出另一个文件。

我遇到的问题是,由于某种原因,当 Excel 工作簿调用 C++ .exe 时,可执行文件可以很好地处理 .txt 中的信息,但输出文件从未出现过。但是,如果我有工作簿,只需制作 .txt 文件,然后我自己执行 C++ 程序,那么程序就会正确输出文件。

似乎从 Excel/VBA 工作簿调用 .exe 导致 .exe 不输出文件。

这是 Excel/VBA 代码

Open (ActiveWorkbook.Path & "\excel.txt") For Output As #1
Print #1, MyString
Close #1
ActiveWorkbook.FollowHyperlink (ActiveWorkbook.Path & "\MyProgram.exe"), 
NewWindow:=True

C++ 被拆分为多个文件,但可能导致问题的关键部分如下

ofstream OutputFile;
int Sequence[12];
...
...
OutputFile.open("Output.solution");
for (int i=1;i<12;i++)
    OutputFile << Int_to_String(Sequence[i]) << " ";
OutputFile.close();

那么,当从 Excel VBA 调用时,如何让 C++ 可执行文件输出“Output.solution”文件?需要明确一点 - 如果我单独运行 C++ 程序,它确实会输出文件。

编辑:单独执行.exe时,将正确的信息放入同一目录下的“Output.solution”文件中,但从Excel/VBA调用时,.exe改为放置一个“Output.solution”进入我的文档文件夹。

从 Excel/VBA 调用时,如何使该文件重新出现在原始目录中?以及如何确保它会像在 excel 外部调用时那样实际填充文件?

【问题讨论】:

【参考方案1】:

确定你当前的目录是你认为的那样吗?

它可能是在您的工作簿路径之外的某个地方,在这种情况下,输出文件将在那里而不是您期望的位置创建。

最简单的检查方法是在没有路径的情况下执行 C++ 程序:

ActiveWorkbook.FollowHyperlink ("MyProgram.exe"), NewWindow:=True

看看它是否抱怨找不到可执行文件。

另一种方法是使用已知位置(临时)作为输出文件:

OutputFile.open("c:\\knowndir\\Output.solution");

并检查它是否已创建。如果是,那么您的可执行文件没有任何问题,您只是位于与您想象的不同的目录中。

另外,在整个磁盘中搜索Output.solution 文件。如果您在不同的目录中那是文件将被创建的地方。

如果事实证明这是问题所在,最简单的解决方案可能是在运行可执行文件之前更改目录。 VBA 有一个chdir command 就是为了这个目的。之后您可能需要根据需要将其更改回来,您可以使用 curdir 进行此操作。

【讨论】:

是的,我很肯定,因为当我单独运行 C++ 程序时,文件确实显示在同一个目录中,并且 c++ 的每个部分都运行顺利。但是当我从 excel/vba 运行它时,程序会在命令提示符窗口中运行,显示正确的命令提示符输出,但不会生成文件。 感谢您迄今为止的帮助。我删除了旧的 .solution 文件并重新运行了 excel 调用并搜索了 .solution。事实证明,由于某种原因,当 Excel 调用 exe 时,正在“我的文档”文件夹中创建输出文件。您是否知道如何在不使用绝对位置的情况下将其更改为当前目录(因为我希望该程序/系统具有可移植性)? @user2016670,在运行可执行文件之前使用 Excel 的 chdir 命令。那将是我的第一次尝试。 玩了几个小时后,我发现这是一个令人尴尬的简单解决方案:在调用可执行文件之前添加“ChDir ThisWorkbook.Path”。这使得 C++ 可执行文件的输出文件按原样显示在当前目录中,并允许它正确填充数据。 哈,是的,我刚刚在发布我的最后一条评论后阅读了您的最新评论。感谢您对此的帮助!【参考方案2】:

最好的办法是使用像 SysInternal 的进程监视器这样的工具来查看文件写入是否发生,如果没有,为什么不发生。

我的猜测是,您可能对在与您期望它运行的目录不同的目录中运行的可执行文件犯规了。尝试输出到绝对位置(或先调用 SetCurrentDirectory)看看是否有帮助。

【讨论】:

以上是关于为啥Excel VBA中调用的exe不输出文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在excel中使用VBA调用其它外部程序

为啥从 Word doc 调用宏时出现错误 1004,而不是从 Excel 调用?

如何关闭运行中的excel.exe delphi

用ajax调用以response输出到客户端导出excel不成功,不报错也不提示下载

VBA宏运行速度为啥比Excel自带函数慢

转换为 Office 2013 后在 VBA 脚本中搜索引用的文件 Excel.exe