Ich habe eine VB.Net-Anwendung erstellt, die Daten in eine Excel-Tabelle lädt. Die Anwendung funktioniert gut, aber ich habe eine Funktionalität hinzugefügt, um zu testen, ob die Arbeitsmappe geöffnet ist, und wenn ja, wird die Anwendung beendet. Wenn die Arbeitsmappe nicht geöffnet ist, kann der Benutzer andernfalls Informationen in der Anwendung ausfüllen. Mein Problem ist, dass, wenn das Arbeitsblatt nicht geöffnet ist, mein Code explodiert, weil die Arbeitsmappe "irgendwie geöffnet" ist. Ich muss alle Prozesse schließen und dann fortfahren. Hier ist mein Code zu überprüfen, ob die Arbeitsmappe geöffnet ist oder nicht:Excel-Arbeitsmappe schließen Wenn Test für offene Rückgabewerte falsch ist
1., mein Modul, das den einen Booleschen Kontroll aufstellt:
Public Module ExcelCheck
Public Function Test(ByRef sName As String) As Boolean
Dim fs As FileStream
Try
fs = File.Open(sName, FileMode.Open, FileAccess.Read, FileShare.None)
Test = False
Catch ex As Exception
Test = True
End Try
End Function
End Module
Dann ist mein Handler für eine Schaltfläche auf dem Formular, die die Prüfung tut :
Private Sub btnOpenFileCheck_Click(sender As Object, e As EventArgs) Handles btnOpenFileCheck.Click
'Evaluate if the workbook is being used:
Dim bExist As Boolean
bExist = Test("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines.xls")
If bExist = True Then
MessageBox.Show("The file is open... Please try again later.", "EXCEL FILE IN USE: Abort", MessageBoxButtons.OK)
Me.Close()
Else bExist = False
MessageBox.Show("The file is NOT open... You may proceed...", "EXCEL FILE NOT OPEN", MessageBoxButtons.OK)
Dim xlOpenItem As New Excel.Application
Dim xlOpenWB As Excel.Workbook = xlOpenItem.Workbooks.Open("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines")
xlOpenWB.Close(SaveChanges:=False, Filename:="\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines.xls", RouteWorkbook:=False)
txtCPUSerial.Focus()
End If
End Sub
Was passiert, wenn das Buch nicht offen ist, ist der richtige Dialog läuft über die Abbildung, um fortzufahren:
Aber dann ein Excel-Dialog erscheint, dass der folgende:
'\\ netshareA \ c \ Users $ \ Pete \ Desktop \ TestUnits \ Machines.xls' ist derzeit im Einsatz. Versuchen Sie es später noch einmal.
Dann bläst er schließlich auf und ich habe die Zeile verwiesen:
Dim xlOpenWB As Excel.Workbook = xlOpenItem.Workbooks.Open("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines")
Meine Logik ist, dass ich eine offene Instanz eines Excel-Objekt haben müssen, dann schließen, dass Instanz, um einen unbeabsichtigten laufenden Prozess zu beenden. Ich öffne die Arbeitsmappe tatsächlich in einem anderen Übergabe-Handler, mit den Excel-Objekten und den Variablen, die gut festgelegt werden, aber das ist nicht mein Problem. Wie kann ich reibungslos stellen Sie sicher, dass das Arbeitsmappenobjekt hier geschlossen ist, um nicht eine Ausnahme zu werfen, die es nicht ist?