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

C++ 为什么Excel VBA中调用的exe不输出文件?,c++,vba,file-io,excel,C++,Vba,File Io,Excel,因此,我有一个启用宏的Excel/VBA工作簿,其中有一个按钮,可以写入.txt文件,然后在同一目录中调用.exe。exe是用C++编写的,并且是假定/s>输出另一个文件。 我的问题是,由于Excel工作簿调用C++ .exe的原因,执行文件可以处理.txt中的信息,但输出文件却从未显示过。但是,如果我有工作簿简单地制作.txt文件,然后我自己执行C++程序,那么程序就正确输出文件。p> 似乎从Excel/VBA工作簿调用.exe会导致.exe不输出文件 这是Excel/VBA代码 Open (

因此,我有一个启用宏的Excel/VBA工作簿,其中有一个按钮,可以写入.txt文件,然后在同一目录中调用.exe。exe是用C++编写的,并且是<强>假定/s>输出另一个文件。 我的问题是,由于Excel工作簿调用C++ .exe的原因,执行文件可以处理.txt中的信息,但输出文件却从未显示过。但是,如果我有工作簿简单地制作.txt文件,然后我自己执行C++程序,那么程序就正确输出文件。p> 似乎从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();
流输出文件的
;
int序列[12];
...
...
OutputFile.open(“Output.solution”);
对于(inti=1;i您确定当前目录是您认为的目录吗

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

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

ActiveWorkbook.FollowHyperlink ("MyProgram.exe"), NewWindow:=True
看看它是否抱怨找不到可执行文件

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

OutputFile.open("c:\\knowndir\\Output.solution");
并检查它是否已创建。如果是,那么您的可执行文件没有问题,您所处的目录与您所想的不同

另外,在整个磁盘中搜索
输出.solution
文件。如果您位于不同的目录中,则将在该目录中创建该文件


如果问题是这样的,那么最简单的解决方案可能是在运行可执行文件之前更改目录。VBA有一个专门用于此目的的目录。您可能需要根据需要在以后重新更改目录,您可以使用
curdir
来实现此目的。

您最好的选择是使用SysInternal的Process Monitor之类的工具查看文件写入是否发生,如果没有,原因为何


我的猜测是,您可能会对运行在不同目录中的可执行文件感到不适,而不是您希望它从中运行的目录。请尝试输出到绝对位置(或先调用SetCurrentDirectory)是的,我是肯定的,因为当我单独运行C++程序时,文件确实出现在同一个目录中,C++的每个部分都运行得很流畅。但是当我从Excel或VBA运行它时,程序在命令提示符窗口上运行,显示正确的命令提示输出,但不生成文件。谢谢您的帮助。lp到目前为止。我删除了旧的.solution文件,重新运行excel调用并搜索.solution。结果表明,由于某种原因,excel调用exe时,输出文件正在“我的文档”文件夹中创建。您知道我如何在不使用绝对位置的情况下将其更改为当前目录吗(因为我希望这个程序/系统是可移植的)?@user2016670,在运行可执行文件之前使用Excel的
chdir
命令。这将是我的第一次尝试。在玩了几个小时后,我发现这是一个令人尴尬的简单解决方案:添加“chdir thishworkbook.Path”在调用可执行文件之前,这使得C++可执行文件的输出文件应该在当前目录中显示出来,并允许它正确地填充数据。哈,是的。我刚刚发布了你最近的评论。