Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

For Next Schleife und End if in VB

Dino30002 / 15 Antworten / Baumansicht Nickles

Hi,


ich habe ein Problem mit einer For Next-Schleife. Hier ist der Code:


For zaehler = 2 To TextBoxLineCount(Text1)
zeile = zeile + 1
If StrCount(TextBoxLine(Text1, zeile), "Begiena:") = 1 Then
Next zaehler
End if
[weiterer Code]
Next zaehler


Bei der Ausführung wird der Fehler "Next ohne For" ausgelöst und es wird eine Markierung auf das erste Next gesetzt. In der VB Hilfe steht, dass dieser Fehler unter anderem durch eine falsche If-End if Struktur innerhalb der Schleife ausgelöst werden kann. Das scheint bei meinem Code auch der Fall zu sein, aber ich habe ja gar keine Möglichkeit gleichzeitig die If-Schleife zu beenden und die Schleife neu aufzurufen, oder? Denn wenn ich das End if vor das Next setzen würde, wäre das If-End if unsinnig.


MfG,
Dino

bei Antwort benachrichtigen
EDROD Dino30002 „For Next Schleife und End if in VB“
Optionen

du hast in deiner konstruktion 2 mal 'Next zaehler' und nur ein 'For' ... und das mag vb ja anscheinend ned ;)

von der logik her sollte der code hier dem entsprechen was du vorhast:

For zaehler = 2 To TextBoxLineCount(Text1)
    zeile = zeile + 1
    If NOT ( StrCount(TextBoxLine(Text1, zeile), "Begiena:") = 1 ) Then
        [weiterer Code]
    End If
Next zaehler

bei Antwort benachrichtigen
Dino30002 EDROD „du hast in deiner konstruktion 2 mal Next zaehler und nur ein For ... und das...“
Optionen

Jupp, das geht soweit ich sehe :) Vielen Dank

bei Antwort benachrichtigen
Dino30002 Nachtrag zu: „For Next Schleife und End if in VB“
Optionen

Es hat sich leider ein neues Problem ergeben.
Die von dir vorgeschlagene Lösung funktioniert zwar bei einer Bedingung aber nicht bei mehreren, so wie ich das unten einmal versucht habe.

For zaehler = 2 To TextBoxLineCount(Text1)
zeile = zeile + 1
If Not StrCount(TextBoxLine(Text1, zeile), "Begiena:") = 1 Or Not StrCount(TextBoxLine(Text1, zeile), "Verbindung") = 1 Then
[weiterer Code]
End If
Next Zaehler

Bei der Ausführung dieses Codes kriege ich die Fehlermeldung "Ungültiger Prozeduraufruf oder ungültiges Argument" irgendwo bei [weiterer Code].
Der Code in [weiterer Code] wird also ausgeführt falls nur einer der beiden Rückgaben nicht 1 ist. Wie kann ich es verwirklichen, dass der Code nicht ausgeführt wird, wenn eine der Rückgaben 1 ist?
Oder kennt jemand alternativ eine Funktion, die guckt, ob mehrere Wörter in einem Text vorhanden sind und dann, auch wenn nur eines der Wörter gefunden wird, True zurückgibt?

MfG,
Dino

bei Antwort benachrichtigen
Borlander Dino30002 „Neues Problem“
Optionen
Der Code in [weiterer Code] wird also ausgeführt falls nur einer der beiden Rückgaben nicht 1 ist. Wie kann ich es verwirklichen, dass der Code nicht ausgeführt wird, wenn eine der Rückgaben 1 ist?
Oder kennt jemand alternativ eine Funktion, die guckt, ob mehrere Wörter in einem Text vorhanden sind und dann, auch wenn nur eines der Wörter gefunden wird, True zurückgibt?


Dann nimm XOR (exklusives Oder, das entspricht dem im normalen Sprachgebrauch verwendeten Oder) - Verknüpfungstafel:

A | B | A XOR B
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0


Bei der Ausführung dieses Codes kriege ich die Fehlermeldung "Ungültiger Prozeduraufruf oder ungültiges Argument" irgendwo bei [weiterer Code].
Dieser Fehler könnte im weiteren Code enthalten sein, gib doch am besten mal die genaue Zeile an...


CU Borlander
bei Antwort benachrichtigen
Dino30002 Nachtrag zu: „For Next Schleife und End if in VB“
Optionen

So ganz hab ich das Xor noch nicht durchschaut, aber ich glaube das funktioniert nur mit 2 Bedingungen, oder? Ich bräuchte allerdings noch ein paar mehr.

Ich glaube nicht, dass dir diese einzelne Zeile helfen wird zu erkennen warum der Code nicht funktioniert, daher kopiere ich mal die ganze Sub hier rein.

Private Sub Aktualisieren_Click()
Dim filter1 As String
Dim zaehler
Dim zeile As Long
zeile = "0"
If Städte.Text = "Stadt wählen" Then
MsgBox "Bitte Stadt wählen", vbInformation, "Stadt wählen"
GoTo ende
End If
If Preise.Value = False And Menge.Value = False Then
MsgBox "Bitte eine Option aktivieren", vbInformation, "Preis oder Menge?"
ElseIf Preise.Value = True Then
For zaehler = 2 To TextBoxLineCount(Text1)
zeile = zeile + 1
If Not StrCount(TextBoxLine(Text1, zeile), "Verbindung") = 1 Or Not StrCount(TextBoxLine(Text1, zeile), "Verbindung") = 1 Then
filter1 = Filter(TextBoxLine(Text1, zeile), cNumbers & cWhiteSpaces & "$" & "/" & ":")
IniWrite Städte.Text & "Verkaufen", filter1, Mid(TextBoxLine(Text1, zeile), InStrLikeRev(TextBoxLine(Text1, zeile), "/") + 2)
IniWrite Städte.Text & "Ankaufen", filter1, TrimWS(Filter(Replace(TextBoxLine(Text1, zeile), Mid(TextBoxLine(Text1, zeile), InStrLikeRev(TextBoxLine(Text1, zeile), "/")), "a"), cLetters & ":"))
End If
Next zaehler
End If
ende:
End Sub

Sorry dafür, dass der Code nicht eingerückt ist, ich weiß nicht so recht wie da die Regeln sind.

bei Antwort benachrichtigen
Dino30002 Nachtrag zu: „So ganz hab ich das Xor noch nicht durchschaut, aber ich glaube das funktioniert...“
Optionen

Was ich noch vergessen habe: Die beiden Suchbedingungen habe ich nur zu Testzwecken einmal gleich gemacht, normalerweise sollte die erste "Begiena:" enthalten.
Die Zeile in der der Fehler ausgelöst wird ist IniWrite Städte.Text & "Verkaufen"... zeile ist zu diesem Zeitpunkt = 3 und in Zeile 3 der Textbox steht "Begiena:"

bei Antwort benachrichtigen
Borlander Dino30002 „So ganz hab ich das Xor noch nicht durchschaut, aber ich glaube das funktioniert...“
Optionen
So ganz hab ich das Xor noch nicht durchschaut, aber ich glaube das funktioniert nur mit 2 Bedingungen, oder?
Cond1 XOR Cond2 gibt true zurück wenn genau eine der beiden Bedingungen wahr ist, sonst false.
Genau wie bei AND und OR kannst Du auch mehr als zwei Bedingung verwenden: Cond1 XOR Cond2 XOR Cond3, der Ausdruck wird dabei von links ausgewertet also (Cond1 XOR Cond2) XOR Cond3

Ich glaube nicht, dass dir diese einzelne Zeile helfen wird zu erkennen warum der Code nicht funktioniert, daher kopiere ich mal die ganze Sub hier rein.
Hab mit VB sonst eigentlich gar nicht am Hut, bin also mit den Syntaktischen eigenheiten nicht vertraut - wenn Du noch die genaue Fehlerzeile+Meldung postest wäre es viel einfacher das Problem zu finden...

Sorry dafür, dass der Code nicht eingerückt ist, ich weiß nicht so recht wie da die Regeln sind.
So lange Du alleine Programmierst kannst Du den Code nach eigenem Geschmack einrücken, untergeordnete Blöcke (z.B. zwischen FOR..NEXT oder in einem IF-Konstrukt werden i.D.r. 2 Leerzeichen eingerückt, wenn Du dann noch auf GOTOs verzichtest ist der Programmablauf mehr oder weniger deutlich anhand der Einrückungen erkennbar...)


CU Borlander
bei Antwort benachrichtigen
mr.escape Dino30002 „So ganz hab ich das Xor noch nicht durchschaut, aber ich glaube das funktioniert...“
Optionen

Leider ist in VB ein sauberes weitermachen in der schleife nicht so möglich wie in C/C++ (mit continue;) auch wenn das saubere beenden mit "Exit For" geht (vgl. break; in C/C++).

Als nicht ganz sauberen workaround könnte man direkt vor den "Next var" ein "continue:" label setzen und immer mit "Goto continue" einen neuen schleifendurchlauf anstoßen (die labelnamen müssten aber zumindest innerhalb eines Sub eindeutig sein).

Übrigens: das "Goto ende" (und das ende: label) lassen sich durch "Exit Sub" ersetzen.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Borlander mr.escape „Leider ist in VB ein sauberes weitermachen in der schleife nicht so möglich wie...“
Optionen

Statt die Schleife abzubrechen könnte man auch einfach den entsprechenden optionalen Codeblock in ein IF-Konstrukt setzen das auf NOT Abbruchbedingung prüft - ganz ohne wildes umherspringen ;-)

bei Antwort benachrichtigen
mr.escape Borlander „Statt die Schleife abzubrechen könnte man auch einfach den entsprechenden...“
Optionen

Das ist ja auch in der regel der fall. Wenn aber viele unterschiedliche fälle, z.t. erst nach div. vor und zwischenberechnungen den nächsten durchlauf erfordern kommt es gelegentlich mit geschachtelten if blöcken zu monströsen strukturen. Die "continue" anweisung in C/C++ ist ja auch nicht ohne grund vorhanden.
Wäre die syntax in vb z.b. so:

For <var>=<start> to <end> 'den step teil spare ich mir jetzt
Next <var>'vgl. continue;
Exit For <var>'vgl. break;
End For <var>

Wäre es kein problem.

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Dino30002 Nachtrag zu: „For Next Schleife und End if in VB“
Optionen

Danke, ich werds mal mit XOR versuchen.
Das ist eigentlich völlig egal, was die Fehlermeldung ist, denn ich weiß ja woran das liegt. Das liegt ja daran, dass die If Not Schleife etwas durchgelassen hat, das den Normen der danach folgenden Anweisungen überhaupt nicht entspricht.

bei Antwort benachrichtigen
EDROD Dino30002 „For Next Schleife und End if in VB“
Optionen
Wie kann ich es verwirklichen, dass der Code nicht ausgeführt wird, wenn eine der Rückgaben 1 ist?

"eine der rückgaben 1" kannst du mit
bedingung1 OR bedingung2 OR ...
abfragen. da der code bei 1-ergebnis der obigen verknüpfung ja nicht ausgefuehrt werden soll, muss er also ausgeführt werden, wenn das ergebnis der ODER-bedingung NICHT 1 ist:

NOT (bedingung1 OR bedingung2 OR ...)

ps: ich empfehle, für jede bedingung eine bool-variable einzuführen. wird dann (insbesondere bei mehreren bedingungen) viel angenehmer zu lesen.
bei Antwort benachrichtigen
WSH Dino30002 „For Next Schleife und End if in VB“
Optionen

Ohne mir die bisherigen antworten durchzulesen empfehle ich dir follgendes:

For zaehler = 2 To TextBoxLineCount(Text1)
zeile = zeile + 1
If StrCount(TextBoxLine(Text1, zeile), "Begiena:") = 1 Then
exit for 'Next zaehler
End if
[weiterer Code]
Next zaehler

bei Antwort benachrichtigen
mr.escape WSH „Ohne mir die bisherigen antworten durchzulesen empfehle ich dir follgendes: For...“
Optionen
Ohne mir die bisherigen antworten durchzulesen ...
Oha, der meister persönlich!

empfehle ich dir follgendes:
Ahh, doch nicht. Erst mal die frage lesen, verstehen, dann die antworten lesen und dann erst posten (wenn's was neues und sinnvolles ist).

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Dino30002 Nachtrag zu: „For Next Schleife und End if in VB“
Optionen

Leute ihr seid super :)
Nu gehts mit dem Code von edrod:

If Not (bedingung1 OR bedingung2 OR ...)

Die Klammer war anscheinend ausschlaggebend :)

MfG,
Dino

bei Antwort benachrichtigen