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
04.05.2018, 15:44 (Dieser Beitrag wurde zuletzt bearbeitet: 04.05.2018, 15:44 von Der Steuerfuzzi.)
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
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.
04.05.2018, 16:17 (Dieser Beitrag wurde zuletzt bearbeitet: 04.05.2018, 16:18 von Bamane.)
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?
04.05.2018, 18:00 (Dieser Beitrag wurde zuletzt bearbeitet: 04.05.2018, 18:01 von Der Steuerfuzzi.)
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!
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.
05.05.2018, 17:50 (Dieser Beitrag wurde zuletzt bearbeitet: 05.05.2018, 17:50 von snb.)
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
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: