ich hab eine Excel Datei mit mehreren Tabellenblättern. In jedem dieser Tabellenblätter gibt es Zeilen die in der ersten Spalte den Wert „0,00“ stehen haben. Nun möchte ich ein Marko erstellen, wo automatisch alle Zeilen, die in der Spalte A den Wert 0 beeinhalten gelöscht werden.
Ich probiere nun schon seit einiger Zeit rum, komme aber leider auf keine zufriedenstellende Lösung.
Da die Tabellenblätter teilweise sehr groß (viele Zeilen) sind, wäre es von Vorteil, wenn es nicht allzu lange dauert, bis die Zeilen gelöscht werden…
Vielen Dank im Voraus für eure Antworten!!
Schöne Grüße
Anita
zunächst einmal möchte ich dir folgendes ans Herz legen. Du ermittelst die letzte Zeile in der etwas steht über eine Variable. Dies kann man immer gebrauchen und macht die Berechnung/ Prozedur/ den Such-und-Löschvorgang bedeutend schneller und flexibler:
Dim letzteZeile As Long
letzteZeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
(hier zählt er nun in welcher Zelle in Spalte A (1) der letzte Wert steht. Funktioniert auch wenn du einen Filter o.ä. benutzt.)
Dann wolltest du gern Zeilen entfernen, in der ein bestimmter Wert (z.B. 0,0) steht.
Dafür bietet sich eine IF THEN ELSE Anweisung an.
Prüfe einfach ob in der Zelle in Spalte A 0,0 steht und wenn ja löscht du sie über Rows(j).Select / Selection.Delete, das müsste in etwa so aussehen:
Dim i As Integer
For i = 1 To letzteZeile
–If Cells(i, 1).Value = „0,0“ Then
----Rows(i).Select
----Selection.Delete
–End If
Next Cell
Du könntest auch
For Each Cell In Sheets(1).Range(„A1:A“ & letzteZeile)
benutzen.
Ich hoffe ich konnte dir helfen, bitte um Feedback ob dein Problem gelöst ist, bzw. welches Problem weiterhin besteht.
ich hab eine Excel Datei mit mehreren Tabellenblättern. In
jedem dieser Tabellenblätter gibt es Zeilen die in der ersten
Spalte den Wert „0,00“ stehen haben. Nun möchte ich ein Marko
erstellen, wo automatisch alle Zeilen, die in der Spalte A den
Wert 0 beeinhalten gelöscht werden.
Hallo Anita,
Sub Nuller()
Dim Zei As Long, wks As Worksheet
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For Each wks In ThisWorkbook.Worksheets
For Zei = wks.Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If wks.Cells(Zei, 1).Value = 0 Then wks.Rows(Zei).Delete
Next Zei
Next wks
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Nö, bei letztezeile hast du es korrekt gemacht. Integer ist hier falsch.
Zwei Gründe, erstens kracht Integer ab 32000 Zeilen. Zweitens wandelt .Cells innerbetrieblich sowieso in Long um, dies kostet überflüssige zeit, also lieber gleich Long.
Der zweite Grund gilt auch für Spalten, auch wnn du da nur 256 von hast bei Normalexcel.
For i = 1 To letzteZeile
Nein, du kommst da mit dr zeilennummer falsch hin.
Löschen einfügen immer von unten nach oben, also so:
For i = letzteZeile To 1 step -1
Klar geht auch von oben nach unten, dann muß man aber in der For-Schleife den zeilenzählerbei Zeilenlöschungen selbst korrigieren.
Von unten nach oben ist da bequemer.
–If Cells(i, 1).Value = „0,0“ Then
*hmmh*, schreib mal in eine zelle 0 und formatiere als Zahl mit einer Nachkommastelle.
Probier dann deinen Code.
Übrigens, auch mein Code muß nicht unbedingt funktionieren. Vielleicht hat uns der Anfrager etwas verschwiegen wie es zu 0 bzw. o,o kam, vielleicht ist der wahre Zellinhalt 0,000000000012
und wird nur formatiert als o bzw. 0,0 angezeigt.
Mal abwarten.
vielen, vielen Dank für eure rasche Antwort!!
Also dein Version Reinhard funktioniert soweit super. Alle 0er werden gelöscht, allerdings prüft er nun alle Tabellenblätter, dies würde ich gerne noch eingrenzen, dass er zB nur Tabelle1 - 10 überprüft un den Rest nicht, geht das?
Vielen Dank nochmal.
Gruß
Anita
Also dein Version Reinhard funktioniert soweit super. Alle 0er
werden gelöscht, allerdings prüft er nun alle Tabellenblätter,
dies würde ich gerne noch eingrenzen, dass er zB nur Tabelle1
10 überprüft un den Rest nicht, geht das?
Hallo Anita,
Option Explicit
'
Sub Nuller()
Dim Zei As Long, W As Byte
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With ThisWorkbook
For W = 1 To 10
With .Worksheets("Tabelle" & W)
For Zei = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If .Cells(Zei, 1).Value = 0 Then .Rows(Zei).Delete
Next Zei
End With
Next wks
End With
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
noch mal Danke. Das funktioniert schon super!
Noch eine Frage: wie muss ich das Makro umschreiben, wenn die Tabellenblätter Namen haben? zB A1, B2, C3 etc.
Noch eine Frage: wie muss ich das Makro umschreiben, wenn die
Tabellenblätter Namen haben? zB A1, B2, C3 etc.
Hallo Anita,
Sub Nuller()
Dim Zei As Long, W As Byte, arrTab
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
arrTab = Array("A1", "B5", "C7")
With ThisWorkbook
For W = 0 To UBound(arrTab)
With .Worksheets(arrTab(W))
For Zei = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If .Cells(Zei, 1).Value = 0 Then .Rows(Zei).Delete
Next Zei
End With
Next W
End With
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Wow, interessante Aspekte.
Habe die einzelnen Bausteine immer so verwendet, verstehe aber auch deine Einwände…
Interessant, interessant.
Auf jeden Fall sollte das Problem aber für die lösbar geworden sein.
Ich persönlich hab beim löschen die Daten erst sortiert und dann gelöscht.
Ging immer alles gut.