Do-While Schleife mit zwei Bedingungen

  • Allgemein

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Do-While Schleife mit zwei Bedingungen

    Hallo Leute,

    habe heute mal folgendes Problem mitgebracht:

    Ich habe zwei Excel Tabellen in einem Dokument (Table1 und Table2). Table1 ist von 2009 und Table2 von 2010, in beiden Tabellen sind sogenannte ID's vorhanden. nun möchte ich die IDs aus 2009 mit denen aus 2010 abgleichen und eine neue Tabelle(2011, Table3) erstellen. Neben der ID sind allerdings noch andere Werte angegeben, von denen ich die neueren (2010) übernehmen möchte. und das ganze funktioniert auch halbwegs...

    Ich habe folgenden Code:

    VB.NET-Quellcode

    1. Do While Row1 <= End1 = True
    2. Sheets(Tabelle1).Select
    3. OldNr = Cells(Row1, Col1).Value
    4. Sheets(Tabelle2).Select
    5. NewNr = Cells(Row2, Col2).Value
    6. Row1 = Row1 + 1
    7. Row2 = Row2 + 1
    8. Do While OldNr <> NewNr And Zeile <= End2 = True
    9. Sheets(Tabelle2).Select
    10. NewNr = Cells(Zeile, Col2).Value
    11. Zeile = Zeile + 1
    12. Loop
    13. ' If OldNr = NewNr Then
    14. nZeile = nZeile + 1
    15. Sheets(Tabelle3).Select
    16. Cells(nZeile, nSpalte).Value = NewNr
    17. Zeiles = Zeile - 1
    18. nSpaltes = 2
    19. Do While nSpaltes <= Co1E = True
    20. Sheets(Tabelle2).Select
    21. Wert = Cells(Zeiles, nSpaltes).Value
    22. 'MsgBox (Wert)
    23. Sheets(Tabelle3).Select
    24. Cells(nZeile, nSpaltes).Value = Wert
    25. nSpaltes = nSpaltes + 1
    26. Loop


    Die Variablen werden bereits vorher im Code deklariert...

    Meine Fehlervermutung sieht folgender Maßen aus:

    VB.NET-Quellcode

    1. Do While OldNr <> NewNr And Zeile <= End2 = True


    Hier wird die Variable Zeile bis max(10) laufen und das tut sie auch. Anschließend wird 1 dazuaddiert. Da die Bedingung nun nicht mehr erfüllt ist wird die Do-While Schleife nicht erneut ausgeführt . Als nächstes wird der Wert von Zeile(aktuell 11) minus 1 als Wert von Zeiles eingesetzt. Mit Zeiles(aktueller Wert 10) soll nun in die Variable Wert einer der anderen Werte eingespeichert werden. Der anschließend in Table3 ausgegeben wird. Bis hierhein funktioniert auch alles nun passiert aber folgendes: Wird die äußere Do-While Schleife nun nochmal ausgeführt, so werden die gleichen Werte ausgegeben wie in Zeile eins(Tabelle3). Ich vermute daher das die nachfolgende Do-While Schleife erst unterbrochen wird wenn letztere Bedingung erfüllt ist.

    VB.NET-Quellcode

    1. Do While OldNr <> NewNr And Zeile <= End2 = True


    Danke schonmal für eure Hilfe...

    gruß Felix





    //Edit

    Der Fehler liegt definitv in der Do-While-Schleife. Es MÜSSEN IMMER beide Bedingungen True sein damit die Schleife läuft.. Ist dazu And nicht der richtige Operator?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „default“ ()

    Nein, In 2009 gab es IDs die gelöscht wurden und nun in 2010 nicht mehr vorhanden sind, die sollen dann natürlich auch in 2011 nicht mehr vorhanden sein. Also es sollen nur die rein die in 2009 und 2010 sind(in 2010 sind keine neuen dazu gekommen) die Ids werden auch super ausgelesen und eingesetzt in Table3 nur die restlichen Werte die funktionieren nicht.
    Du kannst eine Do-Schleife auch mit

    VB.NET-Quellcode

    1. Exit Do
    beenden.
    Setze einen Haltepunkt rein, verfolge die Werte der Variablen, und da siehst Du, wenn er rausgehen soll und es nicht tut bzw. umgekehrt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Do While OldNr <> NewNr And Zeile <= End2 = True


    Das sieht mir doch etwas komisch aus.
    Die Schleife läuft jetzt, wenn OldNr und NewNr nicht gleich sind UND Zeile kleiner oder gleich End2 ist.

    OldNr | NewNr | Zeile | End2 || Läuft?
    1|2|3|4||Ja
    1|2|4|3||Nein
    1|1|3|4||Nein
    1|1|4|3||Nein

    Diese Bedingung würde ich allerdings nicht mit = True am Ende schreiben, sondern

    VB.NET-Quellcode

    1. Do While OldNr <> NewNr And Zeile <= End2


    PS:
    Das Vergleichen der Bedingung mit True ist eigentlich unnögig, weil "If True = True Then" sowiso zu "If True Then" wird.
    Es schädigt in meinen Augen die Übersichtlichkeit, wenn (wie jetzt) "If 1 <= 2 = True Then" steht, anstelle von "If 1 <= 2 Then".
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    default schrieb:

    In 2009 gab es IDs die gelöscht wurden und nun in 2010 nicht mehr vorhanden sind. Also es sollen nur die rein die in 2009 und 2010 sind(in 2010 sind keine neuen dazu gekommen)

    Dann verstehe ich nicht, warum du ühaupt in 2009 nachgugge mußt.
    Übernimm doch einfach alle 2010er nach 2011.