Anzeige
Archiv - Navigation
1512to1516
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Schleife läuft endlos.....?

Schleife läuft endlos.....?
22.09.2016 21:12:40
EasyD
Servus zusammen
ich habe mal wieder ein Brett vorm Kopf.
Ich durchlaufe das Blatt "Import" mit einer Schleife und Suche nach Übereinstimmungen in Spalte 9 mit dem Blatt "Eingabe" Spalte 8, dort im Bereich Zeile ab Zeile 6.
Wenn Übereinstimmung, dann in Spalte 18 eine "1" schreiben ---- klappt
wenn keine Übereinstimmung, dann die gefundene zeile (LoJ) aus Import kopieren und in die nächste freie Zeile im Blatt "Fehlerprotokoll" schreiben ---- da hängt's
Er kopiert mir nicht nur diese Zeile, sonder er kopiert ALLE zeilen, und das auch noch immer wieder. musste den Code abbrechen als ich germerkt habe, dass er nicht mehr mit kopieren und einfügen aufhört. Ich sehe das Problem nicht. Eigentlich dachte ich, der Vorgang wird nur ausgeführt im "Else-Fall"....?
und da kommt der vba-dummy wieder durch:
Ich bin mir auch nicht sicher, was ..."Offset(1, 0)."... eigentlich bewirkt,
Mein Code - wer kann helfen?
Sub Prfg()
Sheets("Import").Activate
Dim LoI As Long
Dim LoJ As Long
Dim LoLetzte1 As Long
Dim LoLetzte2 As Long
LoLetzte1 = 65536
With Worksheets("Eingabe")
If .Range("K65536") = "" Then LoLetzte1 = .Range("K65536").End(xlUp).Row
End With
LoLetzte2 = 65536
With Worksheets("Import")
If .Range("I65536") = "" Then LoLetzte2 = .Range("I65536").End(xlUp).Row
End With
For LoI = 6 To LoLetzte1
For LoJ = 2 To LoLetzte2
If Worksheets("Import").Cells(LoJ, 9) = Worksheets("Eingabe").Cells(LoI, 10) _
Or Worksheets("Import").Cells(LoJ, 8).Value = 378000 Then
'1 schreiben wenn ok
Worksheets("Import").Cells(LoJ, 18).Value = 1
Else
'Fehlerzeile kopieren nach Fehlerprotokoll
'xxxxxxxxxxxxxxxxxxxxxxxxx hier hängt die Kiste xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Rows(LoJ).Copy
Sheets("Fehlerprotokoll").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0). _
PasteSpecial xlPasteValues
'xxxxxxxxxxxxxxxxxxxxxxxxx hier hängt die Kiste xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
End If
Next LoJ
Next LoI
'Summe in Zelle R1 Blatt Import schreiben und Fehlermeldung ausgeben wenn nicht 0
Sheets("Import").Range("R1") = Application.WorksheetFunction.Sum(Range("R2:R10000"))
Sheets("Import").Range("S1") = Application.WorksheetFunction.Count(Range("K2:K10000"))
'die erstellen 1sen werden summiert und verglichen:
If Sheets("Import").Range("R1").Value = Sheets("Import").Range("S1").Value Then
Else
'wenn Fehler gefunden (R1 ist ungleich S1), dann Fehlermeldung
MsgBox "....."
Sheets("Eingabe").Activate
End If
End Sub

Vielen Dank für eure Hilfe vorab!

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife läuft endlos.....?
22.09.2016 21:51:11
Gerd
Auch Hallo!
Offset/Versetzen (Zeilen nach unten , Spalten nach rechts)
Negative Werte = Zeilen nach oben bzw. Spalten nach links.
Weshalb machst du eine Doppelschleife?
Gruss Gerd
AW: Schleife läuft endlos.....?
22.09.2016 22:08:25
EasyD
Hallo Gerd
verstehe nicht so recht, was du mit Doppelschleife meinst.
er soll, wenn die Übereinstimmung da ist, diese "1" schreiben, und wenn nicht soll er die Zeile kopieren....
wenn du eine bessere Lösung hast - nur her damit ;)
die Nummer mit Offset habe ich verstanden, wäre ja so auch richtig denke ich
ich weiß nur nicht warum er den Kopiervorgang:
1. mit JEDER Zeile macht und nicht nur im "Else-Fall"
2. er diese Kopiererei endlos macht (ich habe mittlerweile 10x so viele neu eingefügte Zeilen auf dem Fehlerprotokoll
Anzeige
AW: Schleife läuft endlos.....?
22.09.2016 22:11:33
EasyD
aaah Doppelschleife, ich verstehe
Im Blatt Eingabe stehen ab Zeile 6 bis undefiniert nach unten (ca 10-20 Werte) zahlen
diese soll er im Blatt Import vergleichen mit den Werten in Spalte 9
Wenn die Spalte 9 einen Wert hat, der in Eingabe ab Zeile 6 ebenfalls steht
dann 1
Wenn nicht
dann kopieren....
ich sehe, ich hätte mit meiner Erklärung weiter ausholen müssen
AW: Beispielmappe hochladen
23.09.2016 00:39:50
Werner
Hallo,
Schätze mal da wäre eine hochgeladene Datei sinnvoll. Es gibt da nämlich Ungereimtheiten.
Du schreibst, dass du die Werte aus Import Spalte 9 mit Eingabe Spalte 8 auf Übereinstimmung prüfen willst. Der Code hier überprüft aber Import Spalte 9 mit Eingabe Spalte 10.
Zudem hat dein Code noch ein oder mit drin: Or Worksheets("Import").Cells(LoJ, 8).Value = 378000 von dem du in deiner Beschreibung aber nichts erwähnst.
Gruß Werner
Anzeige
AW: Beispielmappe hochladen
23.09.2016 11:50:44
EasyD
ok Gerd
erstmal danke, dass du dich damit beschäftigst. Du hast recht, Spalte 8 auf dem Blatt Eingabe stimmt nicht, es ist Spalte 10. Es war gestern wohl spät, habe beim schreiben wohl nicht so richtig aufgepasst. Sorry.
Eigentlich ist es sogar Spalte 11 (Spalte K um es mal mit Buchstaben auszudrücken), da ist aber eine ausgeblendete Spalte mit dabei. Offenbar wird die beim zählen aber übergangen, war mir vorher auch noch nicht so klar.
Ich kann dir nicht einfach die Datei hoch laden.
erstens ist das mittlerweile ein ziemliches Monster, da laufen allerlei Prüfroutinen drin ab. Das würde zu unübersichtlich für dich
zweitens leider vertraulich
was ich aber machen kann, ich habe dir einfach mal die 3 Blätter um die es geht in eine neue Datei reinkopiert. Den Code habe ich auch raus gelassen. Es geht ja "nur" dass du sehen kannst was ich vor habe.
https://www.herber.de/bbs/user/108367.xlsx
Das kannst du dir gerne mal anschauen.
nochmal zusammenfassend:
  • auf Eingabe in Spalte K stehen ab Zeile 6 bis zu zeile ? (unbestimmt) die Kontrollwerte - gelb markiert

  • in Import Spalte I stehen die Werte, die geprüft werden sollen - auch gelb markiert

  • taucht in Import in Spalte I ein Wert auf, der nicht in Eingabe Spalte K steht, dann soll auf Fehlerprotokoll kopiert werden

  • ich verstehe halt nicht, warum er mit die Aktion korrekt macht (also die 1 schreibt in Spalte R) wenn die Werte in Eingabe und Import übereinstimmen - dann aber auch gleichzeitig immer fleißig die Aktion für den Else-Fall ausführt (also kopieren auf Fehlerprotokoll) - dazu habe ich in Zeile 11 mal einen Fehler eingebaut, hier müsste die Aktion also ausgeführt werden.
    die "Or-Bedingung" dient nur dazu die Zeilen auf Import abzufangen, in denen in Spalte I gar kein Wert steht. Auch hier soll er die 1 schreiben und nix kopieren. Das habe ich nicht erwähnt um es nicht zu kompliziert zu machen, denn wie gesagt - bei Übereinstimmung funktioniert ja m.E. alles prächtig.
    schau mal ob du was damit anfangen kannst...
    Anzeige
    AW: Beispielmappe hochladen
    23.09.2016 12:11:02
    EasyD
    ich muss ergänzen
    es liegt an der Spaltennummer auf Eingabe!!!
    Spalte K ist und bleibt die Nr 11. Die Ausblendung spielt also keine Rolle.
    mir war dies vorher nicht aufgefallen, weil ich die 1sen (=Übereinstimmung) nach Durchlauf der Prozedur wieder lösche.
    dafür aber nun folgender neuer Fehler in der Zeile in der ich den Fehler eingebaut habe - er will nicht kopieren:
    "die Pastespecial-Methode des Range-Objektes konnte nicht ausgeführt werden"
    bis da hin läuft aber alles ordnungsgemäß durch. er schreibt schön die 1sen in Spalte R und erst in der Fehlerzeile hängt er.
    Anzeige
    AW: Beispielmappe hochladen
    23.09.2016 12:58:38
    Werner
    Hallo,
    versuchs mal mit EntireRow
    Sheets("Fehlerprotokoll").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRos _
    .PasteSpecial xlPasteValues
    
    Gruß Werner
    AW: Beispielmappe hochladen
    23.09.2016 13:19:19
    EasyD
    ....
    hängt an geicher Stelle.
    habe wie folgt korrigiert:
    ..... .EntireRows _
    Objekt unterstützt diese Eigenschaft oder Methode nicht.....
    AW: Beispielmappe hochladen
    23.09.2016 14:28:25
    EasyD
    ok, weiter gehts
    das eine Problem wäre behoben. Es war per vba noch ein Blattschutz drauf den ich nun ebenfalls per vba entfernt habe. er kopiert nun wieder.
    aber nach wie vor kopiert er alle zeilen und nicht nur die fehlerhaften.
    das Problem ist, dass ich die Datei auch nur weiter entwickele. Das Original stammt nicht von mir. Die Sache mit dem Blattschutz war mir nicht bekannt, habe es gerade erst heraus gefunden.
    ich glaube aber es kommt Licht ins Dunkel.
    lass mich noch mal ein bisschen probieren, ich melde mich wieder
    Anzeige
    AW: Beispielmappe hochladen
    23.09.2016 15:39:30
    EasyD
    Also Gerd
    ich habe nochmal umgebaut weil ich dachte ich kann den Fehler identifizieren.
    Ich habe jetzt einfach mal den "Else-Fall" in eine zweite Schleife gebaut weil ich dachte er hätte mit der Else-Aktion irgendein Problem. Sprich - in der ersten Schleife bei Else nichts machen, nach Durchlauf der Schleife eine neue Schleife starten und die 1sen in Spalte R (Spalte 18) prüfen. Immer wenn keine 1 (Ergebnis aus der ersten Schleife), dann Zeile kopieren. Das würde auf das gleiche hinaus laufen.
    Funktioniert aber trotzdem nicht. kurioserweise läuft er das gesamte Blatt Import exakt 2x durch und kopiert alle Zeilen, also auch die mit 1sen. Insofern Änderung zum bisherigen Fehler weil bis dato die Schleife einfach endlos durch lief. Warum jetzt aber exakt 2x erschließt sich mir wieder nicht. Abgesehen davon will ich ja auch nur die "Fehlerzeilen" kopieren.
    ich blick nicht mehr durch. Ist die Aktion
    Rows(LoJ, 1).Copy die richtige?
    Bzw Rows(LoK, 1).Copy in der neuen Schleife
    Ich vermute nämlich nach wie vor, dass er zwar die Zeile findet, aber halt nicht die richtige Zeile kopiert....
    der umgebaute (und natürlich sehr viel längere) Code:
    Sub Prfg()
    'da war ein Blattschutz drauf
    Call Schutz_Aufheben
    Sheets("Import").Activate
    Dim LoI As Long
    Dim LoJ As Long
    Dim LoLetzte1 As Long
    Dim LoLetzte2 As Long
    LoLetzte1 = 65536
    With Worksheets("Eingabe")
    If .Range("K65536") = "" Then LoLetzte1 = .Range("K65536").End(xlUp).Row
    End With
    LoLetzte2 = 65536
    With Worksheets("Import")
    If .Range("I65536") = "" Then LoLetzte2 = .Range("I65536").End(xlUp).Row
    End With
    For LoI = 6 To LoLetzte1
    For LoJ = 2 To LoLetzte2
    If Worksheets("Import").Cells(LoJ, 9) = Worksheets("Eingabe").Cells(LoI, 11) _
    Or Worksheets("Import").Cells(LoJ, 8).Value = 378000 Then
    '1 schreiben wenn ok
    Worksheets("Import").Cells(LoJ, 18).Value = 1
    Else
    'Fehlerzeile kopieren nach Fehlerprotokoll
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    'ich habe das Original hier mal ausgeschaltet, also nichts machen bei Else damit ich unten
    'die Schleife dran hängen kann
    '                Rows(LoJ).Copy
    '                Sheets("Fehlerprotokoll").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0). _
    EntireRow _
    '                .PasteSpecial xlPasteValues
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    End If
    Next LoJ
    Next LoI
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    'hier habe ich die neue Schleife hinten dran gehängt um auf des Pudel's Kern zu kommen
    Dim LoK As Long
    Dim LoLetzte3 As Long
    LoLetzte3 = 65536
    With Worksheets("Import")
    If .Range("R65536") = "" Then LoLetzte3 = .Range("I65536").End(xlUp).Row
    End With
    For LoK = 2 To LoLetzte3
    If Worksheets("Import").Cells(LoK, 18).Value = 1 Then
    Else
    Rows(LoK).Copy
    Sheets("Fehlerprotokoll").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow  _
    _
    .PasteSpecial xlPasteValues
    End If
    Next LoK
    'Summe in Zelle R1 Blatt Import schreiben und Fehlermeldung ausgeben wenn nicht identisch mit  _
    S1 '(Anzahl befüllter Zeilen)
    Sheets("Import").Range("R1") = Application.WorksheetFunction.Sum(Range("R2:R10000"))
    Sheets("Import").Range("S1") = Application.WorksheetFunction.Count(Range("F2:F10000"))
    If Sheets("Import").Range("R1").Value = Sheets("Import").Range("S1").Value Then
    Else
    'wenn Fehler gefunden (R1 ist ungleich S1), dann Fehlermeldung
    MsgBox "....."
    Sheets("Eingabe").Activate
    End If
    'der Teil hier hatte im bisherigen Code-Schnipsel gefehlt:
    'Spalte R und S1 wieder löschen
    Sheets("Import").Range("R1:R10000").ClearContents
    Sheets("Import").Range("S1").ClearContents
    'da war ein Blattschutz drauf
    Call Schutz_Anschalten
    End Sub
    

    Anzeige
    AW: Beispielmappe hochladen
    23.09.2016 16:56:19
    EasyD
    also ich würde ja gerne wissen woran es lag
    mit dem zuletzt geposteten Code läuft es jedenfalls
    etwas lange, da insgesamt 3 schleifen ablaufen, aber es läuft...
    Grundsatzfrage
    25.09.2016 15:48:23
    EasyD
    Also,
    das obige Problem war ja gelöst, wenn auch nur recht dürftig. Ich habe da aber ein Grundsatzproblem mit der Schleife zum Verständnis.
    Nun stehe ich wieder vor der identischen Aufgabenstellung, diesmal nur an anderer Stelle mit etwas anderen Bedingungen. Der Grundsatz ist aber der gleiche.
    Ich muss in einer For-Next-Schleife eine if-Abfrage machen.
    Der True-Fall läuft i.O., der Else-Fall aber nicht.
    Den Grund dafür kann ich mir nicht erklären.
    Das in diesem Thread beschriebene Problem habe ich ja gelöst, indem ich nach Durchlauf der 1.Schleife eine weitere Schleife durchlaufen lasse, die die True-Aktionen der 1.Schleife prüft (die "1" als das Ergebnis der if-Abfrage der 1.Schleife). Wenn keine 1, dann habe ich den True-Fall für die 2.Schleife und kann das machen, was ich eigentlich schon in der 1.Schleife für den Else-Fall vorgesehen hatte.
    Läuft natürlich nur mäßig flott die gesamte Prozedur, da eine eigentlich unnötige Schleife hinten dran hängt.
    Kann man die Schleife nicht bauen im Stile von
    For... To...
    If x = True Then y, Else z
    Next
    er macht mir das z nicht....
    Anzeige
    Schleifen absolut unnötig
    25.09.2016 16:20:55
    Daniel
    Hi
    um deine Aufgabe zu lösen, brauchst du keine Schleife in VBA.
    1. zum Überprüfen, ob die Werte aus dem Blatt IMPORT Spalte I im Blatt EINGABE Spalte K vorkommen, kannst du einfach die Funktion ZählenWenn verwenden, hierzu kommt folgende Formel in die Zelle R2 auf dem Blatt IMPORT
    =Wenn(ZählenWenn(Eingabe!$K$6:$K$24;$I2)=0;"x";1)
    2. dann kopierst du alle Zeilen, die in Spalte R das "x" haben, in das Blatt FEHLERPROTOKOLL (z.B. mit dem Autofilter, oder in VBA mit SpecialCells:
    als gesamtcode sieht das dann so aus:
    
    Sub Fehlerprotokoll()
    Dim adrFibuKonten As String
    '--- Adresse der zulässigen Konten ermitteln
    With Sheets("Eingabe")
    adrFibuKonten = .Range(.Cells(6, 11), .Cells(5, 11).End(xlDown)).Address(1, 1, xlR1C1)
    End With
    With Sheets("Import")
    With .Range("R2:R" & .Cells(.Rows.Count, 1).End(xlUp).Row)
    '--- Import kennzeichnen
    .FormulaR1C1 = "=IF(CountIf(Eingabe!" & adrFibuKonten & ",RC9)=0,""x"",1)"
    .Formula = .Value
    '--- Fehlerhafte Daten ins Fehlerprotokoll
    If WorksheetFunction.CountIf(.Cells, "x") > 0 Then
    Intersect(.Worksheet.Range("A:K"), .SpecialCells(xlCellTypeConstants, 2).EntireRow). _
    Copy
    Sheets("Fehlerprotokoll").Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial  _
    xlPasteAll
    End If
    End With
    End With
    End Sub
    
    Gruß Daniel
    Anzeige
    AW: Schleifen absolut unnötig
    25.09.2016 17:47:38
    EasyD
    ok Daniel
    das flutscht!
    Zählenwenn war in der Tat auch mein erster Gedanke, allerdings bin ich nicht auf die Idee gekommen die Formel per Code in die Spalte reinschreiben zu lassen. Das vereinfacht das Ganze natürlich erheblich.
    Super! Danke!
    Allerdings noch eine Anmerkung - in meinem Code oben hatte ich noch ein ODER drin:
    If Worksheets("Import").Cells(LoJ, 9) = Worksheets("Eingabe").Cells(LoI, 10) _
    Or Worksheets("Import").Cells(LoJ, 8).Value = 378000 Then
    

    soll heißen, die zulässigen FibuKonten stehen einmal im Bereich, den du mit adrFibuKonten definierst. Außerdem sollen aber noch Zeilen mit dem Wert 378000 in Spalte H zulässig sein. Dieser Wert ist fix und kann nicht geändert werden. Die Werte in adrFibuKonten allerdings schon, weshalb die Definition dieses Bereiches auch zwingend erforderlich ist.
    Mir ist jetzt nicht ganz klar, wie ich das ODER noch einbaue...
    Ich kann die 378000 nicht einfach in den Bereich rein schreiben. in Import steht dieser Wert auch in Spalte H, nicht I
    Ich kann auch nicht innerhalb der Wenn-Funktion mit ODER() arbeiten - oder doch? habe da Fragezeichen..
    Dann noch eine kurze Frage zu deinem Code:
    adrFibuKonten = .Range(.Cells(6, 11), .Cells(5, 11).End(xlDown)).Address(1, 1, xlR1C1)
    

    -> der Bereich beginnt in Spalte 11 Zeile 6 nach unten.
    -> wozu muss man da noch mal eine Zeile nach oben (5, 11)? Da steht nur eine Überschrift...
    Anzeige
    AW: Schleifen absolut unnötig
    25.09.2016 18:00:16
    EasyD
    ich glaube ich hab's
    .FormulaR1C1 = "=IF(RC8=378000,1,IF(CountIf(Eingabe!" & adrFibuKonten & ",RC9)=0,""x"",1))"
    
    werde nochmal ausgiebig testen und diese Prozedur auch auf meine zweite problematische Schleife anwenden.
    Ist aber eine wirklich sehr flüssige Lösung und natürlich wesentlich weniger aufwendig als meine Schleifen-Versuche....
    AW: Schleifen absolut unnötig
    25.09.2016 19:56:33
    EasyD
    also Daniel
    nochmals Danke
    funktioniert auch bei meinem zweiten Anwendungsfall, der ja im prinzip genauso gestrickt ist.
    offensichtlich denke ich an manchen Stellen noch zu umständlich, ich lerne ;)
    AW: Schleifen absolut unnötig
    25.09.2016 19:56:33
    EasyD
    also Daniel
    nochmals Danke
    funktioniert auch bei meinem zweiten Anwendungsfall, der ja im prinzip genauso gestrickt ist.
    offensichtlich denke ich an manchen Stellen noch zu umständlich, ich lerne ;)

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige