VBA Schleife bei Fehlermeldung

  • #1
K

klexy

Bekanntes Mitglied
Themenersteller
Dabei seit
04.05.2002
Beiträge
802
Reaktionspunkte
0
Ort
Bayern
Hallo Leute, [/Latein]

Problem 1: Unser Netzwerk/Server hat manchmal Aussetzer, so daß die Fehlermeldung Fesstplatte ist voll kommt, wenn man eine Datei (zwischen)speichern will. Wenn man OK drückt und ein paar Sekunden später nochmal speichert, läuft alles einwandfrei. Dieses Problem liegt außerhalb meiner Macht.
Problem 2: Wenn dieser Speicherbefehl Teil eines passwortgeschützten Makros ist, bleibt dem User nur Beenden wenn die Fehlermeldung auftritt. Bei dem Makro, um das es mir geht, gibt es mehrere Speicherbefehle. Wenn das Makro jetzt irgendwo aussteigt, ist es kompliziert, herauszufinden bis zu welchem Schritt es schon durchgelaufen ist. Noch schwieriger ist es, das alles rückgängig zu machen, bzw. am richtigen Punkt wieder einzusetzen. Dazu muß ich dann immer selber manuell ran. Darauf hab ich aber keinen Bock.
Lösung: Ich hab um jeden Speicherbefehl herum eine Schleife gebastelt, die bei Fehler ein Popup ausgibt und nach Bestätigung des Popups den Speicherbefehl wiederholt.
Code:
' hier kommt das Makro dahergewackelt...

  Dim Mldg, Stil, Titel, Antwort
  
Anfang_1:
  On Error GoTo Schleife_1
  ActiveWorkbook.Save
  GoTo Hat_gespeichert_1
Schleife_1:
  Mldg =  & Chr(10) & _
  Speicherfehler.   Angeblich ist die Festplatte voll. & Chr(10) & _
   & Chr(10) & _
     bitte eine Weile warten und dann JA drücken.
  Stil = vbOKOnly
  Titel = Sackzement!
  Antwort = MsgBox(Mldg, Stil, Titel)
  If Antwort = vbOK Then
  GoTo Anfang_1
  End If
Hat_gespeichert_1:

' hier geht das Makro dann weiter...
Alles bestens, aber: Wenn nach dem Fehler wieder bei Anfang_1 angefangen wird aber der Fehler im Netzwerk immer noch andauert, hängt sich das Makro bei ActiveWorkbook.Save auf und ignoriert quasi beim zweiten mal das On Error GoTo Schleife_1.

Was mach ich falsch? Warum wird der Befehl On Error GoTo Schleife_1 beim zweiten Durchlauf ignoriert?
 
  • #2
Hallo klexy,

Fehler muß man auch wieder löschen.

Wenn der nächste Fehler auftaucht und noch ein Fehler gespeichert ist, weiß VBA nicht wohi damit und streikt.

Versuchs mal so:
Code:
->... hier kommt das Makro dahergewackelt...

    Dim Mldg, Stil, Titel, Antwort
    
    On Error GoTo Schleife_1
Anfang_1:
    ActiveWorkbook.Save
    On Error GoTo 0
    GoTo Hat_gespeichert_1
Schleife_1:
  Err.Clear
    On Error GoTo 0
    Mldg =  & Chr(10) & _
    Speicherfehler.     Angeblich ist die Festplatte voll. & Chr(10) & _
     & Chr(10) & _
         bitte eine Weile warten und dann JA drücken.
    Stil = vbOKOnly
    Titel = Sackzement!
    Antwort = MsgBox(Mldg, Stil, Titel)
    If Antwort = vbOK Then GoTo Anfang_1
    
Hat_gespeichert_1:

' hier geht das Makro dann weiter...

Gruß Matjes :)
 
  • #3
Danke, Matjes.
Err.Clear kannte ich bisher noch nicht.

3 Fragen:
1. Wieso hast du diese beiden Zeilen vertauscht?
Code:
  On Error GoTo Schleife_1
Anfang_1:
2. Wozu dient On Error GoTo 0?
3. Warum ist kein End If vorhanden?

Es funktioniert allerdings nicht. Das Makro steigt beim zweiten Durchgang der Schleife immer noch aus, wenn der Fehler noch besteht.
Ich hab die Vertauschung rückgängig gemacht, den Err.Clear hinter die Meldung gesetzt, den Err.Clear vor On Error GoTo Schleife_1 gesetzt - nichts hat geholfen.

Mein Testszenario: ich hab die Festplatte mit Dummy-Dateien vollgeballert, bis nur noch 3 MB Platz waren. Dann eine Datei mit 4 MB aufgerufen und einfach nur abgespeichert.
 
  • #4
Hallo klexy,

sorry , im dunklen fischen birgt immer einen Bug.

Besser:
Code:
->... hier kommt das Makro dahergewackelt...

    Dim Mldg, Stil, Titel, Antwort
    
    On Error GoTo Schleife_1
Anfang_1:
    ActiveWorkbook.Save
    GoTo Hat_gespeichert_1
Schleife_1:
    Err.Clear
    Mldg =  & Chr(10) & _
    Speicherfehler.     Angeblich ist die Festplatte voll. & Chr(10) & _
     & Chr(10) & _
         bitte eine Weile warten und dann JA drücken.
    Stil = vbOKOnly
    Titel = Sackzement!
    Antwort = MsgBox(Mldg, Stil, Titel)
    If Antwort = vbOK Then GoTo Anfang_1
    
Hat_gespeichert_1:
  On Error GoTo 0
' hier geht das Makro dann weiter..
Also:
mit->On Error GoTo Schleife_1' wird die Fehlerbehandlung angewiesen bei einem Fehler bei der Marke Schleife_1 fortzufahren. Wenn denn dieser Bereich durchlaufen ist, sollte die Fehlerbehandlung wieder auf den Default->Fehler anzeigen' zurückgeschaltet werden, da sonst bei einem Fehler im nachfolgenden Code wieder die Marke Schleife_1 angesprungen würde, was ja dann nicht mehr ganz sinnig wäre.
Das Einschalten des Default-Zustandes erfoplgt mit->On Error Goto 0'.

Warum->On Error GoTo Schleife_1' vor der Sprungmarke: Es reicht ein einmaliges Einschalten der Fehlerbehandlung auf diese Sprungmarke.

Warum If ohne->End if': Wenn alles in einer Zeile steht geht auch so  ;)


Grüße Matjes :)
 
  • #5
Danke für die Erklärungen, aber es geht immer noch nicht.
Beim zweiten Durchlauf (wenn also der Fehler vor OK nicht behoben ist), steigt das Makro am Speicherbefehl aus anstatt wieder in die Fehlerroutine zu gehen.
 
  • #6
ich werd's auch mal am lebenden Objekt ausprobieren.

Mit welcher Meldungsnummer steigt denn das Makro bei dir aus ?

Gruß Matjes :)
 
  • #7
Hallo klexy,

lebendes Objekt hat bei mir auch zugeschlagen. Ich überleg mir was für dich.

Gruß Matjes :)
 
  • #8
Hallo klexy,

Was mach ich falsch? Warum wird der Befehl On Error GoTo Schleife_1 beim zweiten Durchlauf ignoriert?
Nix  :1

Also weiter Untersuchungen haben ergeben, das sämtliche schreibenden Zugriffe (Save, SaveAs, SaveCopyAs)  diesen Bug haben, daß der Fehler sich nur einmal abfangen läßt und beim zweiten mal das Debug-Fenster aufgeht.  :tickedoff:



Einzige Abhilfe: vor Benutzung Platzverhältnisse klären.

Den freien Platz kann man mit folgender Funktion feststellen:
Code:
Function ShowFreeSpace(drvPath As String) As Long
 ->OUT: gibt Anzahl Bytes des freien Platz des angegebenen Laufwerks zurück
  
 ->IN: drvPath - nur Laufwerkspfad (c:\) oder
 ->              voller Pfad eine Files z.B. (ActiveWorkbook.FullName)
  Dim fs As Object, d As Object, s As String
    
  ShowFreeSpace = 0
  On Error GoTo AUFRAEUMEN
  Set fs = CreateObject(Scripting.FileSystemObject)
  Set d = fs.GetDrive(fs.GetDriveName(drvPath))
  ShowFreeSpace = d.FreeSpace
AUFRAEUMEN:
  Err.Clear
  Set fs = Nothing: Set d = Nothing
End Function

Die  Bestimmung des benötigten Platzes der aktuellen Mappe ist schwierig.

Mit
Code:
FileLen(ActiveWorkbook.FullName)
kann man die Länge der aktiven Mappe zum Zeitpunkt der letzten Speicherung / des Öffnens feststellen. Wie groß die Datei nach der Speicherung wird kann man mit einer Funktion nicht bestimmen. Um das genau herauszubekommen, müßte man mit->SaveCopyAs' auf einem Laufwerk, welches immer genug Platz bietet, eine  Kopie anfertigen und dann die Länge dieses Files mit FileLen() bestimmen.

Wenn man kein Laufwerk benutzen kann, dass immer genügend Platz für die Kopie bietet, kann man sich mit einem Schätz-Faktor helfen.
Man nimmt die letzte gespeicherte Länge des Files und schlägt ein Faktor auf, von dem man annimmt, daß er nicht überschritten wird, also z.B. 2, also doppelte Größe.

Wenn man benötigten und freien Platz vergleicht, kann man jetzt im Vorhinein entscheiden, ob eine Speicherung erfolgreich sein wird.

Gruß Matjes :)
 
  • #9
Hallo Matjes,
schönen Dank. Ich hab die nächsten 3 Tage Urlaub, werd mich dann aber darüber machen, dein Makro zu verstehen.
Aber ich glaube nicht, daß es hilft.
Auf unserem Netzlaufwerk sind mehrere GB Speicher frei - das ist nicht die Frage, aber das Netzwerk hat manchmal einen Schluckauf. Wahrscheinlich nur sekundenweise. Und in dem Augenblick gibt es eben die Meldung zurück Festplatte ist voll oder - wenn die Fehlermeldung während der Ausführung eines Makros kommt . Laufzeitfehler 1004(?) - Festplatte ist voll (oder so ähnlich).

Was ich will, ist einfach nur einen Augenblick verweilen (dazu erscheint das Popup) und nach Bestätigung des Popups einen neuen Anlauf nehmen. Da ich aber nicht weiß, wie häufig dieser Schluckauf stattfindet, wollte ich der Möglichkeit vorbeugen, daß er unmittelbar nach OK beim gleichen Speichervorgang wieder auftritt - oder noch anhält. Bisher hat es immer genügt, die Schleife 1x zu durchlaufen.

Unsere IT weiß auch nicht, was da, wann, wie lang und warum passiert. Die Schluckauftheorie ist nur die Quintessenz meiner Beobachtungen. Die IT sagt zwar reflexmäßig, daß das an meinen Makros liegt, aber das hat sich bisher immer als falsch herausgestellt (schließlich hab ich bei Majes gelernt :). Es passiert nämlich auch beim Verschieben von Dateien im Explorer. Da erscheint dann eine Meldung wegen Server oder Laufwerk oder so, aber ich denke, daß das nur die textliche Interpretation des gleichen Fehlercodes ist, die jedes Programm anders vornimmt.
 
Thema:

VBA Schleife bei Fehlermeldung

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben