Was ist an diesem Code falsch?

Hallo zusammen,

bei folgendem Code wird immer 1 ausgegeben, egal ob OptionButton1 an oder aus ist.

Was ist falsch?

THX

Sub TEST()

If Sheets(„Verträge im Überblick LV,RV,BU“).Zweite_LV_Tabelle_einblenden.Value = True _
And Sheets(„Einstieg“).OptionButton4.Value = True Or Sheets(„Einstieg“).OptionButton3.Value = True _
And Sheets(„Einstieg“).OptionButton2.Value = True Then

MsgBox („1“)

Else
If Sheets(„Verträge im Überblick LV,RV,BU“).Zweite_LV_Tabelle_einblenden.Value = True _
And Sheets(„Einstieg“).OptionButton4.Value = True Or Sheets(„Einstieg“).OptionButton3.Value = True _
And Sheets(„Einstieg“).OptionButton1.Value = True Then

MsgBox („2“)
End If
End If
End Sub

Hallo,

bei folgendem Code wird immer 1 ausgegeben, egal ob
OptionButton1 an oder aus ist.

zuerst wir jeweils geprüft, ob OptioButton4 = True ist, wenn nein, wird gar nichts ausgegeben, wenn ja, wird 1 ausgegeben. Wenn ‚4‘ gefunden wurde, werden die anderen Button gar nicht mehr geprüft, die Bedingung ist ja schon erfüllt.

Einen Tipp, was Du ändern sollst habe ich nicht, ich kann Deiner Beschreibung nicht entnehmen, was Du vor hast.

Gruß, Rainer

Hallo und danke für die Antwort,

ich will eine Exceltabelle mit verschiedenen Modi erstellen. Je nach Modus soll das Inhaltsverzeichnis angepasst werden, weshalb die Prüfung der OptionButtons durchgeführt werden soll.

Wie muss ich das umprogrammieren, denn eigentlich ging ich davon aus, dass alle AND-Verknüpfungen überprüft werden?

THX

Hallo,

mach mal eine Tabelle. :smile: Etwa so:

4 = true
3 = true
2 = true
1 = false

-> 1

4 = true
3 = true
2 = false
1 = true

-> 2

4 = false
1, 2 und 3 sind dann egal
-> 0

… ich weiß immer noch nicht, wann Du welches Ergebnis möchtest, ich verstehe bisher nicht mehr als der Computer.

Gruß, Rainer

Ich weiss zwar auch nicht, was du vor hast, aber normalerweise sollte die Fallunterscheidung in etwa so aussehen:

With Sheets("Einstieg")
 If .OptionButton1 then
 MsgBox "Fall 1" 
 ElseIf .OptionButton2 then
 MsgBox "Fall 2" 
 ElseIf .OptionButton3 then
 MsgBox "Fall 3" 
 ElseIf .OptionButton4 then
 MsgBox "Fall 4" 
 End if
end with

Gruß aus dem Norden
Reinhard Kraasch

(http://www.dbwiki.de - das Datenbank-Wiki)

Hallo,

ich versuche es dann mal mit raten. Meinst Du eventuell …

Sub TEST()
 If (Sheets("Verträge im Überblick LV,RV,BU").Zweite\_LV\_Tabelle\_einblenden.Value = True \_
 And Sheets("Einstieg").OptionButton4.Value = True) Or \_
 (Sheets("Einstieg").OptionButton3.Value = True \_
 And Sheets("Einstieg").OptionButton2.Value = True) Then
 MsgBox "1"
 ElseIf Sheets("Einstieg").OptionButton3.Value = True \_
 And Sheets("Einstieg").OptionButton1.Value = True Then
 MsgBox "2"
 End If
End Sub

???

Gruß, Rainer

bei folgendem Code wird immer 1 ausgegeben, egal ob
OptionButton1 an oder aus ist.
Was ist falsch?

Hi Alex,

OptionButton1 wird nicht geprüft bei der Entscheidung für die „1“, von daher isses für die „1“ egal ob er on oder off ist.

Gruß
Reinhard

Wenn ‚4‘ gefunden wurde, werden die anderen Button gar nicht
mehr geprüft, die Bedingung ist ja schon erfüllt.

Hallo Rainer,

leider ein deutliches Nein für Excel-Vba.

Lange „AND“-Abfragen( genauso OR) machen den Code langsam, denn es werden ALLE Bedingungen überprüft, völlig egal ob gleich am Anfang eine Bedingung erfüllt ist.

Sub TEST()
If 1 = 1 Or (2 = 2 Or 3 = 3 Or 4 = 4 Or 5 = 5 Or 6 = 6 Or 7 = 7 Or 8 = 8 Or 9 = 9 Or 10 = 10 Or 1 / 0) Then MsgBox „Hello world“
End Sub

Schneller ist dann die meistens zutreffende Bedingung (naja, wer weiß schon was der User so anklickt) am Anfang abprüfen, dann mit ElseIf die anderen Bedingungen nacheinander in einzelnen Zeilen.

Aus reinen Schnelligkeitsgründen kann es dann im Einzelfall sogar zu sowas führen:

If 1=1 then Goto Weiter:
If 2=2 then Goto Weiter:
If 3=3 then Goto Weiter:

Gruß
Reinhard

Hallo Reinhard,

leider ein deutliches Nein für Excel-Vba.

ohh, damit habe ich nicht gerechnet.

Lange „AND“-Abfragen( genauso OR) machen den Code langsam,
denn es werden ALLE Bedingungen überprüft, völlig egal ob
gleich am Anfang eine Bedingung erfüllt ist.

Sub TEST()
If 1 = 1 Or (2 = 2 Or 3 = 3 Or 4 = 4 Or 5 = 5 Or 6 = 6 Or 7 =
7 Or 8 = 8 Or 9 = 9 Or 10 = 10 Or 1 / 0) Then MsgBox „Hello
world“
End Sub

Du hast Recht, VB6 steigt auch aus. :frowning:

Schneller ist dann die meistens zutreffende Bedingung (naja,
wer weiß schon was der User so anklickt) am Anfang abprüfen,
dann mit ElseIf die anderen Bedingungen nacheinander in
einzelnen Zeilen.

Aus reinen Schnelligkeitsgründen kann es dann im
Einzelfall sogar zu sowas führen:

If 1=1 then Goto Weiter:
If 2=2 then Goto Weiter:
If 3=3 then Goto Weiter:

Da wäre dann Select Case angesagt. :smile: Und … Goto??? … Das ist nicht Dein Ernst. Schreibe bitte so etwas nicht, nachher macht das noch Jemand. :frowning:

Gruß, Rainer

OptionButton1 wird nicht geprüft bei der Entscheidung für die
„1“, von daher isses für die „1“ egal ob er on oder off ist.

Gruß
Reinhard

Hallo und danke für Eure Antworten,

jetzt ist mir das klar. Durch die Or-Verknüpfung muss nur der erste Teil der Bedingung gebprüft werden. Wenn der positiv ist, interessiert der Rest nicht mehr.

Danke.

Hallo Rainer,

Sub TEST()
If 1 = 1 Or (2 = 2 Or 3 = 3 Or 4 = 4 Or 5 = 5 Or 6 = 6 Or 7 =
7 Or 8 = 8 Or 9 = 9 Or 10 = 10 Or 1 / 0) Then MsgBox „Hello
world“
End Sub

Du hast Recht, VB6 steigt auch aus. :frowning:

aha, dachte ich mir, wußte es aber nicht. Und das in Vba die komplette zeile Bedingungsunabhängig überprüft wird weiß ich erst seit kurzem beim Durchblättern des u.g. Buches.

Aus reinen Schnelligkeitsgründen kann es dann im
Einzelfall sogar zu sowas führen:

If 1=1 then Goto Weiter:
If 2=2 then Goto Weiter:
If 3=3 then Goto Weiter:

Da wäre dann Select Case angesagt. :smile: Und … Goto??? … Das
ist nicht Dein Ernst. Schreibe bitte so etwas nicht, nachher
macht das noch Jemand. :frowning:

Sage das bitte dem da: http://michael-schwimmer.de/ :smile:

In seinem einen Buch „Excel Vba“ fand ich das unter Tuningstipps.
In allen seinen sonstigen Codes steht „Goto“ einzig bei On Error Goto *gg*

Ist schon klar, daß „Goto“ den Code unübersichtlich macht, aber in bestimmten Ausnahmefällen wo es schlichtweg hauptsächlich um Zeit geht nimmt man halt dann doch „Goto“.

Übrigens, er hat da u.A. auch „Select case“ und „IF…ElseIf“ verglichen. Fazit (rein auf die Zeit bezogen,nicht auf Übersicht u.ä.), „Select Case“ ist maximal genauso schnell wie „If–ElseIf“, im Normalfall langsamer.

Natürlich kann man in beiden Fällen durch geschickte Wahl der Reihenfolge der Bedingungen auch die Zeit minimieren.

Gruß und schönes WE für dich
Reinhard

Gruß, Rainer

Hallo Reinhard,

aha, dachte ich mir, wußte es aber nicht. Und das in Vba die
komplette zeile Bedingungsunabhängig überprüft wird weiß ich
erst seit kurzem beim Durchblättern des u.g. Buches.

ich weiß es jetzt. :smile:

Ist schon klar, daß „Goto“ den Code unübersichtlich macht,
aber in bestimmten Ausnahmefällen wo es schlichtweg
hauptsächlich um Zeit geht nimmt man halt dann doch „Goto“.

Ne. Selbst, wenn das Zeit kostet. Goto schreibe ich nur mit On Error. :smile: Wenn es ganz schnell werden soll, wende ich mich an Semjon und bitte um Hilfe per Assembler. Schneller als Assembler-Code geht nicht. :smile:

Übrigens, er hat da u.A. auch „Select case“ und „IF…ElseIf“
verglichen. Fazit (rein auf die Zeit bezogen,nicht auf
Übersicht u.ä.), „Select Case“ ist maximal genauso schnell wie
„If–ElseIf“, im Normalfall langsamer.

Aha, das ist mir auch neu. Aber die Schreibweise ist so schön übersichtlich … :smile:

Natürlich kann man in beiden Fällen durch geschickte Wahl der
Reihenfolge der Bedingungen auch die Zeit minimieren.

Gruß und schönes WE für dich

Danke gleichfalls! :smile:

Gruß, Rainer

Hallo Fragewurm,

jetzt ist mir das klar. Durch die Or-Verknüpfung muss nur der
erste Teil der Bedingung gebprüft werden. Wenn der positiv
ist, interessiert der Rest nicht mehr.

Das generell so nicht !!

Bei C ist das der Fall, dort wird abgebrochen, wenn das Resultat klar ist.

Bei BASIC, insbesondere VB werden immer ALLE Terme ausgewertet.

MfG Peter(TOO)

Hallo Antwortenkönig,

und wie ist das bei VBA?

MfG

Alex

Probier’s doch selber aus:

Public Function TesteMich()
If MsgBox("Ja oder Nein?", vbYesNo + vbQuestion) = vbYes \_
 Or MsgBox("Nochmal: Ja oder Nein?", vbYesNo + vbQuestion) = vbYes Then
 MsgBox "Ja!"
Else
 MsgBox "Nein..."
End If
End Function

Gruß aus dem Norden
Reinhard Kraasch

Danke für Eure Hilfe!
oT