2013-08-31 2 views
2

Я могу вызвать макрос VBA/Excel через C#. Если пользователь (в моем случае программа C#) ввел недопустимые значения, появится окно с сообщением. Это не проблема, так как я могу провести время через C# и принять решение на основе этого (то есть определить, появляется ли окно сообщения). Проблема в том, что excel не закрывается должным образом, когда появляется окно сообщения. Я использую этот код для того чтобы закрыть excel:обнаружить/закрыть окно сообщения excel через C# после вызова макроса

excelApp.DisplayAlerts = false; 
Marshal.FinalReleaseComObject(someSheet); 
excelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing); 
Marshal.FinalReleaseComObject(excelWorkbook); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

Все закрывается, но преуспевает, и окно сообщения остается открытым. У меня есть способ закрыть окно сообщения с C#?

+0

Насколько я знаю, нет простого или * приятного * способа сделать это. Если в окне сообщения находится фокус (нет взаимодействия между пользователем или во время работы автоматизации), вы всегда можете воспользоваться [Microsoft solution - SendKeys] (http://support.microsoft.com/kb/259971/ru -нас). – pasty

+0

отлично - excelApp.SendKeys ("{ESC}"); на самом деле делает трюк. пожалуйста, напишите ответ. – cs0815

ответ

0

Я успешно использовал the Microsoft solution для программного обеспечения для автоматизации офиса, которое я реализовал. Это не изящный, и он поставляется с необходимыми условиями (в окне сообщения должен быть фокус, и во время автоматизации не должно быть никакого взаимодействия с пользователем), но он работает - откройте окно с помощью SendKeys method!

+0

Как вы сказали, очень важно, чтобы приложение excel фокусировалось на этом. Считаете ли вы, что я могу настроить фокус через C#? – cs0815

+0

Если у вас есть только один экземпляр excel (еще раз), вы можете [найти процесс и активировать окно с помощью SetForegroundWindow или ShowWindowAsync] (http://blog.billsdon.com/2011/10/c-sharp-check-if -Применение-это-уже обкатки тогда установить фокус /). Если у вас есть несколько экземпляров excel, я бы сохранил PID экземпляра Excel при его запуске, а затем использовал его для его активации. Как активировать запущенное окно: [Альтернатива 1] (http://www.codeproject.com/Tips/232649/Setting-Focus-on-an-External-application) и [Альтернатива 2] (http: // msdn. microsoft.com/de-de/library/x57y7863%28v=vs.85%29.aspx). – pasty

0

Лучшим решением является here.

Использование

excelApp.DisplayAlerts = false 

избегает Excel приложения для создания окна сообщений, позволяя приложению обрабатывать его, как вы хотите.

Смежные вопросы