Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1084to1088
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

Makro läuft nicht. Zeile löschen wenn...

Makro läuft nicht. Zeile löschen wenn...
Christoph
Hallo,
ich habe eine große Tabelle und möchte die Zeilen löschen, die eine "1" in Spalte O:O haben.
Ich habe auch hier und in anderen Foren eine Reihe Makros gefunden. Unter anderem dieses hier:

Sub loeschen()
Dim loZeile As Long
Application.ScreenUpdating = False
For loZeile = 12 To 1 Step -1
If Cells(loZeile, 1) = 1 Then Rows(loZeile).Delete
Next loZeile
Application.ScreenUpdating = True
End Sub


Leider tut das Makro aber nichts. Keine Fehlermeldung, kein Effekt. Keine Rechenzeit....
Bisher probiert:
- Formatierung der Zellen geändert
- die 1 in Anführungszeichen gesetzt
- leicht abweichende Makros genutzt.
Immer dasselbe Problem. Ich bin mittlerweile echt ratlos...
Gruß und Danke
Christoph

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
wenn du auch in A:A suchst ... owT
01.07.2009 13:38:55
Rudi
Den Wald vor Bäumen nicht gesehen
01.07.2009 13:43:13
Christoph
Und da hätte man sich 1 Stunde arbeit sparen können.... ;-)
So'n Mist.
Danke
Christoph
"Fünf gewinnt" : Da fehlt eine 5...
01.07.2009 13:44:53
NoNet
Hallo christoph,
Spalte 1 ist Spalte A, Spalte O wäre entsprechend Spalte 15 :
If Cells(loZeile, 15) = 1 Then Rows(loZeile).entireRow.Delete
Gruß, NoNet
Nachtrag: Geschwindigkeit erhöhen?
01.07.2009 14:30:44
Christoph
Hallo,
ich arbeite auf dem (eigentlich sehr fixen) Terminalserver an meinem Arbeitsplatz. Das Skript von oben benötigt für die Prüfung von 20 Zeilen schon ca. 30 Sekunden. Da ich bis zu ca. 10.000 Zeilen prüfen muss ist das keine gangbare Lösung.
Kann man die Sache durch ein anderes Skript irgendwie beschleunigen?
Anzeige
AW: Nachtrag: Geschwindigkeit erhöhen?
01.07.2009 14:44:55
Rudi
Hallo,

Sub loeschen()
Dim loZeile As Long, rDel As Range
Application.ScreenUpdating = False
For loZeile = 12 To 1 Step -1
If Cells(loZeile, 15) = 1 Then
If rDel Is Nothing Then
Set rDel = Cells(loZeile, 1)
Else
Set rDel = Union(rDel, Cells(loZeile, 1))
End If
End If
Next loZeile
If Not rDel Is Nothing Then rDel.EntireRow.Delete
Application.ScreenUpdating = True
End Sub


Gruß
Rudi

Alternative : Per Autofilter löschen
01.07.2009 16:43:19
NoNet
Hallo Christoph,
bei grösseren Listen empfehle ich - nicht nur aufgrund der Perfromance - die Zeilen nicht per Schleife zu suchen und zu löschen, sondern die Liste einfach per Autofilter in der entsprechenden spalte nach dem gewünschten Wert zu filtern und dann das Ergebnis des Autofilters zu löschen.
Hier ein auf Deine Anfrage zugeschnittenes Beispiel :
VBA-Code:
Sub AutoFilterZeilenLoeschen()
    ' Makro setzt Autofilter in O1, füllt die benutzerdefinierten Werte mit
    ' "=1" (filtert alle Zeilen mit Wert 1 in Spalte O) und löscht das Ergebnis
    ' aus Tabelle. Autofilter wird danach wieder deaktiviert
    'NoNet 2006, angepasst 01.07.2009
    Const intWert = 1 'Wert, nach dem in der Spalte gefiltert werden soll !
    Dim rngZelle As Range, lngS As Long, lngZ As Long
    Set rngZelle = ActiveSheet.[O1]
    lngS = rngZelle.CurrentRegion.Column
    lngZ = rngZelle.CurrentRegion.Rows.Count - rngZelle.Row + 1
    If Application.CountIf(rngZelle.Resize(lngZ), intWert) > 0 Then
        If Not ActiveSheet.AutoFilterMode Then rngZelle.AutoFilter
        With rngZelle
            'Alle Daten filtern, die in Spalte O eine 1 beinhalten :
            'evtl. Probleme wenn zahlen nicht als STANDARD formatiert sind
            .AutoFilter Field:=rngZelle.Column - lngS + 1, Criteria1:=intWert
            Intersect(Range(.Offset(1), _
                .CurrentRegion.SpecialCells(xlCellTypeLastCell)), _
                .CurrentRegion.SpecialCells(xlCellTypeVisible)).EntireRow.Delete
                'Wieder alle Werte anzeigen:
            .Parent.AutoFilterMode = False
            .Select
        End With
    Else
        MsgBox "Keine Zellen mit passendem Kriterium in Spalte O gefunden !"
    End If
    'Speicher für Objektvariable wieder freigeben :
    Set rngZelle = Nothing
End Sub
Probleme kann es geben, wenn die (Zahlen-)Werte der zu filternden Spalte nicht als STANDARD formatiert sind sondern z.B. als Datum, Währung etc.
Gruß, NoNet
Perfekt! Vielen Dank
Christoph

Danke allen, die sich hier so viel Mühe gegeben haben. Die Variante mit dem Autofilter klappt hervorragend und vor allem richtig schnell (10 Sekunden. Per Schleife ca. 15 Minuten!!!).
Viele Grüße aus dem Sauerland
Christoph
Mist: Laufzeitfehler 19 / Excel hängt sich auf
Christoph

Hallo NoNet,
tut mir leid, dass ich dich nochmal belästigen muss. Allerdings habe ich eben alle Daten in meine Tabelle eingefügt (nicht nur die paarhundert Testzeilen...).
Wenn ich jetzt das oben genannte Makro starte hängt sich meistens Excel auf. Symptome: Geblockt, als wenn das Makro noch läuft. Allerdings kommt die Berechnung zu keinem Ende, bis ich dann nach über 10 Minuten abbreche.
ZWischenzeitlich hatte ich dann auch "Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht gesetzt"
Googlen hat mich auf keinen grünen Zweig geführt, außer das dieser Fehler wohl meist bei irgendwelchen Suchfunktionen auftaucht.
Beim debuggen wird dann natürlich auch direkt der Teil deines Scripts angezeigt, den ich am wenigsten verstehe... :-(

Intersect(Range(.Offset(1), _
.CurrentRegion.SpecialCells(xlCellTypeLastCell)), _
.CurrentRegion.SpecialCells(xlCellTypeVisible)).EntireRow.Delete


Es wäre echt klasse, wenn du mir hier noch einmal aushelfen könntest.
Vielen, vielen Dank.
Christoph

AW: Mist: Laufzeitfehler 19 / Excel hängt sich auf
christophschmitz@gmx.net

Um die Sache abzuschließen:
Ich habe noch eine alternative Lösung gefunden:

Dim Zeilen As Integer
Dim Zeilen_loeschen As Integer
Zeilen = Sheets("Hilfsvariablen").Range("C4")
Range("A1:P" & Zeilen).Sort Key1:=Range("O2"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:= _
xlSortTextAsNumbers, DataOption2:=xlSortNormal
Zeilen_loeschen = WorksheetFunction.CountIf(Range("O2:O" & Zeilen), "1") + 1
Rows("2:" & Zeilen_loeschen).Delete Shift:=xlUp


Einfach sortieren, Zeilen zählen, zeilen löschen!
Das funktioniert in dem Fall aber leider nur, weil ich die 1 Suche und weiß, dass keine kleineren Zahlen vorkommen...
Danke allen. bis demnächst
Christoph

Anzeige
Perfekt! Vielen Dank
01.07.2009 17:06:37
Christoph
Danke allen, die sich hier so viel Mühe gegeben haben. Die Variante mit dem Autofilter klappt hervorragend und vor allem richtig schnell (10 Sekunden. Per Schleife ca. 15 Minuten!!!).
Viele Grüße aus dem Sauerland
Christoph
Mist: Laufzeitfehler 19 / Excel hängt sich auf
03.07.2009 11:35:56
Christoph
Hallo NoNet,
tut mir leid, dass ich dich nochmal belästigen muss. Allerdings habe ich eben alle Daten in meine Tabelle eingefügt (nicht nur die paarhundert Testzeilen...).
Wenn ich jetzt das oben genannte Makro starte hängt sich meistens Excel auf. Symptome: Geblockt, als wenn das Makro noch läuft. Allerdings kommt die Berechnung zu keinem Ende, bis ich dann nach über 10 Minuten abbreche.
ZWischenzeitlich hatte ich dann auch "Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht gesetzt"
Googlen hat mich auf keinen grünen Zweig geführt, außer das dieser Fehler wohl meist bei irgendwelchen Suchfunktionen auftaucht.
Beim debuggen wird dann natürlich auch direkt der Teil deines Scripts angezeigt, den ich am wenigsten verstehe... :-(

Intersect(Range(.Offset(1), _
.CurrentRegion.SpecialCells(xlCellTypeLastCell)), _
.CurrentRegion.SpecialCells(xlCellTypeVisible)).EntireRow.Delete


Es wäre echt klasse, wenn du mir hier noch einmal aushelfen könntest.
Vielen, vielen Dank.
Christoph

Anzeige
AW: Mist: Laufzeitfehler 19 / Excel hängt sich auf
03.07.2009 12:15:14
christophschmitz@gmx.net
Um die Sache abzuschließen:
Ich habe noch eine alternative Lösung gefunden:

Dim Zeilen As Integer
Dim Zeilen_loeschen As Integer
Zeilen = Sheets("Hilfsvariablen").Range("C4")
Range("A1:P" & Zeilen).Sort Key1:=Range("O2"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:= _
xlSortTextAsNumbers, DataOption2:=xlSortNormal
Zeilen_loeschen = WorksheetFunction.CountIf(Range("O2:O" & Zeilen), "1") + 1
Rows("2:" & Zeilen_loeschen).Delete Shift:=xlUp


Einfach sortieren, Zeilen zählen, zeilen löschen!
Das funktioniert in dem Fall aber leider nur, weil ich die 1 Suche und weiß, dass keine kleineren Zahlen vorkommen...
Danke allen. bis demnächst
Christoph

Anzeige

314 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige