Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 11:16:26
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

On Error GoTo geht nicht

Forumthread: On Error GoTo geht nicht

On Error GoTo geht nicht
alex
Hallo alle zusammen,
ich habe ein problem mit dem befehl On Error GoTo
und zwar an der stelle meines codes wo on error goto 2 steht
er springt nicht zur 2: sondern zeigt mir statt dessen einen laufzeitfehler an.
Private Sub CommandButton9_Click()
Dim FsyObjekt As Object
Dim Jahr As String
Dim jahr1 As String
Dim name As String
Dim folder2 As String
If MsgBox("dieser Vorgang kann je nach Rechenleistung und Datenmenge bis zu 5 min dauern",  _
vbOKCancel) = vbOK Then
strpath = ThisWorkbook.Path
ChDir strpath
name = Left(strpath, 18)
folder = name & "wartung archiv"
Jahr = Year(Date)
folder2 = folder & "\" & Jahr
On Error GoTo 1
3:    MkDir folder2
1:      Set FsyObjekt = CreateObject("Scripting.FileSystemObject")
Err.Clear
On Error GoTo 2
FsyObjekt.CopyFolder strpath, folder2
Err.Clear
Else
Exit Sub
End If
MsgBox "Archivierung erfolgreich"
Exit Sub
2:    MsgBox "Der Ordner Wartungslisten\Wartung Archiv\ wurde gelöscht. Verzeichnis wird jetzt   _
_
erstellt"
MkDir folder
GoTo 3
End Sub

Anzeige
AW: On Error GoTo geht nicht
10.11.2009 16:46:07
Björn
Hallo,
ich würde sagen, er springt zur 2, aber die Zeile mit der MsgBox ist nicht richtig.
Was sollen die beiden Unterstriche "_" und Zeilenumbrüche? Stehen die so bei Dir im Code?
Gruß
Björn
AW: On Error GoTo geht nicht
10.11.2009 16:55:13
alex
nein das macht das forum automatisch wenn die zeile zu lang ist. bei mir stehts ohne _ in einer zeile.
er springt leider nicht zur 2 sondern gibt mir einen laufzeit fehler bei der zeile
"FsyObjekt.CopyFolder strpath, folder2"
diese zeile sollte er bei einem fehler eigentlich überspringen
Anzeige
frage ist natürlich noch offen o.T.
10.11.2009 16:56:10
alex
..dann solltest du auch den Haken setzen oT
10.11.2009 16:59:30
Björn
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 17:47:45
IngGi
Hallo Alex,
aus deinem Code wird mir nicht klar, was genau du machen willst, daher erstmal nur ganz allgemein. Wenn du mit der On Error-Anweisung eine Fehlerkorrektur programmierst, die Laufzeitfehler abfängt, dann springt die Ausführung des Codes nicht nur zu gewünschten Stelle, sondern VBA wechselt auch in den Fehlerkorrekturmodus. Dieser Fehlerkorrekturmodus muss durch einen Resume-Befehl wieder beendet werden, dann wechselt VBA wieder in den normalen Modus zurück.
Im Fehlerkorrekturmodus akzeptiert VBA keine weiteren On Error-Anweisungen. Daher werden zwischen On Error-Anweisung und Resume-Anweisung auftretende Laufzeitfehler nicht abgefangen, sondern die Ausführung bricht mit dem jeweiligen Laufzeitfehler ab.
Insofern ist deine Fehlerbehandlung grundlegend falsch angelegt. Statt über eine Fehlerbehandlung direkt an die richtige Stelle zu springen, könntest du alle Bearbeitungsmöglichkeiten in einer If...Then...ElseIf-Struktur anlegen, wobei du in den If- bzw. ElseIf-Anweisungen Variablen prüfst, die du in der Fehlerbehandlung entsprechend bestückst.
Gruß Ingolf
Anzeige
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 18:07:29
alex
ahh ok jetzt ist mir auch klar warum das nicht geklappt hat.
kann ich nicht hinter jeder sprung marke einen resume befehl einbauen so das excel den error modus verlässt?
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 18:15:15
IngGi
Hallo Alex,
nein, so funktioniert das nicht. Du müsstest den Resume-Befehl ja dorthin setzen, wo die Ausführung weitergeht, also dort, wohin du mit dem On Error GoTo-Befehl springst. Auf den Resume-Befehl hin springt VBA aber wieder auf den Befehl zurück, der den abgefangenen Laufzeitfehler ausgelöst hat (Resume) bzw. auf den darauf folgenden Befehl (Resume Next). Damit wird also auch die Wirkung der Spunganweisung aufgehoben.
Was soll das Makro denn genau tun?
Gruß Ingolf
Anzeige
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 18:25:35
alex
als erstes soll ein verzeichnis (jahreszahl als namen) in dem verzeichnis "wartung archiv" erstellt werden und alle daten aus dem verzeichnis "wartung aktuell" dort hin kopieren
sollte dieses verzeichnis schon existieren so soll excel kein verzeichnis erstellen sondern gleich kopieren (währe sprungmarke 1:). bis dahin funktioniert das makro.
sollte das verzeichnis "wartung archiv" nicht existieren so soll excel erst "wartung archiv" erstellen (sprungmarke 2:) und danach das verzeichnis "jahreszahl" (sprungmarke 3:)
Anzeige
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 18:43:14
Josef
Hallo Alex,
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long

Private Sub CommandButton9_Click()
  Dim Jahr As String, jahr1 As String, name As String, folder2 As String
  
  If MsgBox("dieser Vorgang kann je nach Rechenleistung und Datenmenge bis zu 5 min dauern", _
    vbOKCancel) = vbOK Then
    strpath = ThisWorkbook.Path
    name = Left(strpath, 18)
    folder = name & "wartung archiv"
    Jahr = Year(Date)
    folder2 = folder & "\" & Jahr
    
    MakeSureDirectoryPathExists folder2 & "\"
    
    If CopyFolder(strpath, folder2) > -1 Then MsgBox "Archivierung erfolgreich"
  End If
  
End Sub

Private Function CopyFolder(ByVal strSourceFolder As String, ByVal strTargetFolder As String) As Long
  Dim objFSO As Object
  
  CopyFolder = -1
  
  On Error GoTo ErrExit
  
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  
  CopyFolder = objFSO.CopyFolder(strSourceFolder, strTargetFolder)
  
  ErrExit:
  
  Set objFSO = Nothing
  
End Function

Gruß Sepp

Anzeige
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 19:00:51
alex
danke an Ingolf für den tipp mit dem resume befehl.
und danke sepp dein code funktioniert super.
nur leider habe ich keine ahnung was dort steht bzw. was excel dort macht^^
ich hatte es unterdessen auch hinbekommen.
ist es problematisch oder könnte es problematisch werden, wenn ich meinen code nehme?
Private Sub CommandButton9_Click()
Dim FsyObjekt As Object
Dim Jahr As String
Dim name As String
Dim folder2 As String
If MsgBox("dieser Vorgang kann je nach Rechenleistung und Datenmenge bis zu 5 min dauern",  _
vbOKCancel) = vbOK Then
strPath = ThisWorkbook.Path
ChDrive Left(strPath, 2)
ChDir strPath
name = Left(strPath, 18)
folder = name & "wartung archiv"
Jahr = Year(Date)
folder2 = folder & "\" & Jahr
On Error GoTo 1
3:    MkDir folder2
1:      Set FsyObjekt = CreateObject("Scripting.FileSystemObject")
Resume Next
On Error GoTo 2
FsyObjekt.CopyFolder strPath, folder2
Err.Clear
Else
Exit Sub
End If
MsgBox "Archivierung erfolgreich"
Exit Sub
2:    MsgBox "Der Ordner Wartungslisten\Wartung Archiv\ wurde gelöscht. Verzeichnis wird jetzt  _
erstellt"
MkDir folder
Resume
GoTo 3
End Sub
gruß alex
Anzeige
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 19:53:21
Josef
Hallo Alex,
der Code macht das selbe wie deiner, allerdings ohne Sprungmarken.
Die API-Funktion "MakeSureDirectoryPathExists" erstellt gesamte Vezeichnisbäume, sofern diese noch nicht existieren, in einem Rutsch. Wichtig ist dabei, das der Pfad mit "\" endet, sonst wird der letzte Teil nicht erstellt.
Gruß Sepp

Anzeige
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 19:02:20
IngGi
Hallo Alex,
versuch' mal folgendes (ungetestet):
Private Sub CommandButton9_Click()
Dim objFSO As Object
Dim strPath As String
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Dem Benutzer eine Abbruchmöglichkeit geben
If MsgBox("Dieser Vorgang kann je nach Rechenleistung und Datenmenge " _
& "bis zu 5 min dauern!", vbOKCancel) = vbCancel Then Exit Sub
'Ordner "wartung archiv" erstellen, falls dieser noch nicht existiert
If Not objFSO.FolderExists(Left(ThisWorkbook.Path, 18) _
& "wartung archiv") Then
objFSO.CreateFolder Left(ThisWorkbook.Path, 18) & "wartung archiv"
End If
'Im Ordner "wartung archiv" den aktuellen Jahresordner erstellen,
'falls dieser noch nicht existiert
If Not objFSO.FolderExists(Left(ThisWorkbook.Path, 18) _
& "wartung archiv\" & Year(Date)) Then
objFSO.CreateFolder Left(ThisWorkbook.Path, 18) & "wartung archiv\" & Year(Date)
End If
'Daten archivieren
objFSO.CopyFolder ThisWorkbook.Path, Left(ThisWorkbook.Path, 18) _
& "wartung archiv\" & Year(Date)
End Sub
Gruß Ingolf
Anzeige
AW: ..dann solltest du auch den Haken setzen oT
10.11.2009 19:22:59
alex
danke ingolf
dein code funktioniert einwandfrei. außerdem kann ich als anfänger noch nachvollziehen was dort passiert^^.
ich denke ich werde den nehmen.
gruß alex
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Fehlerbehebung bei "On Error GoTo" in VBA


Schritt-für-Schritt-Anleitung

  1. Fehlerbehandlung aktivieren: Du kannst die Fehlerbehandlung mit On Error GoTo aktivieren. Beispiel:

    On Error GoTo FehlerHandler
  2. Fehlerbehandlungsroutine definieren: Am Ende deines Codes solltest du eine Fehlerbehandlungsroutine hinzufügen:

    FehlerHandler:
    MsgBox "Ein Fehler ist aufgetreten."
    Resume Next ' oder Resume, je nach Bedarf
  3. Sprungmarken verwenden: Achte darauf, dass deine Sprungmarken korrekt benannt sind. Beispiel:

    Sub Beispiel()
    On Error GoTo FehlerHandler
    ' Hier kommt dein Code
    Exit Sub
    FehlerHandler:
    MsgBox "Fehler aufgetreten"
    Resume Next
    End Sub

Häufige Fehler und Lösungen

  • Problem: On Error GoTo funktioniert nicht.

    • Lösung: Stelle sicher, dass du On Error GoTo vor dem Codeblock deklarierst, der einen Laufzeitfehler verursachen könnte.
  • Problem: Der Code springt nicht zu der angegebenen Sprungmarke.

    • Lösung: Überprüfe, ob der Fehler tatsächlich im angegebenen Codeabschnitt auftritt. Nutze Err.Clear, um den Fehler zurückzusetzen.
  • Problem: Resume gibt nicht das gewünschte Verhalten.

    • Lösung: Nutze Resume Next, um mit dem nächsten Befehl fortzufahren, oder Resume <Sprungmarke>, um zu einer bestimmten Stelle im Code zu springen.

Alternative Methoden

  • VBA If Error Then: Anstelle von On Error GoTo kannst du auch Fehler mit einer If-Bedingung abfangen:

    If Not Dir(folder2, vbDirectory) = "" Then
      ' Ordner existiert
    Else
      MkDir folder2
    End If
  • Access VBA On Error Resume Next: In Access VBA kannst du On Error Resume Next verwenden, um Fehler zu ignorieren und fortzufahren. Dies ist jedoch risikobehaftet, wenn du Fehler nicht überprüfst.


Praktische Beispiele

Hier ist ein Beispiel, das die Nutzung von On Error GoTo und Sprungmarken demonstriert:

Private Sub CommandButton_Click()
    Dim FsyObjekt As Object
    Dim folderPath As String
    On Error GoTo FehlerHandler

    folderPath = "C:\Dein\Verzeichnis\"
    MkDir folderPath ' Wenn der Ordner bereits existiert, wird ein Fehler ausgelöst.

    Set FsyObjekt = CreateObject("Scripting.FileSystemObject")
    FsyObjekt.CopyFolder "C:\Quell\Ordner\", folderPath

    MsgBox "Kopieren erfolgreich"
    Exit Sub

FehlerHandler:
    MsgBox "Ein Fehler ist aufgetreten: " & Err.Description
    Resume Next
End Sub

Tipps für Profis

  • Vermeide Sprungmarken: Es empfiehlt sich, Sprungmarken zu minimieren und stattdessen strukturierte Fehlerbehandlung mit If...Then...Else zu verwenden.

  • Nutze Err-Objekt: Verwende das Err-Objekt, um spezifische Fehlercodes zu überprüfen und gezielt darauf zu reagieren. Beispiel:

    If Err.Number <> 0 Then
      MsgBox "Fehlernummer: " & Err.Number
    End If
  • Dokumentiere deine Fehlerbehandlung: Halte fest, welche Fehler abgefangen werden und wie darauf reagiert wird, um die Wartbarkeit deines Codes zu verbessern.


FAQ: Häufige Fragen

1. Warum funktioniert On Error GoTo nicht? Es ist wichtig, dass die On Error GoTo-Anweisung vor dem Code platziert wird, der möglicherweise einen Fehler auslösen könnte.

2. Wie kann ich einen bestimmten Fehler abfangen? Du kannst das Err.Number verwenden, um spezifische Fehlercodes zu prüfen und darauf zu reagieren.

3. Was ist der Unterschied zwischen Resume und Resume Next? Resume springt zu der Zeile zurück, die den Fehler verursacht hat, während Resume Next mit der nächsten Zeile nach dem Fehler fortfährt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige