为什么在Excel VBA中调用的exe不输出文件?

时间:2013-01-28 07:26:24

标签: c++ excel vba file-io excel-vba

所以我有一个启用宏的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 Documents文件夹。

从Excel / VBA调用时,如何使此文件显示在原始目录中?我如何确保它实际上用excel外部调用的信息填充文件?

2 个答案:

答案 0 :(得分:2)

确定您当前的目录是否符合您的想法?

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

检查这个的最简单方法是执行不带路径的C ++程序:

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

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

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

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

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

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

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

答案 1 :(得分:0)

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

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