problem mit Excel fenster schließen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Regulator.

    problem mit Excel fenster schließen

    ich habe folgendes Problem:

    AUSGANGSSITUATION:
    (Visual Basic 2010 Express) Mein Programm liest bestimmte Daten aus einer Excel Tabelle und fügt Sie in einer TextBox ein.
    Das Programm öffnet Dazu Die Arbeitsmappe, und Liest die daten aus. Dies geschieht im Hintergrund da Excel auf Visible=false gesetzt wurde.

    PROBLEM:
    Die Mappe soll nach dem auslesen der Daten wieder geschlossen werden, so das keine Excel Prozesse mehr aktiv sind.
    Ich habe es mit dem befehl Shell("taskkill /F /IM EXCEL.EXE") probiert, dies schließt aber alle offenen Excel fenster, es soll aber nur das bestimmte geschlossen werden.

    Hoffe das mir jemand helfen kann.
    Vielleicht hättest Du zunächst die Suchfunktion benutzen sollen: Excel schließen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    hab ich schon gelesen, ich hab bis jetzt probiert excel wie folgt zu beenden:

    oExcel.activeworkbook.saved = True
    oExcel.DisplayAlerts = False
    oExcel.activeworkbook.close()
    oExcel.Quit()

    Der prozess bleibt trotzdem Aktiv
    Wie startest Du excel?
    Wie ist oExcel deklariert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    hier mein kompletter quellcode:

    VB.NET-Quellcode

    1. Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click
    2. Dim oExcel As Object
    3. Dim oBook As Object
    4. Dim row As String
    5. Dim col As Integer
    6. Dim oSheets As Object
    7. oExcel = CreateObject("Excel.Application")
    8. oExcel.visible = False
    9. oBook = oExcel.Workbooks.Open("PFAD", ReadOnly:=True)
    10. oSheets = oBook.Worksheets("KW19+20").Activate
    11. row = oExcel.Range("A1:A50").find(What:="KW58").Row()
    12. Try
    13. col = oExcel.Range("B" & row & ":K" & row).find(What:="BP").Column()
    14. Catch ex As Exception
    15. col = "0"
    16. End Try
    17. 'oRange = oSheet.Range("A:A").Find(what:="De Martino, Flavio", lookat:=1, MatchCase:=False)
    18. If col = "0" Then
    19. LB_Bp.Visible = True
    20. LB_Bp.Text = "Diese Woche keine Betriebspost"
    21. Else
    22. Select Case col
    23. Case Is = 2 Or 3
    24. LB_Bp.Text = "Montag"
    25. Case Is = 4 Or 5
    26. LB_Bp.Text = "Dienstag"
    27. Case Is = 6 Or 7
    28. LB_Bp.Text = "Mittwoch"
    29. Case Is = 8 Or 9
    30. LB_Bp.Text = "Donnerstag"
    31. Case Is = 10 Or 11
    32. LB_Bp.Text = "Freitag"
    33. End Select
    34. If col Mod 2 = 0 Then
    35. LB_Bp.Visible = True
    36. LB_Bp.Text = LB_Bp.Text & " Morgens"
    37. End If
    38. End If
    39. oExcel.activeworkbook.saved = True
    40. oExcel.DisplayAlerts = False
    41. oExcel.activeworkbook.close()
    42. oExcel.Quit()
    43. End Sub

    Itabasic schrieb:

    oExcel.activeworkbook.saved = True
    oExcel.activeworkbook.close()

    oExcel.activeworkbook hängt vom momentanen Zustand des Excel-Objekts ab.
    Wenn du parallel noch eine andere Arbeitsmappe offen hast, könnte auch die gerade aktiv sein.

    Für deine Arbeitsmappe hast du doch weiter oben extra das Objekt oBook zugewiesen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich sehe gerade einen anderen Fehler in Deinem Quelltext:
    Falsch :thumbdown: , die Fälle 2, 4, 6, 8, 10 werden nicht abgehandelt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Select Case col
    2. Case Is = 2 Or 3
    3. LB_Bp.Text = "Montag"
    4. Case Is = 4 Or 5
    5. LB_Bp.Text = "Dienstag"
    6. Case Is = 6 Or 7
    7. LB_Bp.Text = "Mittwoch"
    8. Case Is = 8 Or 9
    9. LB_Bp.Text = "Donnerstag"
    10. Case Is = 10 Or 11
    11. LB_Bp.Text = "Freitag"
    12. End Select

    Richtig:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Select Case col
    2. Case 2, 3
    3. LB_Bp.Text = "Montag"
    4. Case 4, 5
    5. LB_Bp.Text = "Dienstag"
    6. Case 6, 7
    7. LB_Bp.Text = "Mittwoch"
    8. Case 8, 9
    9. LB_Bp.Text = "Donnerstag"
    10. Case 10, 11
    11. LB_Bp.Text = "Freitag"
    12. End Select
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich würde mal oExcel.Visible = True setzen und im Debugger durchsteppen.
    Macht er den Close?
    Wirft der Quit irgendwo Fehler?
    Kommt er überhaupt soweit?


    Funktionell sind übrigens noch mehr Stockfehler drin:

    VB.NET-Quellcode

    1. 'oSheets = oBook.Worksheets("KW19+20").Activate
    2. oSheet = oBook.Worksheets("KW19+20")
    3. 'row = oExcel.Range("A1:A50").find(What:="KW58").Row()
    4. row = oSheet.Range("A1:A50").find(What:="KW58").Row()
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    hab visible auf true gesetzt,
    optisch sieht alles richtig aus excel wird geöffnet und geschlossen aber im taskmgr seh ich das der prozess noch aktiv ist.

    Danke für die anderen Korrekturen hab ich ebenfalls verbessert! :)
    Hi Leute,
    ich habe dasselbe Problem und weder in dem angegebenen Thread noch hier wirklich eine Lösung gefunden.
    Erst mal die wichtigsten Teile meines Quellcodes:

    Brainfuck-Quellcode

    1. Dim xlsapp As Excel.Application
    2. Dim xlswb As Excel.Workbook
    3. Dim xlssheet As Excel.Worksheet
    4. Dim xlsrange As Excel.Range
    5. xlsapp = New Excel.Application '<--------------------------------Hier wird im Taskmanager angezeigt, dass Excel gestartet ist
    6. xlswb = xlsapp.Workbooks.Open(Pfad & "\Verwaltung.xlsx")
    7. xlssheet = xlsapp.Worksheets("Daten")
    8. xlssheet.Activate()
    9. Spalten = xlsapp.Range("a1").Value
    10. Zeilen = xlsapp.Range("a2").Value
    11. xlswb.Close()
    12. xlswb = Nothing
    13. xlsapp.Quit()
    14. xlsapp = Nothing

    Erwartet hätte ich, dass spätestens mit xlsapp = Nothing der Excel-Prozess wieder gekillt wird. Wird er aber nicht.
    Starte ich den Code noch mal, wird sogar ein neuer Excel-Prozess gestartet.
    Erst wenn ich die Form schließe und das VB-Programm beendet wird, werden alle (wie viele auch immer erzeugt sind) Prozesse von Excel geschlossen.
    Hat irgendeiner eine Idee?
    Gruß
    Regulator

    P.S. Ich beobachte den Taskmanager während des Programmablaufs und weiß sicher, dass vor Programmaufruf kein Excel-Prozess gestartet ist.
    Ich nehme an, dass der Code hier auf die Schnauze fliegt und gar nicht bis zu Ende läuft:

    Regulator schrieb:

    Spalten = xlsapp.Range("a1").Value
    Range ist eine Eigenschaft des Sheet-Objekts:

    VB.NET-Quellcode

    1. Spalten = xlssheet.Range("a1").Value
    2. Zeilen = xlssheet.Range("a2").Value


    Das
    xlssheet.Activate()
    kannst du dir übrigens sparen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Es gibt viele Wege, die nach Rom führen
    Ja. Aber das sind viele Feldwege und nur wenige Autobahnen ;)
    BTW: Bei deiner Methode über Application.Range benötigst du das .Activate
    Lass aber keinen User aus Versehen in die Applikation klicken, sonst kann er die Activation verändern.

    Die Methoden .Activate und .Select sind in einer guten Programmierung bis auf wenige Ausnahmen tabu, weil sie Benutzerinteraktion simulieren und auch vom Benutzer beeinflusst werden können.

    zum eigentlichen Problem
    Vielleicht versucht er, einen Dateispeicherdialog anzuzeigen, was irgendwie nicht geht.
    Versuch:

    VB.NET-Quellcode

    1. xlswb.Close(SaveChanges:=False)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Lass aber keinen User aus Versehen in die Applikation klicken, sonst kann er die Activation verändern.
    Keine Angst; Excel ist "invisible" ;)

    petaod schrieb:

    Vielleicht versucht er, einen Dateispeicherdialog anzuzeigen, was irgendwie nicht geht.
    Versuch:

    VB.NET-Quellcode

    1. xlswb.Close(SaveChanges:=False)
    Daran lag's leider nicht :(
    Ich hab's jezt mit Prozess-Killen gelöst :cursing:
    Danke auf jeden Fall für die Ideen :)
    nanu? Anfang des Threads hießest du noch Itabasic?

    jdfs. Sauber wäre, du würdest jedes, aber auch wirklich jedes Excel-Objekt mit System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Object) As Integer freigeben.

    Dassis schwierig, denn jede Cell, die du benutzst, und jede Workbooks-Auflistung stellt ein ComObjekt dar.

    Da muß man bisserl herumforschen und bosseln, bis man die alle aufgespürt und sich gemerkt hat, und dass man sie anschließend auch wieder freigeben kann.

    V.a. überlegt man sich sorgfältig, welche Zugriffe auf ComObjekte wirklich notwendig sind.
    So hieß ich noch nie... ;)
    Habe den Thread nur benutzt, weil ich dasselbe Problem hatte und der Thread noch nicht abgeschlossen war :rolleyes:
    Den Befehl "System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Object) As Integer" hab' ich noch nie gehört. Da muss ich mich erst einlesen...
    Muss ich das? :whistling:
    Ich kenn da jemanden aus diesem Forum, der sagt if code runs then code.donottouch else code.debug oder so ähnlich. Mein Code runs :sleeping: