Anzeige
Archiv - Navigation
1112to1116
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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
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:)
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

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

100 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige