2016-06-13 13 views
0

私はC#Winforms-Applicationを持っています。私はプロジェクトの出力タイプを 'クラスライブラリ'に設定し、ExcelでVBAコードで参照できるようにCOMを表示させました。したがって、私はWinForms-AppをExcelから起動することができます。C#WinFormsを閉じるときにExcelが突然終了するDLLで呼び出されたアプリケーション

すべては、これまで正常に動作します。私のVBAのコードでは、私は(マクロ)は、このようなアプリケーションを呼んでいる:私は私のマクロのWinFormsウィンドウを起動すると

public int Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
     return 0; 
    } 

:私のC#-codeで

Dim app As MyWinFormsApp.Program 
Set app = New MyWinFormsApp.Program 
Dim result As Integer 
result = app.Main() 

私のプログラムのクラスは、このようになりますプログラムが正常に動作します。

私の問題は、次のとおりです。私は赤いXをクリックすることで、WinFormsのウィンドウを閉じていた場合、Excelがまた突然終了します。私はすでに出て見つけた何

は次のとおりです。私のC#クラスForm1.Designer.csで

私はこの廃棄-方法があります。

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

私は)(base.Disposeを呼び出すとき - 私は、WinFormsのウィンドウを閉じたときにメソッド

base.Dispose(false); 

「false」に渡すExcelが予期せず終了されていないが、私はその後Excelを閉じたいとき、それは不可能です。私はこの「Mouse-Wait-Symbol」を手に入れ、何もできないので、TaskManagerのExcelプロセスを強制終了する必要があります。

(私も本当に私の元のプロジェクトで、私は何か間違ったことをやっていることを提供するために、何もしない新しいWinFormsの-プロジェクトを使用してみました...私はまったく同じ動作を持っていた。)

だから私の質問は:どのように私は私のWinForms - アプリケーションを閉じることができ、その後、通常の方法でExcelを閉じて知っていますか?

はどうもありがとうございました!

答えて

0

はWinフォームを閉じる前に、trueにApplication.UserControlプロパティを変更しよう。

"オブジェクトのUserControlプロパティがFalseの場合、オブジェクトの最後のプログラム参照が解放されると、そのオブジェクトが解放されます。このプロパティがFalseの場合、セッションの最後のオブジェクトが解放されるとMicrosoft Excelが終了します。 https://msdn.microsoft.com/library/office/ff841219.aspx

+0

わかりません。私は単純にapp.Main()メソッドを呼び出す前に、VBAコードにApplication.UserControl = Trueを設定します。同じ結果を得ました.. Excelが予期せず終了しました... – toniweser

+0

私は今テストすることができませんが、私はVBAコードの代わりにMain()メソッドを設定すると言っていました。たぶん、プログラムは、idkを実行するときにそれを変更しています... – Magnetron

0

問題()Application.Runの使用です。 VBAからフォームを呼び出す場合は、frm.show()を使用する必要があります。

そして、それが魅力のように動作します。 C#で 例:VBAでの

 public void InitializeForm() 
    { 
     Form1 Form = new Form1(); 
     Form.Show(); 
    } 

例:私はあなたを右に理解天気を

Sub OpenForm() 
Dim CallForm As New CallAndInitialize 
CallForm.InitializeForm End Sub 
関連する問題