Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Bereich auf Nullen überprüfen
#1
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
Antworten Top
#2
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
Gruß
Michael
[-] Folgende(r) 1 Nutzer sagt Danke an Der Steuerfuzzi für diesen Beitrag:
  • Bamane
Antworten Top
#3
Photo 
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


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#4
Was steht denn in der Variablen letztezeile2 drin?

Kannst Du die Datei hier hochladen?
Gruß
Michael
Antworten Top
#5
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
Antworten Top
#6
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!
Gruß
Michael
Antworten Top
#7
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
Antworten Top
#8
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 1 Nutzer sagt Danke an snb für diesen Beitrag:
  • Bamane
Antworten Top
#9
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


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#10
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.
Gruß
Michael
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste