For Next Zählproblem

Hallo,

ich habe folgendes Problem, ich möchte mittels einer Schleife eine vorher abgefragte Anzahl an Tabellenblätter löschen, und zwar ab dem 3. Blatt beginnend. Der Start funktioniert zwar, aber es wird immer in zweier Schritten gezählt, d.h. es wird nur jedes zweite Blatt gelöscht, und somit habe ich zum Schluss das Problem, dass die Schleife nicht sauber beendet werden kann, die nichts mehr zum Löschen vorhanden ist. Hier kurz das Listing:

Sub Tabellenblätter_löschen()
'*** Tabellenblätter löschen ***
Dim t As Integer
Dim Anz As Integer
Dim adr As Range

Set adr = Worksheets(„Grunddaten“).Range(„c3:c102“)
Anz = Application.WorksheetFunction.CountIf(adr, „“)

For t = 1 To Anz
Worksheets(t + 2).Delete
Next t

End Sub

Hat jemadn ne Idde was ich da falsch mache?

Hi asrue,

Sub Tabellenblätter_löschen()
Dim t As Integer
Dim Anz As Integer
Dim adr As Range
Set adr = Worksheets(„Grunddaten“).Range(„c3:c102“)
Anz = Application.WorksheetFunction.CountIf(adr, „“)
For t = 1 To Anz
Worksheets(t + 2).Delete
Next t
End Sub

Wenn man aus Aufzählungen löscht, muß man stets vom höchsten Element anfangen, weil sich nach jedem Löschen die Anzahl der Elemente ändert.

For t = Anz to 3 Step -1
 Worksheets(t).Delete
Next t

Ganz verstehe ich aber nicht, was Du da machst. Du zählst, wie oft in C3:C102 auf Grunddaten ein vorkommt und löschst dann ganze Tabellenblätter?
Sauberer wäre, diese Bedingung auch in die VBA-Prozedur zu packen. Das ist zum einen schneller, zum anderen weniger störanfällig. Stell’ Dir vor, irgendwie schreibt jemand vor Makrolauf den Suchstring in den untersuchten Range. Was passiert dann? Werden da etwa mühsam ermittelte Rohdaten gelöscht?

HTH.

Markus

For t = 1 To Anz
Worksheets(t + 2).Delete
Next t
End Sub

For t = Anz to 3 Step -1
Worksheets(t).Delete
Next t

Hallo Markus,

dieses Mal kann ich dir nicht zustimmen. Mit seinem Code will der UP Anz Blätter löschen.
Nehmen wir an Anz ist 5, dann wollte er Blatt 3-7 löschen.
Mit deinem Code wird nur Blatt 3-5 gelöscht.
Nachfolgend ist anderer Code. ann hat der UP ja die Auswahl :smile:

Gruß
Reinhard

Sub Tabellenblätter\_löschen2()
'\*\*\* Tabellenblätter löschen \*\*\*
Dim t As Integer, Anz As Integer, adr As Range
Set adr = Worksheets("Grunddaten").Range("c3:c102")
Anz = Application.WorksheetFunction.CountIf(adr, "")
For t = Anz + 2 To 3 Step -1
 Worksheets(t).Delete
Next t
End Sub

Hallo,

vielen Dank erst mal für die schnellen Antworten. In c3:c102 überprüfe ich wieviele Zellen eine Eintragung haben. Daraus resultierend wurden die Tabellenblätter erstellt, die es mit meinem geschilderten Problem wieder zu löschen gilt, wenn der Nutzer der Tabelle dies möchte.
Ich haber von anderer Seite auch den ein oder anderen Tip zu diesem Problem bekommen. In der Tat ist es so, dass Excel beim Löschen eines Tabellenblattes (z.B.: Es gibt 7 Tabellenbläter und es wird das 3. gelöscht) Tabellenblatt 4 auf die Position 3 setzt. So wurde gem. meiner Verfahrensweise immer nur jedes zweite Blatt gelöscht. Des Rätsels Lösung ist die beschriebene Art des Löschen von hinten herein oder man läst die Schleife wie in meiner Beschreibung x-mal durchlaufen, löscht aber immer das 3. Tabellenblatt. Nachfolgend die Lösung: (jetzt mit Löschen ohne Nachfrage)

Sub Tabellenblätter_löschen()
'*******************************
'*** Tabellenblätter löschen ***
'*******************************
Dim t As Integer
Dim Anz As Integer
Dim adr As Range

Set adr = Worksheets(„Grunddaten“).Range(„c3:c102“)
Anz = Application.WorksheetFunction.CountIf(adr, „“)

For t = 1 To Anz

Application.DisplayAlerts = False
Worksheets(3).Delete
Application.DisplayAlerts = True

Next t

End Sub

Hallo,

auch Dir noch mal vielen Dank für die schnelle Antwort. Blatt 1 und 2 müssen immer stehen bleiben. Wegen der internen Verschiebung der Tabellenblätter nach dem Löschen kann das Ganze entweder durch Löschen von hintern herein angegangen werden, oder es wird immer Blatt 3 gelöscht. (siehe Listing bei meiner Antwort vorher)

Das Problem basierte lediglich darauf, dass ich nicht wusst, dass eine interne Psoitionsverschiebung der Tabellenbläter nach dem Löschen erfolgt. Aber wieder mal was dazu gelernt…und eigentlich auch logisch

Sub Tabellenblätter_löschen()
'*******************************
'*** Tabellenblätter löschen ***
'*******************************
Dim t As Integer
Dim Anz As Integer
Dim adr As Range
Set adr = Worksheets(„Grunddaten“).Range(„c3:c102“)
Anz = Application.WorksheetFunction.CountIf(adr, „“)
For t = 1 To Anz
Application.DisplayAlerts = False
Worksheets(3).Delete
Application.DisplayAlerts = True
Next t
End Sub

Hallo Asrue,

schreib das so, dann biste schneller. Nachfolgend ist Code der noch einen Tick schneller sein müßte bei vielen Brettern.

Application.DisplayAlerts = False
For t = 1 To Anz
 Worksheets(3).Delete
Next t
Application.DisplayAlerts = True





Sub Tabellenblätter\_löschen3()
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
'\*\*\* Tabellenblätter löschen \*\*\*
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
Dim t As Integer, Anz As Integer, adr As Range, arrSH() As Variant
Set adr = Worksheets("Grunddaten").Range("c3:c102")
Anz = Application.WorksheetFunction.CountIf(adr, "")
ReDim arrSH(Anz - 1)
For t = 1 To Anz
 arrSH(t - 1) = t + 2
Next t
Application.DisplayAlerts = False
Worksheets(arrSH).Delete
Application.DisplayAlerts = True
End Sub

Gruß
Reinhard

Grüezi Reinhard,

mea culpa: Nix habbe gelässen.*

Schönes Wochenende einstweilen.

Markus
_______________
* Kaya Yanar hat mit Was kuckst Du einen meiner Meinung nach unverkrampfteren Umgang mit Alltäglichkeiten wie der Aussprache bestimmter Bevölkerungsgruppen eingeleitet.
Hier in Köln hat die Nichtbeschäftigung mit der Bevölkerung zu folgendem geführt:
Eine riesige Anzeigen- und Plakatkampagne von Stadt Köln, Polizei Köln und allerlei sozialen Organisationen zeigte einen typischen Migranten von etwa 18 Jahren. Titel war: „Gewalt? Ich misch mich ein!“ (und wähle 110).
Wenn man den Titel so ausspricht wie der Protagonist auf dem Plakat es tun würde, wäre es: „Gewalt? Isch misch misch ein“.
Die Kampagne wurde relativ flott eingestellt.

Hallo Markus,

mea culpa: Nix habbe gelässen.*

du weißt doch wie es ist, mal überliest man was auch wenn’s sogar dick im Betreff steht, da bin ich auch Kanditat für, mal liest man die Frage, ggfs. wie hier auch den nicht laufenden Code, und versucht dann aufrgrund dessen was man glaubt zu wissen einen Lösungscode zu basteln.

Ob dieser, der eigene, Code klappt kann man ja meist testen, aber ob er dem entspricht was der Anfrager sich erhofft weiß man m.M. nach nie so genau.

Der Zufallsgenerator des Lebens hätte es auch leicht und locker dazu bringen können, daß dein Ansatz der gewünschte gewesen wäre.
Oder gar noch ein Drittcode, quin sabe.

Schönes Wochenende einstweilen.

Danke, dir auch.

Und zu deinen Antworten im Word-Brett. Irgendwie bin sehr froh daß ich mich in Word nicht auskenne.
In Excel ist es ja schon Aufwand, bestimmte Dinge Step by Step anderen zu erläutern.
Aber in Word, mannomann, was du da immer so schreibst mit viel Aufwand, sehr viel Text *find*
Natürlich notwendig, aber ich bin sehr froh daß ich selten in Excel soviel schreiben muß :smile:)

Und zu „Ich misch mich ein“, auch ohne Dialekt, ich kann mir nicht vorstellen daß dies jmd. so aussprechen kann daß beim Zuhörer etwas anderes als „Ich misch misch ein“ ankommt.
Was gemeint sein kann muß er sich erdenken *denk*

Da ich sowieso grad OT bin, mir fällt dazu ein, vielleicht in Physik im Berufsschulunterricht oder später habe ich gesagt bekommen, da ging es um die eingeschränkte Frequenzbreite dessen was ein Telefon überträgt, daß egal wie hochdeutsch und sauber man die Buchstaben „p“ und „b“ aussricht, der andere Telefonatteilnehmer da akustisch keinen Unterschied erkenn kann.

@Mod, wenn du diesen Artikel wegen OT löschst, kein Akt, aber laße bitte markus genug Zeit damait er den Artikel auch einmal zu Gesicht bekommt, dankeschön.

Gruß
Reinhard