Endlosschleife vBA

Bild

Betrifft: Endlosschleife vBA
von: Gisela
Geschrieben am: 02.05.2015 07:27:42

Liebe Gemeinde,
ich habe folgendes Problem:
aus der Spalte im Bereich AR19:AR7542 soll jede Zeile in Tabelle 2 geschrieben werden, die die Bedingung AR19=1...AR7542=1 erfüllt. Funzt auch einwandfrei, mein Problem isst nur, dass wenn keine Zelle mit dem Wert 1 in diesem Bereich vorhanden ist, sich das Ganze in einer Endlosschleife windet. Wie bricht der Code ohne Debug-Modus ab, wenn keine Zelle diese Bedingung erfüllt?
Range("A1").Select
Dim i As Integer
Dim cell As Range
i = 19
For Each cell In Tabelle1.Range("AR16:AR7542")
If Not cell Is Nothing Then
If cell.Value = 1 Then
cell.EntireRow.Copy Destination:=Tabelle2.Rows(i)
i = i + 1
End If
End If
Next cell
Sheets("Tabelle2").Select
Sheets("Tabelle1").Select
Rows("16:16").Select
Selection.Copy
...
Beste Grüsse
Gisela

Bild

Betrifft: AW: Endlosschleife vBA
von: Luschi
Geschrieben am: 02.05.2015 08:36:57
Hallo Gisela,
ich habe den Code mal getestet und bei mir kommt keine Endlosschleife, wenn kein Wert 1 im genannten Bereich gefunden wird; kann auch nicht.
Meine Frage: Wo soll er den abbrechen? Die For-Schleife ist i.O nur folgende If-Bedingung macht keinen Sinn:
If Not cell Is Nothing Then
und kann gelöscht werden (einschl. End If). die Variable 'cell' kann innerhalb von 'For Each'-Schleifen niemals den Wert 'Nothing annehmen. Dann müßt Vba auf eine Zelle treffen, die es überhaupt nicht gibt. Nichtsichtbare Zellen zählen aber nicht zu dieser Kategorie und existieren immer.
Bei mir kommt nur ein Lfz-Fehler, wenn in einer der Zellen von Tabelle1.Range("AR16:AR7542")
ein Fehlerwert steht.
Gruß von Luschi
aus klein-Paris


Bild

Betrifft: AW: Endlosschleife vBA
von: RPP63
Geschrieben am: 02.05.2015 08:56:08
Hallo!
Warum nutzt Du nicht den Autofilter, filterst auf 1 und kopierst den sichtbaren Bereich en bloc?
Dies geht natürlich auch per VBA und ist um Längen schneller.
Gruß Ralf

Bild

Betrifft: Sorry Luschi
von: RPP63
Geschrieben am: 02.05.2015 08:57:44
Mein obiger Beitrag bezieht sich natürlich auf den TE.
(Irgendwann schnalle ich hier auch mal die Baumstruktur)
Gruß Ralf

Bild

Betrifft: AW: Endlosschleife vBA
von: Gisela
Geschrieben am: 02.05.2015 23:10:28
Hallo Luschi,
ich denke, es wäre am einfachsten, den Makro komplett abzubrechen (also code gleich am Anfang davon), wenn man ihm mitte,ilt, dass wenn AR14=0 (da bilde ich die Summe von AR16:AR7542) ist, er das Ganze abbricht? Wie würde da der Code aussehen?
Beste Grüsse
Gisela

Bild

Betrifft: AW: Endlosschleife vBA
von: Gisela
Geschrieben am: 04.05.2015 22:09:22
Hallo Luschi,also der
Kreis dreht und dreht sich und es kommt keine LZF oder ähnliches... Durch zweimaliges Drücken der esc-Taste bricht er ab und fordert mich zum debuggen der fettgedruckten Zeile auf:
If Not cell Is Nothing Then
If cell.Value = 1 Then
cell.EntireRow.Copy Destination:=Tabelle2.Rows(i)
i = i + 1
...
Wenn ich
If Not cell Is Nothing Then
lösche, läuft der makro überhaupt nicht mehr:
hier einmal der komplette Makro:

Sub Michelnummern()
    Rows("1:15").Select
    Selection.Copy
    Sheets("Tabelle2").Select
    Range("A1").Select
    ActiveSheet.Paste
    Range("A1").Select
    Sheets("Tabelle1").Select
    Range("A17").Select
    Application.CutCopyMode = False
    Range("A1").Select
Dim i As Integer
Dim cell As Range
i = 19
For Each cell In Tabelle1.Range("AR16:AR7542")
If Not cell Is Nothing Then
    If cell.Value = 1 Then
        cell.EntireRow.Copy Destination:=Tabelle2.Rows(i)
        i = i + 1
    End If
End If
Next cell
    Sheets("Tabelle2").Select
    Sheets("Tabelle1").Select
    Rows("16:16").Select
    Selection.Copy
    Sheets("Tabelle2").Select
    Range("A18").Select
    ActiveSheet.Paste
    Rows("18:18").Select
    Application.CutCopyMode = False
    With Selection.Interior
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
       Selection.RowHeight = 30
    Columns("B:B").ColumnWidth = 20.64
        Sheets("Tabelle1").Select
    Range("BO17:BO20").Select
    Selection.Copy
    Sheets("Tabelle2").Select
    Range("BO17").Select
    ActiveSheet.Paste
        Sheets("Tabelle2").Select
 Sheets("Tabelle1").Select
Range("BI18").Select
        Selection.Copy
    Sheets("Tabelle2").Select
    Range("BI18").Select
    ActiveSheet.Paste
    Range("B1").Select
End Sub
WIe kann ich den Makro abbrechen lassen, wenn keine Zelle im AR-Bereich den Wert 1 enthält???
Beste Grüsse
Gisela

Bild

Betrifft: AW: Endlosschleife vBA
von: Daniel
Geschrieben am: 04.05.2015 22:24:32
Das ist keine Endlossschleife.
Es dauert halt nur ein bisschen, bis alle Zeilen abgearbeitet sind.
wenns schneller gehen soll, wäre folgendes Vorgehen anzuraten:
ersetze diesen Codeteil

For Each cell In Tabelle1.Range("AR16:AR7542")
If Not cell Is Nothing Then
    If cell.Value = 1 Then
        cell.EntireRow.Copy Destination:=Tabelle2.Rows(i)
        i = i + 1
    End If
End If
Next cell
durch folgendes:
With Sheets("Tabelle2")
Tabelle1.Range("16:7542").Copy Destination:=.Range("A19")
    With .SpecialCells(xlcelltypelastcell)
        With Range(.Offset(18 - .row, 1), .Offset(0, 1))
            .FormulaR1C1 = "=IF(RC44=1,Row(),0)
            .cells(1, 1).value = 0
            .EntireRow.RemoveDuplicates
            .ClearContents
         end With
    End With
End With

dieser Code kopiert erstmal den ganzen Zellbereich.
Dann werden per Formel alle Zeilen die gelöscht werden müssen mit 0 markiert und die anderen mit der zeilennummer.
Somit kann man dann die zu löschenden Zeilen mit der Funktion Duplikat-Entferen entfernen, welche sehr schnell ist und auch grösste Datenmengen verarbeitet.
das ist wesentlich effektiver als das Zeilelenweise kopieren, weil das kopieren des ganzen Blocks fast genauso lange dauert wie das kopieren einer einzigen Zeile.
Gruß Daniel

Bild

Betrifft: AW: Endlosschleife vBA
von: Gisela
Geschrieben am: 06.05.2015 00:12:18
Hallo Daniel,
da meine VBA-Kenntnisse bescheiden sind, verstehe ich leider nur Bahnhof...
Beste Grüsse
Gisela

Bild

Betrifft: AW: Endlosschleife vBA
von: Daniel
Geschrieben am: 06.05.2015 07:35:08
Bevor du ein Macro Schreibstil, solltest du dir erstmal Gedanken darüber machen, wie du die Aufgabe am einfachsten und schnellsten lösen kannst, wenn du es von Hand machen musst.
Von Hand würdest du ja auch nicht jede Zeile einzeln kopieren, sondern den Autofilter einsetzen und dann kopieren, oder erst alles kopieren und dann in der Kopie die nicht benötigten Zeilen wider löschen (auch wieder mit Autofilter oder mit dem Duplikate-entfernen.
Diesen weg programmierst du dann nach.
Gruß Daniel

Bild

Betrifft: AW: Endlosschleife vBA
von: Gisela
Geschrieben am: 06.05.2015 11:50:40
Hallo Daniel,
wie wäre der Code wenn ich sagen will:
wenn AR14=0 (dort wird die Summe dieser Spalte gebildet), dann führe den restlichen Code nicht mehr aus?
Beste Grüsse
Gisela

Bild

Betrifft: AW: Endlosschleife vBA
von: Gisela
Geschrieben am: 06.05.2015 11:52:07
Hallo Daniel,
wie wäre der Code wenn ich sagen will:
wenn AR14=0 (dort wird die Summe dieser Spalte gebildet), dann führe den restlichen Code nicht mehr aus?
Beste Grüsse
Gisela

Bild

Betrifft: AW: Endlosschleife vBA
von: Daniel
Geschrieben am: 06.05.2015 12:02:45
Hi
mit der Abfrage:


If Range("AR14").value <> 0 Then
    ...
    hier dann der weitere Code
    ...
End if
Gruß Daniel

Bild

Betrifft: AW: Endlosschleife vBA
von: Daniel
Geschrieben am: 06.05.2015 12:02:49
Hi
mit der Abfrage:


If Range("AR14").value <> 0 Then
    ...
    hier dann der weitere Code
    ...
End if
Gruß Daniel

 Bild

Beiträge aus den Excel-Beispielen zum Thema "ZählenWenn formel Problem wegen #nv"