Office: (Office 2010) Fehler in Fehlerbehandlung

Helfe beim Thema Fehler in Fehlerbehandlung in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo Zusammen, Dieses Problem schließt sich an mein letztes Thema Excel zu CSV an. Da das eigentliche Problem gelöst ist, eröffne ich ein Neues. In... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Forza SGD, 27. Juli 2015.

  1. Fehler in Fehlerbehandlung


    Hallo Zusammen,

    Dieses Problem schließt sich an mein letztes Thema Excel zu CSV an. Da das eigentliche Problem gelöst ist, eröffne ich ein Neues.

    In meiner Routine wird unter anderem eine Excel-Instanz erzeugt, welche auch wieder geschlossen wird. Sollte es zu Komplikationen während der Verarbeitung innerhalb der Excel-Instanz kommen, sollte in der Fehlerbehandlung die Excel-Instanz trotz alledem sauber geschlossen werden. Größtenteils funktioniert auch alles, bis auf Folgendes ...

    Tritt ein Fehler auf wird dieser über den Error Handler ausgegeben. Im folgenden wird auf die Sprungmarke Exit Sub verwiesen, wo die Instanz geschlossen wird.

    Allerdings wird Exit Sun auch im Normalfall (ohne Fehler) durchlaufen. Dort wird geprüft ob eine Excel-Instanz offen ist.

    Code:
    Prüfung erfolgt wie folgt:

    Code:
    Dies gibt im Normalfall FALSE zurück. Im folgenden wird geprüft ob der Verweis auf die Excel-Instanz zerstört wurde.

    Code:
    Und hier geschieht das für mich eigenartige. Ich habe alle Schritte parallel am Taskmanager nachvollzogen. Die Prüfung ob eine Excel-Instanz vorhanden ist ergibt FALSE. Auch im Taskmanager tauch die Instanz nicht mehr auf. Wird der Verweis auf NOTHING geprüft, erhalte ich allerdings ebenfalls FALSE und im Taskmanager erscheint die Instanz wieder um dann im nächsten Schritt wieder zerstört zu werden. Aber es ist lediglich der Verweis. Eine wiederholte Prüfung auf Existenz der Instanz ergibt ... es gibt keine.

    Kurz um ... ich versteh das nicht *Smilie

    :)
     
    Forza SGD, 27. Juli 2015
    #1
  2. ...kann ich nicht bestätigen, die Applikation wird geschlossen und öffnet sich bei mir nicht noch mal.
    Auch im Task-Manager nicht.
    Das dieser Code Set xlApp = Nothing ausgeführt wird, ist normal, das Set wurde ja noch nicht auf Nothing gesetzt.
     
    Kyron9000, 29. Juli 2015
    #2
  3. Hallo Kryon,

    danke für Deine Antwort. Ich hab es wahrscheinlich vergessen zu erwähnen.
    Das Set wurde bereits auf NOTHING gesetzt. Und zwar nach der regulären Beendigung der Arbeiten in der Excel-Instanz.

    Code:
    Danach ist die Instanz auch geschlossen - auch im Taskmanager.Es wird dann lediglich unter Exit Sub nochmals geprüft ob es schon NOTHING gesetzt wurde. Zumindest war dies meine Intention. Bei dieser Prüfung wird diese aber erneut geöffnet und wieder geschlossen. Das es bei Dir nicht passiert stimmt mich nun nicht gerade zuversichtlich *bawling

    Ich probier's nochmal an einem anderen Rechner.

    Darüber hinaus bin ich Dir noch eine Rückmeldung schuldig. Wird nachgeholt.
     
    Forza SGD, 29. Juli 2015
    #3
  4. Fehler in Fehlerbehandlung

    Anderer Rechner, gleiches Resultat.
     
    Forza SGD, 29. Juli 2015
    #4
  5. Hallo!

    Ein paar Gedanken zum im Beitrag #1 gezeigten Code:
    wie stellst du sicher, dass du mit GetObject die von dir erstellte Intanz erwischt und keine andere Ecel-Instanz, die beispielsweise der User selbst geöffent hat, weil er eine andere Excel-Datei bearbeitet?

    Ansonsten:
    Code:
    Wie hängt die Referenz in xlApp mit der Referenz, die in Excel_Instanz_offen mittel GetObject ermittelt wird zusammen?

    Wäre nicht so etwas besser:
    Code:
    Weiters: Falls xlApp und die Referenz über GetObject die identische Instanz sind, wird die 2x geschlossen. 1x in Excel_Instanz_offen und 1x im If-Block.

    mfg
    Josef
     
    Josef P., 29. Juli 2015
    #5
  6. Hallo Josef,

    Gar nicht ... habe mich in der Zwischenzeit mal ein wenig mehr belesen können. So wie ich den Sachverhalt verstehe, greift GetObject stets die zuerst geöffnete Instanz ... was mich zu der Frage führt, ob ich die in der Routine geöffnete Instanz überhaupt eindeutig ansprechen kann?

    Ein weiterführender Beitrag besagt, das wäre lediglich über Einträge in der Running Object Table möglich! So wie es sich mir erschließt könnte ich die von mir geöffnete Instanz xlApp selbt da nicht eindeutig identifizieren, selbst wenn ich diese als Parameter an die Funktion Excel_Instanz_offen übergebe. Oder sehe ich das falsch?

    Wie sollte man den in einem solchen Fall adäquat reagieren? Also wenn ein Fehler zum Abbruch führt und die Excel-Instanz noch offen ist.

    Danke für Deine Hilfe!

    Gruß

    Andreas
     
    Forza SGD, 29. Juli 2015
    #6
  7. Hallo!

    Wenn ein Fehler auftritt und du noch die Referenz zur Excel-Instanz hast, würde ich über diese Referenz schließen.
    Auf gut Glück eine Referenz mit GetObject (ohne den Dateinamen zu prüfen) holen, halte ich für zu riskant. Bevor ich das mache, würde ich lieber die Excel-Instanz offen lassen - was aber nicht notwendig sein sollte, da die Referenz bis zum Fehlerfall bekannt sein sollte.

    Den Einsatz von "Excel_Instanz_offen" halte ich mit dem gezeigten Code eher für eine Fehlerquelle als für eine Fehlervermeidung bzw. Fehlerbehebung. ;-)

    mfg
    Josef
     
    Josef P., 29. Juli 2015
    #7
  8. Fehler in Fehlerbehandlung

    Wenn Du die Excelinstanz statt Private in einer Routine einfach mal in einer öffentlichen Property erstellst, hast Du stets eine Referenz darauf ... und musst nicht erst auf eine "unbekannte" Instanz eine Referenz errichten.

    Eine solche Instanz ließe sich auch noch für zusätzliche Aufgaben bei Einbeziehung von Excel verwenden.
    Aufgabe wäre es dann, ein passendes Ereignis (spätestens Beenden der DB-Sitzung) zu finden, um die bekannte Instanz explizit zu schließen.
     
    ebs17, 29. Juli 2015
    #8
  9. Hallo Josef,

    Das GetObject mich hier nicht weiterbringt und ungeeignet ist, habe ich verstanden. Modul wurde entfernt. Allerdings schließe ich nicht irgendeine Instanz sondern die von mir referenzierte xlAPP. Allerdings auch nur im Falle das irgendeine Instanz zum Zeitpunkt der Prüfung noch offen ist. Kritik angenommen. Beim Test an meinem Rechner ist mir der Gedanke, das ein User noch andere Instanzen offen haben könnte auch völlig entglitten.

    Per se wird die Instanz sauber geschlossen. Dies bezieht sich ja auf den Fall der Abbruch herbeigeführt wird während die von mir geöffnete Instanz noch offen ist. Die Prüfung If not xlApp is nothing ... führt leider nicht zum gewünschten Ergebnis. Weil Access die Existenz des Verweises zurückmeldet, selbst wenn dieser vorher sauber zerstört wurde. Soll heißen, im Taskmanager war die Excel-Instanz nicht mehr sichtbar.

    Ich dächte ich schließe die Excel-Instanz über die Referenz: xlApp.quit und Set xlApp = nothing ... Aber wie prüfe ich nun richtig, ob diese Instanz noch offen ist oder nicht?

    Sieh mir meine Unkenntnis bitte nach ...
     
    Forza SGD, 30. Juli 2015
    #9
  10. Hallo ebs,

    auch hier muss ich kapitulieren. Finde die Idee prinzipiell ja nicht schlecht, doch scheitert dies an meiner Unkenntnis. Ich bekomme es hin beim starten der Anwendung eine Excel-Instanz aufzurufen .. jene global zugänglich zu machen allem Anschein nach aber nicht ... dann die Subroutinen, welche auf die Instanz zuzugreifen versuchen ... erkennen die Referenz nicht.

    Wie erstelle ich diese Instanz als öffentlichen Property?
     
    Forza SGD, 30. Juli 2015
    #10
  11. Hallo!

    Grundsätzliches:
    In einer Objektvariablen wird die Referenz auf ein Objekt/Instanz gespeichert.
    Mit "is nothing" wir im Prinzip nur geprüft, ob der Zeiger auf den "0-Speicher" verweist (=Nothing), nicht ob die dazu gehörige Instanz noch verfügbar ist. (Im Beispiel-Code mit xlBook erkennbar)

    Beispiel:
    Code:
    Bezüglich "Referenz in globaler Variable abspeichern": das hilft meiner Meinung nicht, um das eigentliche Problem zu beheben. Das führt nur dazu, dass man sehr genau darauf achten muss, immer die richtige Instanz in der Variablen zu haben.
    Ich persönlich halte die Verwendung von globalen Variablen für Fehlerquellen, die man sich selbst bastelt. Bis auf wenige Ausnahmen, kann man meiner Meinung nach auf globale Variablen verzichten.

    mfg
    Josef
     
    Josef P., 30. Juli 2015
    #11
  12. Hallo Josef,

    ich glaube wir reden etwas aneinander vorbei. Sollte ich Dich einfach nicht verstehen, bitte ich um Nachsicht. Das von Dir beschriebene Grundsätzliche ist verständlich und mir durchaus bewusst. Ich versuche mein Problem an Hand zweier Beispiele zu demonstrieren.

    Dein Code funktioniert einwandfrei ... folgend eine etwas verkürzte Variante:

    Code:
    Der Debugger gibt zwei Mal wahr zurück. Sozusagen wie gewünscht.

    Im folgenden mein Code-Fragment:

    Code:
    Nach der Anweisung xlApp.Quit sowie Set xlApp = Nothing ist die Excel-Instanz im Taskmanager nicht mehr sichtbar.

    Nach dem Aufruf Debug.Print bestätigt er das alle Objekte geschlossen sind. Einzige Ausnahme ist xlApp. Nach dem Aufruf Debug.Print liefert xlApp Is Nothing False und die Excel-Instanz ist auch wieder im Taskmanager sichtbar. Das verstehe ich nicht.
     
    Forza SGD, 31. Juli 2015
    #12
  13. Fehler in Fehlerbehandlung

    Der Fehler steckt in den "Features" von VBA. ;-)

    Code:
    Das New sorgt dafür, dass xlApp sofort wieder erzeugt wird, wenn es verwendet wird und auf Nothing steht.

    Zum Testen / Ablaufbeschreibung als Code:
    Code:
    Sauberer Code:
    Code:
    mfg
    Josef
     
    Josef P., 31. Juli 2015
    #13
  14. Vielen Dank Josef ... des Rätsels Lösung!

    Der Teufel steckt im Detail und der Fehler vor dem PC. Hätte auch nie gedacht das etwas oder jemand anderes am Fehlverhalten Schuld sein kann *Smilie

    Bleibt noch folgende Frage:

    Wie behandle ich einen Fehler der noch bei bestehender Instanz zum Abbruch führt? Sprich, wie schließe ich alles sauber?

    Im Falle eines Fehlers gab der Error-Handler jenen aus und verwies auf die Sprungmarke Exit_Sub. Dort geschieht unter anderem folgendes:

    Code:
    Code:
    Der auskommentierte Bereich war die Prüfung nach einer offenen Excel-Instanz, welche ja bereits als unbrauchbar deklariert wurde. Was für Möglichkeiten habe ich denn bzw. ist der Error-Handler im allgem. übertrieben? Oder langt es den Verweis zu zerstören da die Instanz mit Beendigung der Subroutine sowieso beendet wird? ebs schlug ja vor diese Instanz öffentlich zu machen und erst mit schließen der DB zu beenden.
     
    Forza SGD, 31. Juli 2015
    #14
  15. Hallo!

    Ich mache es normalerweise so:
    Meine Prozeduren sind relativ klein, da ich ich für die einzelnen Aufgaben in extra Prozeduren durchführe.
    Das führt dazu, dass man in einer Prozedur selten mehrere Objekte erzeugt.
    Auf das korrekte Schließen einer Instanz muss ich dann auch nur in der Prozedur achten, in der sie geöffnet wurde.

    Im gezeigten Code aus Beitrag #14 halte ich die Nothing-Prüfungen für unübersichtlich.

    Wenn du Excel ordentlich schließen willst, musst du eigentlich nur darauf achten, dass alle Workbooks zu sind. Eventuell noch Application.Quit ausführen.
    Die Referenzen auf Nothing setzen, kann den Code besser lesbar machen, notwendig ist das in VB6/VBA nicht, die die Objektvariablen einer Prozedur spätestens beim Verlassen der Prozedur zerstört werden.

    Ich selbst schreibe ein Referenz = Nothing gerne in den Code, wenn ich die Referenz bereits vor dem Ende der Prozedur entfernen will. Das ist für mich ein Zeichen, dass ab dieser Stelle die Referenz nicht mehr eingesetzt werden darf.

    mfg
    Josef
     
    Josef P., 31. Juli 2015
    #15
Thema:

Fehler in Fehlerbehandlung

Die Seite wird geladen...
  1. Fehler in Fehlerbehandlung - Similar Threads - Fehler Fehlerbehandlung

  2. Fehler (0x800CCC78) beim Ausführen der Aufgabe "xx.yyyy@kabelmail.de - Nachrichten werden gesendet"

    in Microsoft Outlook Hilfe
    Fehler (0x800CCC78) beim Ausführen der Aufgabe "xx.yyyy@kabelmail.de - Nachrichten werden gesendet": Bei mir taucht im Outlook ständig folgender Fehler auf: (0x800CCC78) beim Ausführen der Aufgabe "xx.yyyy@kabelmail.de - Nachrichten werden gesendet": "Die Nachricht kann nicht gesendet werden....
  3. Fehler beim SVERWEIS Vermeidbar?

    in Microsoft Excel Hilfe
    Fehler beim SVERWEIS Vermeidbar?: Hallo, ich habe eine Tabelle mit SVERWEIS. Der erste Tab ist quasi eine Übersicht nach Jahren und dann die weiteren Tabs die Eingaben in den Jahren (Artikel, Bestand, Einkaufspreis usw). Die...
  4. Installation schlägt fehl - Fehler in OfficeClickToRun.exe

    in Sonstiges
    Installation schlägt fehl - Fehler in OfficeClickToRun.exe: Hallo, ich habe ein Problem beim Installieren von Office Ich erhalte die folgende Fehlermeldung: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ OfficeClickToRun.exe - Anwendungsfehler Die Anwendung...
  5. Bei meinem Outlook (new) fehlen wichtige Funktionen!

    in Microsoft Outlook Hilfe
    Bei meinem Outlook (new) fehlen wichtige Funktionen!: Hallo, wie der Titel bereits andeutet, habe ich Probleme mit Outlook. Zum Beispiel ist es mir nicht möglich, Add-ins zu installieren. Es gibt keinen Button dafür, und auch wenn ich über die...
  6. Ständige Passwortabfrage und Kalendersyncronisations Fehler

    in Microsoft Outlook Hilfe
    Ständige Passwortabfrage und Kalendersyncronisations Fehler: Guten Tag, ich bin neu in diesem Forum und hoffe nach vergeblicher Suche im Microsoft Forum hier Hilfe zu bekommen. Nach einem Wechsel von Win 10 auf 11 Anfang dieses Jahres habe ich folgende 2...
  7. Formel mit INDEX, MATCH und MAX gibt Fehler #NAME!

    in Microsoft Excel Hilfe
    Formel mit INDEX, MATCH und MAX gibt Fehler #NAME!: Hallo zusammen, ich habe mit Hilfe von Copliot eine Formel gebaut, die 2 Werte aus einer Tabelle 1 in einer Tabelle 2 prüfen soll und wenn die Konstellation vorkommt, soll das größte Wert dieser...
  8. Wert Fehler

    in Microsoft Excel Hilfe
    Wert Fehler: Hallo zusammen, sicher gibt es schon diverse Beiträge, leider habe ich keinen gefunden, der mein Problem los. Ich habe mal einen Auszug meiner Tabelle angehängt. Leider kriege ich in einigen...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden