For-Schleife "überspringt" Zeilen

ulki

Erfahrenes Mitglied
Hi Leute,

bei mir hat sich gerade ein äußerst merkwürdiges Problem aufgetan.

Ich habe eine For-Schleife, die sich durch eine Excel-Liste arbeitet und dort alle Zeilen löschen soll, die in einer bestimmten Zelle keinen Eintrag haben.
Eigentlich arbeitet sie auch ganz gut, nur gelegentlich lässt sie Zeilen aus. Einen Grund dafür habe ich auch schon gefunden. Ein Teil der Zellen war nicht wirklich leer, es waren Leerzeichen darin, habe ich das also in die Schleife mit aufgenommen. Aber beim letzten Testdurchlauf hat die Schleife auch Zeilen stehen lassen, die sie vorher gelöscht hatte.
Ich hoffe ihr könnt mir helfen.

Hier die besagte Schleife:

Code:
For j = 1 To AnzZeilen
      Content = Cells(j, 14).Value
      If Content = "" Then
        Rows(j).Select
        Selection.Delete shift:=xlUp 'löschen der ganzen Zeile, es bleibt keine Lücke
      End If
      If Content = " " Then
         Rows(j).Select
         Selection.Delete shift:=xlUp
      End If
   Next j

Ich weiß nicht woran das liegen könnte. :confused:
Danke schon mal für eure Hilfe

ulki
 
Erstens würde ich den Zeileninhalt mit der Funktion trim() prüfen. Diese schneidet alle Leerzeichen links und rechts des Strings ab. Es könnte ja sein dass das Feld zwei Leerzeichen hat, dann ginge deine Funktion wieder nicht.

Zweitens könntest du ja immer etwas ausgeben bei jeder Zeile, z.b. der Inhalt (in Hochkomma). Wenn es dann immer noch nicht richtig geht dann gib immer etwas aus wenn er in die if-Bedingung kommt. Du wirst mit ein bisschen Debuggen das Problem vermutlich sehr schnell finden.
 
Danke für den Tip aber das habe ich schon getan. Außerdem ist es mit dem Ausgeben in Excel (VBA für Excel) nicht ganz so einfach. Jedenfalls soweit ich das weiß.
Außerdem hatte ich vor dem zweiten Testlauf nur in der Excel Tabelle in der betroffenen Zeile gelöscht und am Quelltext des Makros garnichts geändert. Wie sollte dort also plötzlich etwas anderes geschehen?
Ich werd dann erstmal weiter suchen. Wenn noch jemand eine Idee hat, nur her damit :)

ulki
 
Stimmt, daran hatte ich jetzt nicht gedacht.

Hab aber gerade was ausprobiert. Um zu überprüfen, ob er alle Zeilen anfasst und vergleicht habe ich ihn jede Zeile einfärben lassen, die er besucht. Und man stelle sich vor: Es gibt tatsächlich Lücken. Was heißt, das er wirklich Zeilen übersprungen hat und es nicht nur so wirkt.
Ihr könntet mir einen großen Gefallen tun und diese Schleife bei euch mal über eine Tabelle laufen lassen. Der Inhalt ist ziemlich egal, aber sie sollte etwas länger sein, an die zwanzig oder dreißig Zeilen am Stück hat er schon bearbeitet.
Ich werde paralell noch etwas weiter suchen.

ulki

Ps: in den übersprungenen und bearbeiteten Zeilen kann ich kein Muster erkennen aber ich möchte nicht darauf wetten, das es nicht doch eines gibt.

Dinge gibt das :suspekt:
 
Das Problem ist folgendes, es überspringt keine Zeilen aber:

Du kontrollierst die erste Zeile (j=1), die soll es löschen, es löscht sie auch, dann kontrollierst du die zweite Zeile (j=2), du vergisst aber das er nun eigentlich eine Zeile übersprungen hat, da ja die zeile 2 von vorhin nun die Zeile 1 ist ;) Weisst du das ich meine? Die müsstest du nun so lösen:
Code:
For j = 1 To AnzZeilen
      tmp = false;
      while tmp = false
          Content = Trim(Cells(j, 14).Value)
          If Content = "" Then
            Rows(j).Select
            Selection.Delete shift:=xlUp 'löschen der ganzen Zeile, es bleibt keine Lücke
          else
            tmp = true
          End If
    wend
Next j
Code ist nicht getestet, sollte aber gehen ;)
 
Ja. Ich weiß was du meinst. Das ist ein Grund warum man das Löschen in For-Schleifen für gewöhnlich vermeidet. Da sich mein Excel heute zum wiederholten Male aufgehängt hat, werde ich es heute nicht mehr Testen. Aber Morgen dann gleich als erstes. Danke für deine Hilfe. Es ist gut wenn man mal einen unabhängigen Menschen einen Blick auf den Code werfen lassen kann. Man selbst ist nach ein paar Stunden oft blind für die eigenen Fehler. ;)

poste dann, wie der Test ausgegangen ist

ulki
 
Hab die For-Schleife durch eine While-Schleife ersetzt. Erschien mir dann doch sinnvoller.
Hier das Ergebnis, getestet und für gut befunden ;)

Code:
For i = 2 To SheetAnzNeu
   Worksheets(i).Select
   vorne = Cells(1, 1).Value
   dran = 1
   While vorne <> ""
     Content = Cells(dran, 14).Value
     If Content = "" Then
        Rows(dran).Select
        Selection.Delete shift:=xlUp
     Else
        dran = dran + 1
     End If
     vorne = Cells(dran, 1).Value
   Wend
Next i

Jetzt nur noch eine weitere Frage. Ich würde gerne bei der Abfrage für die If-Anweisung mehr abfragen als nur "Ist die Zelle leer?". Sondern auch gleich, ob dort ein Leerzeichen, oder mehrere, sind. Dachte sn sowas wie

If (Bedingung1) or (Bedingung2) Then
........
End If

Habe keine Ahnung ob und wie sowas in VBA möglich ist. Danke schonmal für die Hilfe! Bis jetzt hat es sehr geholfen! :)

ulki
 
Wunderbar. Jetzt macht die Schleife was ich will :p
Hoffentlich läuft alles weiter so gut!
Danke für deine Hilfe

ulki
 
Zurück