1

所以我有一个启用宏的 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”放入 My文档文件夹。

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

4

2 回答 2

2

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

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

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

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

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

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

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

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

此外,在整个磁盘中搜索该Output.solution文件。如果您位于创建文件的其他目录

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

于 2013-01-28T07:29:10.337 回答
0

您最好的选择是使用像 SysInternal 的 Process Monitor 这样的工具来查看文件写入是否正在发生,如果没有,为什么不发生。

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

于 2013-01-28T07:29:23.863 回答