Clever-Excel-Forum

Normale Version: Bereich auf Nullen überprüfen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
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 Über­prü­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:
Code:
Dim sn as Variant
Dann sollte es laufen.
Seiten: 1 2 3