Итак, у меня есть книга Excel / VBA с поддержкой макросов и кнопкой, которая записывает файл .txt, а затем вызывает файл .exe в том же каталоге. .Exe написан на C ++ и является предполагаемый вывести другой файл.
Проблема, с которой я столкнулся, заключается в том, что по какой-то причине, когда книга Excel вызывает C ++ .exe, исполняемый файл обрабатывает информацию из .txt просто отлично, но выходной файл никогда не появляется. Но если у меня есть рабочая книга, просто создайте файл .txt, а затем я сам запускаю программу на C ++, и программа выводит файл правильно.
Кажется, что вызов .exe из книги Excel / VBA приводит к тому, что .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();
Так как же получить исполняемый файл C ++ для вывода файла «Output.solution» при вызове из Excel VBA? Просто чтобы быть ясно — если я запускаю программу C ++ отдельно делает вывести файл.
Редактировать: при выполнении .exe по отдельности, соответствующая информация помещается в файл «Output.solution» в том же каталоге, но при вызове из Excel / VBA .exe вместо этого помещает пустой «Output.solution» в папку «Мои документы».
Как сделать так, чтобы этот файл отображался в исходном каталоге при вызове из Excel / VBA? и как я могу убедиться, что он действительно заполнит файл информацией, как при вызове вне Excel?
Ты конечно что ваш текущий каталог — это то, что вы думаете?
Может случиться так, что это где-то иное, чем путь к вашей книге, и в этом случае выходные файлы будут созданы там, а не там, где вы ожидаете.
Самый простой способ проверить это — выполнить программу на C ++ без пути:
ActiveWorkbook.FollowHyperlink ("MyProgram.exe"), NewWindow:=True
и посмотрим, жалуется ли он на то, что не может найти исполняемый файл.
Другой способ — использовать известное местоположение (временно) для выходного файла:
OutputFile.open("c:\\knowndir\\Output.solution");
и проверьте, что он создан. Если это так, то нет ничего плохого в вашем исполняемом файле, вы просто находитесь в каталоге, отличном от того, что вы думаете.
Кроме того, поиск по всему диску для поиска Output.solution
файл. Если вы находитесь в другом каталоге это где файл будет создан.
Если выясняется, что это проблема, возможно, самое простое решение — изменить каталог перед запуском исполняемого файла. VBA имеет chdir
команда только для этой цели. Возможно, вам придется изменить его позже в зависимости от ваших потребностей, и вы можете использовать curdir
за это.
Лучше всего использовать такой инструмент, как SysInternal Process Monitor, чтобы увидеть, происходит ли запись файла вообще, а если нет, то почему бы и нет.
Я предполагаю, что вы, вероятно, недовольны исполняемым файлом, работающим в другом каталоге, из каталога, из которого вы ожидаете его запустить. Попробуйте вывести в абсолютное местоположение (или сначала вызвать SetCurrentDirectory), чтобы посмотреть, поможет ли это.