2016-06-28 18 views
0

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:

enter image description here

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") 

enter image description here

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?

Antwort

0

Nach viel tüftelte, ich habe genau das gefunden, was mein Problem war - ich nicht die geöffnete Datei-Stream schließen heraus hat:

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 

    fs.Close() 'This closes out the initially opened file stream for checking. 

Catch ex As Exception 
    Test = True 
End Try 

End Function 
End Module 

Ich kam schließlich zurück in das Modul und fragte sich, was passiert, wenn ich gerade schließe und fs.Close() benutze und es den Trick machte. Keine weiteren Blows! Ich hoffe, dies hilft jemandem, der mit einem ähnlichen Problem mit dem Dateistrom zu kämpfen hat.