"End IF" zu viel?! :O

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Center.

    "End IF" zu viel?! :O

    Hi Leute,

    laut VBA habe "End IF"'s zu viel, kann jemand helfen?

    Do While i <= k
    If Cells(i, 2) = hash Then
    i = k + 10
    If Cells(i, 3) = "" Then Cells(i, 3) = pDatum Else
    If Cells(i, 3) > pDatum Then Cells(i, 3) = pDatum Else
    If Cells(i, 4) = "" Then Cells(i, 4) = pDatum Else
    If Cells(i, 4) < pDatum Then
    Cells(i, 4) = pDatum
    End If
    End If
    End If
    End If
    Else
    i = i + 1
    End If
    Loop

    Visual Basic-Quellcode

    1. Do While i <= k
    2. If Cells(i, 2) = hash Then
    3. i = k + 10
    4. If Cells(i, 3) = "" Then Cells(i, 3) = pDatum Else
    5. If Cells(i, 3) > pDatum Then Cells(i, 3) = pDatum Else
    6. If Cells(i, 4) = "" Then Cells(i, 4) = pDatum Else
    7. If Cells(i, 4) < pDatum Then
    8. Cells(i, 4) = pDatum
    9. End If
    10. End If
    11. End If
    12. End If
    13. Else
    14. i = i + 1
    15. End If
    16. Loop

    Erst mal formatiert. Bei den einzeilligen Ifs brauchst du meine ich kein End If !
    2 Tips:
    - Einrücken(Tabtaste) dann siehst du immer direkt bei welchem if du dich befindest)
    - schreibe bei solchen Schleifen das end if direkt am Anfang mit un schreib dahinte rzu welcher schleife es gehört
    btw das kann man schöner lösen...

    Visual Basic-Quellcode

    1. Do While i <= k
    2. Select Case True
    3. Case Cells(i, 2) = 1
    4. i = k + 10
    5. Case Cells(i, 3) = ""
    6. Cells(i, 3) = pdatum
    7. Case Cells(i, 3) > pdatum
    8. Cells(i, 3) = pdatum
    9. Case Cells(i, 4) = ""
    10. Cells(i, 4) = pdatum
    11. Case Cells(i, 4) < pdatum
    12. Cells(i, 4) = pdatum
    13. Case Else
    14. i = i + 1
    15. End Select
    16. Loop

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FloFuchs“ ()

    Oder so:

    Visual Basic-Quellcode

    1. DO WHILE i < = k
    2. IF Cells( i, 2 ) = hash THEN
    3. i = k + 10
    4. IF Cells( i, 3 ) = "" THEN
    5. Cells( i, 3 ) = pDatum
    6. ELSEIF Cells( i, 3 ) > pDatum THEN
    7. Cells( i, 3 ) = pDatum
    8. END IF
    9. IF Cells( i, 4 ) = "" THEN
    10. Cells( i, 4 ) = pDatum
    11. ELSEIF Cells( i, 4 ) < pDatum THEN
    12. Cells( i, 4 ) = pDatum
    13. END IF
    14. ELSE
    15. i = i + 1
    16. END IF
    17. LOOP

    MarcoIT schrieb:

    die bessere und schönere Variante is ja wohl die mit Switch Case
    Da bin ich mir gar nicht so sicher.
    Die beiden Varianten liefern unterschiedliche Ergebnisse und vom Gefühl her ist Eierleins Variante logischer.
    Kommt natürlich darauf an, was tatsächlich gefordert ist.

    Soll ich auch noch eine Variante anbieten?

    Visual Basic-Quellcode

    1. Do While i < = k
    2. If Cells( i, 2 ) = hash Then
    3. i = k + 10
    4. If Cells( i, 3 ) = "" Or Cells( i, 3 ) > pDatum Then Cells( i, 3 ) = pDatum
    5. If Cells( i, 4 ) = "" Or Cells( i, 4 ) < pDatum Then Cells( i, 4 ) = pDatum
    6. Else
    7. i = i + 1
    8. End If
    9. Loop
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Soll ich auch noch eine Variante anbieten?

    Bin kein Experte in VBA, aber was passiert hier:

    Visual Basic-Quellcode

    1. If Cells( i, 3 ) = "" Or Cells( i, 3 ) > pDatum Then Cells( i, 3 ) = pDatum

    Vermutlich wird wie in VB6 der zweite Teil des IF Statements unabhängig vom Resultat des ersten Teils evaluiert. Und was passiert, wenn ich einen leeren String mit einem Datum vergleiche ... WENN pDatum vom Typ Date ist? Dann wäre in VBA in der Tat Eierleins Lösung die einzige Möglichkeit das zu unterbinden. Alternativ ist VBA so typenlos, dass im Zweifel eh alles "Variant" ist ;)

    picoflop schrieb:

    Und was passiert, wenn ich einen leeren String mit einem Datum vergleiche ... WENN pDatum vom Typ Date ist?
    Da ist Excel-VBA tatsächlich ganz leidenschaftslos.
    Ein Datum wird intern als Zahl behandelt und der Vergleich mit "" entspricht einem Vergleich mit 0, was dem 1.1.1900 entspricht.
    Für "Option Strict On"-Fans ein Graus :D

    Interessant wird es aber, wenn in der Zelle irgendein Text steht, der nicht als Datum interpretiert werden kann.
    Aber das wird ja in keinem der Beispiele sauber abgefangen.
    Ich wollte nicht soweit gehen, hier noch die Funktionen IsDate und DateDiff zu erklären :)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --