2013-08-31 3 views
2

C#을 통해 VBA/Excel 매크로를 호출 할 수 있습니다. 사용자 (내 경우 C# 프로그램)가 잘못된 값을 입력하면 메시지 상자가 나타납니다. C#을 통해 시간을 초과하여 메시지 상자의 표시 여부를 결정할 수 있으므로 문제가되지 않습니다. 문제는 메시지 상자가 나타나면 엑셀이 제대로 닫히지 않는다는 것입니다. 이 코드를 사용하여 Excel을 닫습니다.매크로 호출 후 C#을 통해 메시지 상자를 감지/닫기

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

모두 닫히지 만 Excel과 메시지 상자가 열려 있습니다. 나는 C#에서 메시지 상자를 닫을 수있는 방법이 있습니까?

+0

내가 아는 한,이 일을하는 것은 쉽지 않거나 * 좋은 방법이 아닙니다. 메시지 상자에 포커스가있는 경우 (중간에 사용자 상호 작용이 없거나 자동화가 실행되는 동안) [Microsoft 솔루션 - SendKeys] (http://support.microsoft.com/kb/259971/ko -우리). – pasty

+0

우수 - excelApp.SendKeys ("{ESC}"); 실제로 트릭을합니다. 답변을 게시하십시오. – cs0815

답변

0

내가 구현 한 사무 자동화 소프트웨어에 the Microsoft solution을 성공적으로 사용했습니다. 우아한이 아니며 선행 조건이 있습니다 (메시지 상자가 포커스를 유지해야하며 자동화가 실행되는 동안 사용자 상호 작용이 없어야 함). 작동하지만 작동하려면 - SendKeys method 상자를 클릭하십시오!

+0

당신이 말했듯이, 엑셀 애플 리케이션이 작동하는 데 초점을 맞추는 것이 매우 중요합니다. C#을 통해 포커스를 설정할 수 있습니까? – cs0815

+0

엑셀 인스턴스가 하나 뿐인 경우 (다시 prereq.) [SetForegroundWindow 또는 ShowWindowAsync를 사용하여 프로세스를 찾고 창을 활성화 할 수 있습니다.] (http://blog.billsdon.com/2011/10/c-sharp-check-if -application-is-already-running-then-set-focus /). 엑셀 인스턴스가 두 개 이상있는 경우 Excel 인스턴스 PID를 시작시 저장하고 나중에이를 사용하여 인스턴스를 활성화합니다. 실행중인 창을 활성화하는 방법 : [Alternative 1] (http://www.codeproject.com/Tips/232649/Setting-Focus-on-an-External-application) 및 [Alternative 2] (http : // msdn. microsoft.com/de-de/library/x57y7863%28v=vs.85%29.aspx). – pasty

0

더 나은 해결책은 here입니다.

excelApp.DisplayAlerts = false 

를 사용

당신이 그것을 원하는 앱을 처리 할 수 ​​있도록 메시지 상자를 만드는 엑셀 응용 프로그램을 방지 할 수 있습니다.