Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

automatisches Arbeitsblatt löschen





Frage

Hallo, habe mir eine tolle Prozedur ausgedacht, die über einen CommandButton Arbeitsblätter löscht. Allerdings muss nicht nur das jeweilige Arbeitsblatt mit dem Namen (oder teilen des Namens) aus der Arbeitsmappe gelöscht werden, sondern auch die Zeilen mit den Verweisen auf der Übersichtsseite. Das meiste funktioniert auch zufriedenstellend, leider hängt sie sich aber im oberen Bereich auf und ich sehe einfach das Problem nicht. Hoffe ihr könnt mir die Tomaten von den Augen nehmen. Vielen Dank gruß stronge [code]Sub Blatt_loeschen() On Error GoTo Err_Blatt_loeschen Dim Name_SG, DelName_SG As String Dim i As Integer Dim bytSh As Byte Dim x As Boolean ´Namen einlesen Name_SG = InputBox("Bitte Namen des gewünschten Steuergeräts eingeben, welches aus der Datenbank gelöscht werden soll!","SG Datenblatt löschen") x = False ´kein Name eingegeben If Name_SG = "" Then MsgBox "Keinen Namen eingegeben!", 16, "Fehlermeldung" Exit Sub End If ´Prüfung ob Name existiert Do Until x = True For bytSh = 1 To ActiveWorkbook.Sheets.Count Do Until x = True If Sheets(bytSh).name = Name_SG Then x = True Else x = False End If Loop Next Loop MsgBox x If x = True Then ´Namen vergleichen und richtige Zeile auf Übersicht löschen For i = 8 To ActiveWorkbook.Sheets.Count + 8 DelName_SG = ActiveWorkbook.Sheets(1).Range("B" & i).Value If InStr(1, DelName_SG, Name_SG) <> 0 Then ActiveSheet.Rows(i).Delete End If Next i For i = 1 To ActiveWorkbook.Sheets.Count DelName_SG = ActiveWorkbook.Sheets(i).Name If InStr(1, DelName_SG, Name_SG) <> 0 Then Application.DisplayAlerts = False ActiveWorkbook.Sheets(i).Delete Application.DisplayAlerts = True End If Next i MsgBox "Steuergeräte Datenblatt wurde gefunden und gelöscht." Else MsgBox "Der Name des Steuergeräts ´" & Name_SG & "´ existiert nicht!", 16, "Fehlermeldung" Exit Sub End If Exit_Blatt_loeschen: Exit Sub Err_Blatt_loeschen: MsgBox "Kein Datenblatt mit diesem Namen gefunden!", 16, "Fehlermeldung" Resume Exit_Blatt_loeschen End Sub [/code]

Antwort 1 von Gast

Hallo

Verteil das Statment:
Application.DisplayAlerts = False ActiveWorkbook.Sheets(i).Delete

auf zwei Zeilen

Application.DisplayAlerts = False
ActiveWorkbook.Sheets(i).Delete

so dann gehts

Gruß

Antwort 2 von stronge

Hallo,

nein das ist nicht das Problem, habe es nur falsch kopiert. Ist schon klar das das nicht geht.

Das Problem tritt oben bei

´Prüfung ob Name existiert
Do Until x = True

auf. Gruß stronge

Antwort 3 von Gast

Hallo

Hast Du event. mehr als 256 Tabellenblätter?
Wenn Ja, solltest Du eine andere Variablenart z.B. integer bis wählen.

Gruß

Antwort 4 von stronge

nein das ist auch kein problem, ist denn die do until schleife überhaupt logisch aufgebaut?

Antwort 5 von Gast

Hallo
Den Part würde ich so schreiben:

´Prüfung ob Name existiert
Do Until x = True
For bytSh = 1 To ActiveWorkbook.Sheets.Count
If Sheets(bytSh).Name = Name_SG Then
x = True
Exit For
Else
x = False
End If
Next
Loop


Da ich aber nicht das ganze Projekt kenne ist es iommer schwer den Zweck des Codes zu überblicken.
Gruß

Antwort 6 von CaroS

Hallo stronge,

ich schließe mich dem 50%-Vorschlag von Gast an und schlage vor, auch auf die äußere Do-Until-Schleife zu verzichten.

Warum?

Do Until x = True ´ <-- Löschen
For bytSh = 1 To ActiveWorkbook.Sheets.Count
If Sheets(bytSh).Name = Name_SG Then
x = True
Exit For
Else
x = False
End If
Next
Loop ´ <-- Löschen
Rem Evtl. hinzufügen: If x = False Then Exit Sub

Sie scheint keine Funktion zu haben. In der For-Schleife werden alle Tabellennamen durchsucht, ob der zu löschende dabei ist. Wird er gefunden, ist alles klar. Exit For kürzt nicht nur das Prozedere ab, sondern lässt auch den Zähler bytSh ordentlich "auf der Fundstelle". Damit könntest Du Dir den ganzen übernächsten Block zum Finden und Löschen des Tabellenblattes sparen und es stattdessen - gleich oder später - mit ActiveWorkbook.Sheets(bytSh).Delete löschen.

Nach Exit For geht man mit x = True auch aus der Do-Until-Schleife raus, aber wozu war man eigentlich drin?

Anderer Fall, der Tabellenname wird nicht gefunden, man ist durch die For-Schleife durch und raus, x ist False geblieben. Jetzt steckt man in der Do-Until-Schleife, und die sagt: Mach´s noch einmal, Joe! Also wieder rein in die For-Schleife und wieder raus und wieder rein usw. Kannst eigentlich froh sein, dass sich Excel hier freiwillig aufhängt und nicht munter weitermacht bis in alle Ewigkeit. Dann müsstest Du es sowieso killen.

In der For-Schleife ändert sich weder der Name_SG noch kommen neue Tabellennamen dazu, wenn also nach einmaligem vollständigen Durchlauf der For-Schleife nichts passendes gefunden wurde, dann hilft auch keine Wiederholung und keine äußere Schleife. Dann muss man mit x = False irgendwas gescheites anstellen, aber nicht noch ´ne Runde drehen.

Ein weiterer kleiner Denkfehler scheint mir in For i = 8 To ActiveWorkbook.Sheets.Count + 8 zu liegen. Diese Schleife ist jedenfalls nicht identisch mit For i = 1 To ActiveWorkbook.Sheets.Count, sondern dreht eine Runde mehr. Wenn Range("B8") sinnvoll ist, dann ist es Range("B" & (...Count + 8)) wahrscheinlich nicht, denn in dieser Zelle/Zeile kann eigentlich nichts mehr stehen. (Richtig wäre For i = 8 To ActiveWorkbook.Sheets.Count + 7, oder aber man läuft von 1 bis Count und steckt den Offset in die Range und die Row). Das ist alles nicht sehr schlimm, bringt aber auch nichts.

Andererseits würde ein Exit For nach ActiveSheet.Rows(i).Delete zwar auch nicht viel bringen, wäre aber ganz sinnvoll im Gegensatz zum jetzigen Ablauf, wo auch nach dem Löschen noch fleißig weitergesucht wird bis zum Ende der For-Schleife.

Damit wir uns nicht falsch verstehen, es geht hier um Hunderstel- oder Tausendstel-Sekunden, also kein Grund zur Panik!

Gruß,
CaroS

Antwort 7 von stronge

Hallo,

jetzt läuft alles wunderbar, habe mich an eure Anweisungen gehalten und bin sehr glücklich mit der Lösung.
Vielen Dank für eure kompetente Hilfe und einen schönen Gruß aus München.

Gruß strongé