On Error GoTo geht nicht | Herbers Excel-Forum

Informationen und Beispiele zu den hier genannten Dialog-Elementen:


Betrifft: On Error GoTo geht nicht
von: alex
Geschrieben am: 10.11.2009 16:31:42

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

Betrifft: AW: On Error GoTo geht nicht
von: Björn B.
Geschrieben am: 10.11.2009 16:46:07
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

Betrifft: AW: On Error GoTo geht nicht
von: alex
Geschrieben am: 10.11.2009 16:55:13
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

Betrifft: frage ist natürlich noch offen o.T.
von: alex
Geschrieben am: 10.11.2009 16:56:10


Betrifft: ..dann solltest du auch den Haken setzen oT
von: Björn B.
Geschrieben am: 10.11.2009 16:59:30


Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: IngGi
Geschrieben am: 10.11.2009 17:47:45
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

Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: alex
Geschrieben am: 10.11.2009 18:07:29
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?

Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: IngGi
Geschrieben am: 10.11.2009 18:15:15
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

Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: alex
Geschrieben am: 10.11.2009 18:25:35
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:)

Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: Josef Ehrensberger
Geschrieben am: 10.11.2009 18:43:14
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


Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: alex
Geschrieben am: 10.11.2009 19:00:51
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

Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: Josef Ehrensberger
Geschrieben am: 10.11.2009 19:53:21
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


Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: IngGi
Geschrieben am: 10.11.2009 19:02:20
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

Betrifft: AW: ..dann solltest du auch den Haken setzen oT
von: alex
Geschrieben am: 10.11.2009 19:22:59
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

Beiträge aus den Excel-Beispielen zum Thema "Zeile einfügen"