Excel VBA Errorhandling

tobias_2

Cadet 4th Year
Registriert
Nov. 2009
Beiträge
84
Hallo Com,

habe da ein Problem mit dem Errorhandling in folgendem Code:
Code:
Private Sub CommandButton1_Click()

    On Error GoTo Errorhandler

    Dim kw As Integer
        ermittlung_kw
        kw = lesen_kw()
    
    Dim mappenname As String
    mappenname = Format(Now, "yyyy") & "_" & kw & ".KW"

    Dim wsNew As Worksheet
    Set wsNew = Worksheets.Add
    With wsNew
        .Name = mappenname
        .Move after:=Sheets(Sheets.Count) 'fügt das Arbeitsblatt ans Ende der Mappe hinzu
    End With

    'Zum Kopieren des Inhalts aus der Vorlage in die neue Arbeitsmappe
    Set wsNew = Nothing
    Dim wsKopie As Worksheet
    Set wsKopie = Sheets(1)
    With Sheets(1)
        .Range("A1:A49").Copy Destination:=Sheets(4).Range("A1:A41") 'wird immer nur in Sheet 4 kopiert !!
    End With
    
Errorhandler:
    Select Case Err.Number
    Case 1004
    MsgBox "Arbeitsblatt zur aktuellen Kalenderwoche bereits angelegt", vbOKOnly, "Achtung!"
    End Select

End Sub

zum Programm:
Es soll durch Klicken des Buttons automatisch ein neues Arbeitsblatt erstellt werden und Teile des Inhaltes eines anderen Arbeitsblattes gleich hinein kopiert werden.
Der Name des neuen Arbeitsblattes, hängt von der aktuellen Kalenderwoche ab. Das bedeutet, klickt man den Button zweifach, wird versucht ein Arbeitsblatt mit selbem Namen zu erstellt, was zu einem Fehler führt.
Hier kommt der Errorhandler ins Spiel und wirft die MessageBox (=> s.o.)

Problem des Ganzen => Es wird trotzdem ein neues Arbeitsblatt erzeugt, welches dann z.B. "Tabelle 35" o.ä. heißt.

Hoffe jemand kann dem Problem auf den Grund gehen :freak:
 
Frag doch bevor du ein neues Blatt erstellst ab ob der name schon existiert...

in Zeile 11:

dim x as worksheet
Set X= worksheets(mappenname)

Oh halt nein! Das springt zu Errorhandler wenn das Blatt nicht existiert...
Ich schreib das immer in eigene Funktion die du dann immer wieder aufrufen kannst...
 
Zuletzt bearbeitet:
Frag doch bevor du ein neues Blatt erstellst ab ob der name schon existiert...
Das versuche ich auch schon die ganze Zeit
Code:
if mappenname <> wsNew then
'dann lege neues Tabellenblatt mit Name xx an und kopiere Inhalt aus Tabellenblatt xx sonst MsgBox "..."

das hat leider nicht geklappt, der schmeißt mir dann den Fehlercode 1004 :(
 
Also entweder kannst du mit einer eigenen Function arbeiten

Zeile 11:
If IsSheetExist(mappenname) Then GoTo Errorhandler

+ Neue Function
Public Function IsSheetExist(SheetName) As Boolean
Dim x As Worksheet
On Error GoTo Errorhandler
Set x = Sheets(SheetName)
IsSheetExist = True
Errorhandler:
End Function

oder du gehst mit einer Schleife durch alle Blätter und schaust wie die heißen..

Zeile 11:
For i = 1 To Worksheets.Count
If Worksheets(i).Name = mappenname Then GoTo Errorhandler
Next i
 
Mal ein allgemeines Wort zu OnError Goto:

Wenn man ordentlich programmiert braucht man das nie und nimmer. Klar muss man Probleme kennen um sie wegzufiltern, aber das muss man ja auch um den Error-Code abzuarbeiten.
Jeden Fehler den man selbst kontrolliert abfängt lässt die Ü-Eier übrig auf die ein DAU schlafwandlerisch zusteuert. Tut er das bei aktivem OnError kann er in einer Art Falle landen - und wenn er dich dann ruft das zu lösen sitzt du um so mehr in der Tinte und schaust nicht gut aus.

Auch ich grase bei neuen Blättern oder auch bei Löschaktionen alle ab um eine Fehlerentscheidung zu treffen.

CN8
 
Ü-Eier? Die kann man doch auch abfangen. Einfach ein Select-Case und für den Default Case z.B. über MsgBox Fehlerbeschreibung ausgeben lassen.
 
Ü-Eier - weil du die Ü ja nicht kannst, da kannste (dann) auch mit Select-Case nichts ausrichten.

(Ich sehe echt keinen Grund Errors zu Handeln - viel eher lasse ich sie gar nicht entstehen. Bei ständigem Durchfall mache ich mir ja auch weniger Sorgen um die Qualität des dreilagigen Papiers [Bürste gleich gar nicht, die ist zu hart!], ich greife die Ursache an! ;) )

CN8
 
Verzichten würde ich aber auf OnError-Goto dennoch nicht. Natürlich sollte man die üblichen Verdächtigen abfangen. Aber ein DAU ist immer dümmer als man glaubt, daher dann doch lieber ein Error-Handling (für alle anderen Fälle) mit einbauen als eine Fehlermeldung provozieren, die das Programm schlecht aussehen lässt.
 
«Unbekannte Schutzverletzung» :D
…das wäre unter meiner Würde.
CN8
 
@BORG316:
Durch beide Alternativen, wird zwar kein neues Arbeitsblatt mehr angelegt, aber die MsgBox aus dem Errorhandler wird auch nicht ausgegeben..
 
Zurück
Oben