1

私は Visual Basic (およびこのサイト) に非常に慣れていないため、オートメーションを使用するときに Excel を適切に終了する方法について少しアドバイスが必要です。私の問題の背景を少し説明します。私の上司が比較的複雑な計算を何百回も行うために作成した大きな Excel ブックがあります。現在、ユーザーはスプレッドシートを使用してデータを入力しているだけですが、現在、vb.net ユーザー インターフェイスに取り組んでいます。これにより、ユーザーがデータを入力できるようになり、さらに柔軟性と機能を提供して、ユーザーの生活をより簡単にし、 Microsoft Excel という恐怖から彼らを救い出してください。

.net アプリを開くと、ワークブックをバックグラウンドで開くコマンドを実行し (Excel オブジェクトの visible プロパティが false に設定されている)、ワークブックを使用できるようにします。ある時点で、これらの計算をスタンドアロン アプリに移行する予定ですが、現時点では費用対効果の高いソリューションではないため、既に開発されているスプレッドシートを使用します。Excel を閉じるときにちょっとした問題が発生しました。FormClosing イベントを使用して問題なく Excel を閉じることができます。私の問題は次のとおりです。アプリケーションを実行している場合 (目的のワークブックがバックグラウンドで開いていることを意味します)、デスクトップのショートカットを介して別のワークブックを開くと、他のワークブックが開いているときにアプリケーションを閉じようとすると、その 2 番目のワークブックを閉じようとし、Excel の [変更を保存] ダイアログ ボックスが表示されます。どうすればこれを回避できますか? 作成した Excel オブジェクトを閉じるのではなく、計算ブックに固有のプロセスを見つけてそれを閉じる必要がありますか?

FormClosing イベントのコードは次のとおりです。

Private Sub Form8_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

 'close the workbook

xlWorkbook.Close(SaveChanges:=False)

'clean up

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook)

xlWorkbook = Nothing

'close the excel application

xlApp.Quit()

'clean up

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

xlApp = Nothing

End Sub

編集: Excel がファイルを開く方法が原因で、この問題が発生していることは承知しています。[スタート] メニューに移動して Excel の新しいインスタンスを開かない限り、Excel は既に実行されているアプリケーション オブジェクトでファイルを開きます。これにより、この問題は避けられない可能性があると思われますが、ブレインストーミングだけでもフィードバックをいただければ幸いです

どんなアドバイスでも大歓迎です。ありがとう、エリック

PS、コードタグに私のコードを入れてくれた人に感謝します!! 私は自分でそれを行う方法を理解することを約束します;)

4

1 に答える 1

0

にコードを追加してWorkbook_BeforeClose、必要なときに本が閉じられないようにすることができます。

これを行うにはいくつかの方法があります。最も簡単な方法は、ワークシートに直接追加することです。また、vb.net でイベントをフックすることもできます (public withevents タイプのもの、VBA でしか実行していないため、支援できませんでした)。 .net バリエーション)

これは、機能する可能性のある簡単な VBA ソリューションです。

モジュール - 名前を付けます。例: Main

Public Sub UnlockWorkbook()
Dim Window As Window

For Each Window In ThisWorkbook.Windows
    Window.Visible = True
Next Window

End Sub

Public Sub LockWorkbook()
Dim Window As Window

For Each Window In ThisWorkbook.Windows
    Window.Visible = False
Next Window

End Sub

ThisWorkbook モジュール

Private Sub Workbook_BeforeClose(Cancel As Boolean)

For Each Window In ThisWorkbook.Windows
    If Window.Visible = False Then
        Cancel = True
        If Application.Workbooks.Count = 1 Then
            Application.Visible = False
        End If
        Exit For
    End If
Next Window

End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveAsUI = False
End Sub

アプリケーションを使用してワークブックをロードするときは、ワークブックを非表示にする「LockWorkbook」マクロを呼び出します。アプリケーションも非表示にすることができます。

ユーザーが別のワークブックを開いてアプリケーションを再表示した場合、ワークブックを閉じてアプリケーションを閉じようとすると、そのアクションが停止し、アプリケーションが再度非表示になります。

ワークブックを閉じたい場合は、「UnlockWorkbook」マクロを呼び出して、Cancel を true に設定せずに「Worksheet_BeforeClose」を完了できるようにする必要があります。

于 2013-04-16T14:02:35.457 に答える