Anzeige
Archiv - Navigation
1684to1688
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

If-Schleife "reagiert" nicht

If-Schleife "reagiert" nicht
09.04.2019 15:44:49
Jonathan
Hallo zusammen,
ich habe folgenden Code:
Private Sub berechnen_Click()
For Durchlauf = 1 To bkraft
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 4) = Durchlauf
Bremskraft = (Durchlauf - Fpedalfeder) * iPedal
' "Zeichnung" der Kurve mit drei Knickpunkten für 0.75 bar Unterdruck
If Bremskraft  "" And _
Fahrzeugdaten.Phbz.Value  "" And _
Fahrzeugdaten.AnzKolben1A.Value  "" And _
Fahrzeugdaten.panl.Value  "" And _
Fahrzeugdaten.AnzBr1A.Value  "" And _
Fahrzeugdaten.uS.Value  "" And _
Fahrzeugdaten.hh.Value  "" And _
Fahrzeugdaten.rS.Value  "" Then
Mb1ADu = Format(Str(4 * Atn(1) * Fahrzeugdaten.Dk1A / 2 * Fahrzeugdaten.Dk1A / 2 *  _
Fahrzeugdaten.AnzKolben1A * Fahrzeugdaten.AnzBr1A * (PhbzDu - Fahrzeugdaten.panl) * Fahrzeugdaten.uS * Fahrzeugdaten.hh * Fahrzeugdaten.rS / 10), "0")
Else
Mb1ADu = ""
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 7) = Mb1ADu
' 2. Achse
If Fahrzeugdaten.Dk2A.Value  "" And _
Fahrzeugdaten.Phbz.Value  "" And _
Fahrzeugdaten.AnzKolben2A.Value  "" And _
Fahrzeugdaten.panl.Value  "" And _
Fahrzeugdaten.AnzBr2A.Value  "" And _
Fahrzeugdaten.uS.Value  "" And _
Fahrzeugdaten.hh.Value  "" And _
Fahrzeugdaten.rS.Value  "" Then
Mb2ADu = Format(Str(4 * Atn(1) * Fahrzeugdaten.Dk2A / 2 * Fahrzeugdaten.Dk2A / 2 *  _
Fahrzeugdaten.AnzKolben2A * Fahrzeugdaten.AnzBr2A * (PhbzDu - Fahrzeugdaten.panl) * Fahrzeugdaten.uS * Fahrzeugdaten.hh * Fahrzeugdaten.rS / 10), "0")
Else
Mb2A = ""
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 8) = Mb2ADu
' Bremsmoment pro Rad: MrDu
' 1. Achse
If Berechnungswerte.Mb1A.Value  "" And _
Fahrzeugdaten.Ir.Value  "" And _
Fahrzeugdaten.eta.Value  "" And _
Fahrzeugdaten.eta.Value  0 And _
Fahrzeugdaten.Vorgelegeja.Value = True Then
Mr1ADu = Format(Str(Mb1ADu * Fahrzeugdaten.Ir.Value / Fahrzeugdaten.eta.Value), "0")
Else
If Berechnungswerte.Mb1A.Value  "" And _
Fahrzeugdaten.Vorgelegeja.Value = False Then
Mr1ADu = Format(Str(Mb1ADu), "0")
Else
Mr1ADu = ""
End If
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 11) = Mr1ADu
' 2. Achse
If Berechnungswerte.Mb2A.Value  "" And _
Fahrzeugdaten.Ir.Value  "" And _
Fahrzeugdaten.eta.Value  "" And _
Fahrzeugdaten.eta.Value  0 And _
Fahrzeugdaten.Vorgelegeja.Value = True Then
Mr2ADu = Format(Str(Mb2ADu * Fahrzeugdaten.Ir.Value / Fahrzeugdaten.eta.Value), "0")
Else
If Berechnungswerte.Mb2A.Value  "" And _
Fahrzeugdaten.Vorgelegeja.Value = False Then
Mr2ADu = Format(Str(Mb2ADu), "0")
Else
Mr2ADu = ""
End If
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 12) = Mr2ADu
' Bremsmoment pro Achse: MaDu
' 1. Achse
If Berechnungswerte.Mr1A.Value  "" Then
Ma1ADu = Format(Str(Mr1ADu * 2), "0")
Else
Ma1ADu = ""
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 15) = Ma1ADu
' 2. Achse
If Berechnungswerte.Mr2A.Value  "" Then
Ma2ADu = Format(Str(Mr2ADu * 2), "0")
Else
Ma2ADu = ""
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 16) = Ma2ADu
' Bremskraft pro Rad: BrDu
' 1. Achse
If Berechnungswerte.Mr1A.Value  "" And _
Fahrzeugdaten.Rdyn.Value  "" Then
Br1ADu = Format(Str(Mr1ADu / Fahrzeugdaten.Rdyn.Value), "0")
Else
Br1ADu = ""
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 19) = Br1ADu
' 2. Achse
If Berechnungswerte.Mr2A.Value  "" And _
Fahrzeugdaten.Rdyn.Value  "" Then
Br2ADu = Format(Str(Mr2ADu / Fahrzeugdaten.Rdyn.Value), "0")
Else
Br2ADu = ""
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 20) = Br2ADu
' Bremskraft pro Achse: BDu
' 1. Achse
If Berechnungswerte.Br1A.Value  "" Then
B1ADu = Format(Str(Br1ADu * 2), "0")
Else
B1ADu = ""
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 23) = B1ADu
' 2. Achse
If Berechnungswerte.Br2A.Value  "" Then
B2ADu = Format(Str(Br2ADu * 2), "0")
Else
B2ADu = ""
End If
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 24) = B2ADu
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 4) = Durchlauf
Bremskraft = (Durchlauf - Fpedalfeder) * iPedal
'Verzögerung leer zl
' 2-Achser
zl = Format((Int(B1ADu) + Int(B2ADu)) / Fahrzeugdaten.GGl.Value / 9.81, "0.00")
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 27) = zl
'Verzögerung leer mit ABS zlABS
' 2-Achser
zlABS = Int(B1ADu) + Fahrzeugdaten.u.Value * Fahrzeugdaten.GGl.Value * 9.81 * (1 -  _
Fahrzeugdaten.G2Al.Value / Fahrzeugdaten.GGl.Value) / (Fahrzeugdaten.GGl.Value * 9.81 * (1 + Fahrzeugdaten.u.Value * (Fahrzeugdaten.Hl.Value / 1000) / (Fahrzeugdaten.L1A2A.Value / 1000)))
If zl 

Es geht um die letzte If-Schleife, diese reagiert nicht wie sie soll. Im Endeffekt soll immer der kleinere Wert (je nachdem zl oder zlABS) in die Tabelle geschrieben werden. Es wird aber immer zl in die Tabelle geschrieben, obwohl zlABS ab einem gewissen Punkt kleiner wird. Wo ist mein Fehler?

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: If-Schleife "reagiert" nicht
09.04.2019 16:03:46
Daniel
Hallo Jonathan,
wenn es nur um die letzte If Schleife geht, wäre es übersichtlicher wenn du den Rest deines Codes weglässt. Es würde mich wundern, wenn jemand den ganzen Code durchgeht. Und wenn, dann ärgert derjenige sich, dass es eigentlich nur um eine winzige If Schleife geht.
Zum Thema:
If zl 
Wenn zl KLEINER als zlABS ist, wird zlABS geschrieben. Sprich, zl wir genommen immer wenn es GRÖßER als zlABS ist. Das scheint dann ja stets der Fall zu sein wie du sagst. Es wird also der größere Wert ausgegeben, nicht der kleinere. Kehre einfach mal um in ">".
Gruß
Daniel
Anzeige
Sehr unübersichtliches Pgm ohne Deklaration, ...
09.04.2019 16:04:47
Luc:-?
…Jonathan,
so etwas zu untersuchen macht keinen Spaß!
1. Ein If-Konstrukt ist keine „Schleife“, da es nur dann mehrfach durchlaufen wird, wenn es innerhalb einer echten Schleife (For … Next) verwendet wird.
2. zl ist zwar nicht deklariert, der Variablen wird aber mit Format(…) ein Text zugewiesen. Der Wert von zlABS ist gar nicht erschließbar. Ist er kein Text, sondern eine Zahl, ist zl stets > zlABS.
Gruß, Luc :-?
„Der beste Beweis für intelligentes Leben im Universum ist, dass noch niemand versucht hat, Kontakt mit uns aufzunehmen.“ H.Lesch, 2018, Sonneberg
Deshalb Intelligenz steigern mit …

Anzeige
AW: Sehr unübersichtliches Pgm ohne Deklaration, ...
09.04.2019 16:19:53
Jonathan
Hallo Luc,
vielen Dank für deine schnelle Antwort.
Wie kann ich es darstellen, damit ihr es besser untersuchen könnt? Da der Rest so funktioniert, wie es soll, habe ich mal nur den relevanten Teil nochmal raus kopiert:
Private Sub berechnen_Click()
For Durchlauf = 1 To bkraf
'Verzögerung leer zl
' 2-Achser
zl = Format((Int(B1ADu) + Int(B2ADu)) / Fahrzeugdaten.GGl.Value / 9.81, "0.00")
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 27) = zl
'Verzögerung leer mit ABS zlABS
' 2-Achser
zlABS = Int(B1ADu) + Fahrzeugdaten.u.Value * Fahrzeugdaten.GGl.Value * 9.81 * (1 -  _
Fahrzeugdaten.G2Al.Value / Fahrzeugdaten.GGl.Value) / (Fahrzeugdaten.GGl.Value * 9.81 * (1 +  _
Fahrzeugdaten.u.Value * (Fahrzeugdaten.Hl.Value / 1000) / (Fahrzeugdaten.L1A2A.Value / 1000)))
If zl 

zu 1. Mein If-Konstrukt läuft ja in einer For-Next-Schleife.
zu 2. Wenn ich jetzt zl und zlABS mit Format(...) als Text deklariere, dann ist es wieder vergleichbar? Oder muss ich beides anders deklarieren?
Anzeige
AW: If-Schleife "reagiert" nicht
09.04.2019 16:26:24
Daniel
Hi
nur so zur Info: es gibt keine IF-Schleifen, man spricht von IF-Blöcken.
eine Schleife hast du immer dort, wo ein Ablauf wiederholt wird (For-Next, Do-Loop)
der Fehler kommt daher:
1. du machst keine Variablendeklaration, damit sind alle Variabeln von Typ Variant und können sowohl Zahl als auch Text werden, je nachdem was du der Variablen zuweist
2. du weist der Variablen zl einen Text zu (Format wandelt eine Zahl in einen Text!):
zl = Format((Int(B1ADu) + Int(B2ADu)) / Fahrzeugdaten.GGl.Value / 9.81, "0.00")
3. im Größer/Kleiner-Vergleich sind Texte immer größer als Zahlen, egal welche Werte vorhanden sind
lasse also einfach das Format in der gezeigten Programmzeile weg, damit das zl eine Zahl wird, die mit zlABS verglichen werden kann.
zl = (Int(B1ADu) + Int(B2ADu)) / Fahrzeugdaten.GGl.Value / 9.81
den IF-Block kannst du dir auch sparen und einfach die MIN-Funktion verwenden:
Worksheets("Reibwertdiagramm").Cells(Durchlauf + 2, 28) = Worksheetfunction.Min(zl, zlABS)
Gruß Daniel
Anzeige
AW: If-Schleife "reagiert" nicht
09.04.2019 17:16:25
Jonathan
Hallo Daniel,
genau das wars. Vielen Dank für deine Hilfe.
AW: If-Schleife "reagiert" nicht
09.04.2019 16:31:02
Zwenn
Hallo Jonathan,
ohne Dir zu nahe treten zu wollen, aber den Status "gut" für Deinen VBA Lvl würde ich nochmal überdenken.
  • Es gibt keine If-Schleifen (hat Luc schon geschrieben) Das sind Entscheidungen. Jedes Programm besteht aus Sequenzen, Entscheidungen und Iterationen (Schleifen). Das nennt sich strukturierte Programmierung.

  • Du hast keine einzige Variable deklariert. Wo kommen die Werte her und wer soll da durchsteigen? So kann auch niemand einen Testlauf machen, weil nix da ist.

  • Die Formatierung Deines Quelltextes lässt gelinde gesagt zu wünschen übrig. Arbeite mit Einrückungen für Codeblöcke innerhalb von If-Anweisungen und Schleifen und verwende weniger Leerzeilen.

  • Ich habe das mal umformatiert, um überhaupt etwas zu sehen. In dem ersten If-Konstrukt hinter der Kommentarzeile ' "Zeichnung" der Kurve mit drei Knickpunkten für 0.75 bar Unterdruck ist ein End If zu viel. Das Ganze dürfte also eigentlich gar nicht ohne Fehlermeldung laufen.

  • Wie groß ist denn bkraft, also, wie oft läuft die Schleife durch? Das müsstest Du ja mindestens in der Tabelle Reibwertdiagramm in Spalte 4 sehen können. Kannst Du Dort auch sehen, wann welcher Wert kleiner ist als der andere?
    Alles in allem denke ich, man kann Dir nur helfen, wenn Du eine Beispielmappe hochlädst.
    Viele Grüße,
    Zwenn
    Anzeige
    AW: If-Schleife "reagiert" nicht
    09.04.2019 17:30:19
    Jonathan
    Hallo Zwenn,
    vielen Dank für deine schnelle Antwort.
    ohne Dir zu nahe treten zu wollen, aber den Status "gut" für Deinen VBA Lvl würde ich nochmal überdenken.
    

    Das war dann wohl ein klassischer Fall von Selbstüberschätzung, ich habe es überdacht und bin zu dem Ergebnis gekommen, "gut" ist wirklich vollkommen übertrieben :-D
    Du hast keine einzige Variable deklariert. Wo kommen die Werte her und wer soll da durchsteigen? So kann auch niemand einen Testlauf machen, weil nix da ist.
    
    Sorry, mein Programm ist riesig, die Variabeln werden über ein Formular eingegeben...
    Die Formatierung Deines Quelltextes lässt gelinde gesagt zu wünschen übrig. Arbeite mit Einrückungen für Codeblöcke innerhalb von If-Anweisungen und Schleifen und verwende weniger Leerzeilen.
    
    Das sieht bei mir im Programm irgendwie ordentlicher aus und ist auch entsprechend eingerückt, hat es wohl hier nicht gescheit übernommen. Sorry dafür.
    Ich habe das mal umformatiert, um überhaupt etwas zu sehen. In dem ersten If-Konstrukt hinter der Kommentarzeile ' "Zeichnung" der Kurve mit drei Knickpunkten für 0.75 bar Unterdruck ist ein End If zu viel. Das Ganze dürfte also eigentlich gar nicht ohne Fehlermeldung laufen.
    
    Danke für deine Mühe. Das lag daran, dass ich einen Teil des Codes bereits raus kopiert habe, damit es nicht noch unübersichtlich wird, dabei ist ein "End If" übrig geblieben.
    Wie groß ist denn bkraft, also, wie oft läuft die Schleife durch? Das müsstest Du ja mindestens in der Tabelle Reibwertdiagramm in Spalte 4 sehen können. Kannst Du Dort auch sehen, wann welcher Wert kleiner ist als der andere?
    
    bkraft wird Variabel vom Nutzer eingegeben (idR bis 700). Das siehst du genau richtig, ich kann genau erkennen, wann welcher Wert größer als der andere wird aber dennoch danke für den Hinweis.
    Alles in allem denke ich, man kann Dir nur helfen, wenn Du eine Beispielmappe hochlädst.
    
    Der User Dani, hat mir die Lösung bereits "verraten", es lag an meinem unsauberen Programmieren, ich habe "Text" und "Zahl" wild gemischt. Da muss ich mich in Zukunft echt bessern. Trotzdem vielen Dank für deine ausführliche Antwort.
    VG Jonathan
    Anzeige
    Auch das hatte ich dir bereits mitgeteilt (2.), …
    09.04.2019 18:46:49
    Luc:-?
    …Jonathan;
    Daniel hatte eigentlich nur noch den 3.Pkt neu hinzugefügt, die 1. beiden hatte ich ja schon ange­merkt wie auch Zwenn nur 5min nach Daniel richtig festgestellt hatte (die +20min bei Daniel seien geschenkt, seine langen Texte - ggf auf dem Handy - brauchen halt ihre Zeit :-]).
    Luc :-?

    300 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige