Moin moin,
kann mir jemand sagen, wieso dieser unten stehende Code nicht funktioniert? Es wird ein "Run-time error '13':Type mismatch" angezeigt. Habe auch mir anderen Codes versucht die Aufgabe zu lösen, jedoch auch ohne Erfolg.
Kennt ihr eventuell eine Möglichkeit einen Bereich in jeder Zeile ( Bsp.: D(j):H(j) ) in einer For-Schleife auf Nullen zu überprüfen? Also wenn wirklich alle Zellen eine Null enthalten soll die ganze Zeile gelöscht werden. Sobald eine andere Ziffer/Zahl als die Null drankommt, soll die nächste Zeile überprüft werden.
Wäre sehr dankbar für eure Unterstützung. :)
Gruß
Bamane
Code:
For j = 1 To lastrow2
If (Cells(j, 4) And Cells(j, 5) And Cells(j, 6) And Cells(j, 7) And Cells(j, 7) And Cells(j, 8)) = "0" Then
Do Until (Cells(j, 4) And Cells(j, 5) And Cells(j, 6) And Cells(j, 7) And Cells(j, 7) And Cells(j, 8)) <> "0"
Rows(j).Delete
j = j - 1
Loop
End If
Next j
Hallo,
Du verarbeitest in Deiner if-Abfrage 6 Wahrheitswerte und vergleichst diese mit "0". Wenn in den Zellen Zahlen stehen, dann kann Excel das noch reparieren und wandelt diese intern in einen Wahrheitswert um, bei Text fuktioniert das nicht mehr. Du musst die Zellen einzeln vergleichen.
Das Do ... Until ist mE doppelt gemoppelt, da Du ja schon alle Zeilen über for ... next abläufst.
Es ist zudem nicht sinnvoll die Laufvariable (j) der For ... Next Schleife zu verändern. Wenn Du Zeilen löschen willst, gehe den bereich von unten nach oben durch.
Versuch es mal so:
Code:
For j = lastrow2 To 1 Step -1
If (Cells(j, 4) = 0 And Cells(j, 5) = 0 And Cells(j, 6) = 0 And Cells(j, 7) = 0 And Cells(j, 7) = 0 And Cells(j, 8) = 0) Then
Rows(j).Delete
End If
Next j
Hallo,
vielen Dank für die ausfürliche Beschreibung. Jetzt habe ich wieder etwas dazu gelernt. :)
Der Grund, wieso ich Do...Untill benutze liegt daran, dass am Ende noch sehr viele Zellen mit Nullen übrig bleiben. Habe deinen Code implementiert und einen Screenshot davon gemacht, die im Anhang zu sehen ist. Bin mit "F8" die Zeilen durchgelaufen und manchmal werden zewei oder mehr Zeilen übersprungen.
Ich hoffe, dass es verständlich ist.
Gruß
Bamane
Was steht denn in der Variablen letztezeile2 drin?
Kannst Du die Datei hier hochladen?
Hallo Michael,
leider darf ich die Datei nicht uploaden.
Die Variable ist wie folgt definiert: lastrow2 = Cells(Cells.Rows.Count, "C").End(xlUp).Row
Spalte "C" ist wichtig für die Überprüfung. Sehe aber, dass bis zur Mitte vereinzelt Zellen in Spalte "C" leer sind und danach tauchen mehrere Zellen nacheinander auf, die leer sind.
Es handelt sich dabei um etwa 9200+ Einträge die variieren. Wenn ich diesen Bereich auf beispielsweise Range(C2:C10000) festlege, würde es den Rechenaufwand erhöhen?
Gruß
Bamane
Ich meinte, welcher Wert in der Variable bei Dir steht. Dass der Wert automatisch ermittelt wird, war mir schon klar.
Die Laufzeit sehe ich schon als Problem, denn wenn Du viele Zeilen (einzeln) löschst, kann das sehr lange dauern. Hier könnte z. B. ein per Autofilter gelöschter Bereich erheblich schneller sein.
Da ich aber Deine wahnsinnig geheime Datei nicht kenne, ist es nicht ganz einfach zu helfen. Mein Vorschlag: Anonymisiere diese Datei soweit, indem Du die datenschutzrechtlich problematischen Inhalte durch Phantasiewerte ersetzt und lade die Datei dann hoch. Oder erstelle eine Beispieldatei mit *identischem* Aufbau!
Hallo Michael,
ich habe jetzt eine L
ösung dafür gefunden und es funktioniert sogar sehr gut.
Code:
ActiveSheet.UsedRange
Set r = ActiveSheet.UsedRange
lastrow2 = r.Rows.Count + r.Row - 1
For j = lastrow2 To 1 Step -1
If (Cells(j, 4) = 0 And Cells(j, 5) = 0 And Cells(j, 6) = 0 And Cells(j, 7) = 0 And Cells(j, 8) = 0 And Cells(j, 9) = 0) Then
Rows(j).Delete
End If
Next j
Zu deinen Fragen: Es ist nicht meine Datei, sondern die von meiner Arbeitsstelle und ich möchte mir einfach nur Ärger ersparen. Ich habe eine ähnliche Datei angelegt, nur hier hat es direkt funktioniert. Ich glaube, dass es wie du schon gesagt hast daran liegt, ob der Eintrag numerisch oder als Text vorliegt. Ich glaube, dass bei mir beides der Fall ist. Die Werte werden aus einem anderen Workbook und aus verschiedenen Sheets in dieses Tabellenblatt hinzugefügt. Je nachdem wie diese Werte in diese Sheets kopiert wurden kann es zu dieser problamatik führen.
Vielen Dank nochmal für deine hilfreiche Unterstützung.
Gruß
Bamane
Viel schneller:
Code:
Sub M_snb()
sn=sheets(1).UsedRange
For j =1 to ubound(sn)
if sn(j,4) & sn(j,5) & sn(j,6) & sn(j, 7) & sn(j, 8) & sn(j, 9) = "000000" Then c00=c00 & "|" & j
next
if c00<>"" then
sn=application.index(sn,application.transpose(split(mid(c00,2),"|")),[transpose(row(1:8))])
sheets(1).usedrange.clearcontents
sheets(1).cells(1).resize(ubound(sn),ubound(sn,2))=sn
end if
End Sub
Hi snb,
ich bekomme leider eine Fehlermeldung.
Habe die variable "sn" mit Dim sn as Range deklariert.
Woran kann es liegen, dass die Fehlermeldung,die im Anhang zu sehen ist auftaucht?3
Beste Gruesse
Bamane
Die Variable beinhaltet keine Range sondern es ist eine Arrayx-Variable. Da snb seine Variablen nie deklariert (ohne option explicit) sind diese automatisch als Variant deklariert. Das kannst Du dann auch explizit vornehmen:
Dann sollte es laufen.