Case Select für 1000 Werte?

Hallo
wollte mal fragen, wie man sich verhält, wenn man einen Wert prüfen will ob er 1, 2, 3 usw bis 1000 ist und demnach eine Codeverzweigung durchführen möchte.
Ist da Case Select noch eine Alternative, wenn man 999 x den Wert abfragen muß, ob dies oder dies zutrifft (kostet ja ne Menge Zeilen in VB)

Welche anderen Möglichkeiten gibt es, das ganze geschickt zu umgehen.
Es kann mir auch gleich jmd einen Vorschlag direkt für eine Stringvariable machen, welche den Wert 1-1000 abfrägt.

Besten Dank, Werner

Hallo,

wollte mal fragen, wie man sich verhält, wenn man einen Wert
prüfen will ob er 1, 2, 3 usw bis 1000 ist und demnach eine
Codeverzweigung durchführen möchte.
Ist da Case Select noch eine Alternative, wenn man 999 x den
Wert abfragen muß, ob dies oder dies zutrifft (kostet ja ne
Menge Zeilen in VB)

Das ist so nicht zu beantworten. Du schreibst, daß Du abhängig von Wert verzweigen willst. Zu wie vielen Zielen? Wenn Du auch 1000 Ziele hast, ist das Sinnvoll. Wenn Du nur zwei Ziele hast, z.B. alle geraden Zahlen zu Ziel 1, alle ungeraden Zahlen zu Ziel 2, dann würde ich. …

a=int((b/2)*2)

If a=b Then Ziel1
Else Ziel2
End If

… schreiben.

Welche anderen Möglichkeiten gibt es, das ganze geschickt zu
umgehen.

Du mußt die Bedingung genauer erklären, dann kann man das Problem sicher lösen.

Es kann mir auch gleich jmd einen Vorschlag direkt für eine
Stringvariable machen, welche den Wert 1-1000 abfrägt.

Das verstehe ich nun gar nicht. Was willst Du mit einem String, wenn es um Zahlen geht?

Gruß, Rainer

Hi!

wollte mal fragen, wie man sich verhält, wenn man einen Wert
prüfen will ob er 1, 2, 3 usw bis 1000 ist und demnach eine
Codeverzweigung durchführen möchte.
Ist da Case Select noch eine Alternative, wenn man 999 x den
Wert abfragen muß, ob dies oder dies zutrifft (kostet ja ne
Menge Zeilen in VB)

Welche anderen Möglichkeiten gibt es, das ganze geschickt zu
umgehen.

Verstehe ich das richtig:
In Abhängigkeit eines Wertes mit einem Wertebereich von 1 bis 1000 werden ebenso viele unterschiedliche Verzweigungen (also 1000) ermöglicht?

Ich habe das zwar noch nie mit so vielen Fällen programmiert, aber ich würde den ganzen Case-Konstrukt in Untereinheiten auflösen, allein schon wegen der Übersichtlichkeit:

Der erste Select-Case zerlegt die Variable in 100er-Schritten mittels „Case 1 To 100“, „Case 101 To 200“ usw. In den einzelnen Case-Blöcken wird eine entsprechende SUB aufgerufen. In der SUB wird wieder ein Select-Case-Konstrukt aufgebaut, wo der Wert in Zehnerstufen zerlegt wird. Jedes 10er-Case ruft eine weitere SUB auf, wo jetzt mit Abfrage auf 10 mögliche Werte die eigentliche Verzweigung erfolgt.

Also:

Select Case Wert

Case 1 To 100
SucheEbene0 Wert

Case 101 To 200
SucheEbene1 Wert

Case 201 To 300
SucheEbene2 Wert

[…]

Case 901 To 1000
SucheEbene9 Wert

End Select

Nun in die jeweilige SUB:

SUB SucheEbene0 (Wert)

Select Case Wert

Case 1 To 10
SucheEbene01 Wert

Case 11 To 20
SucheEbene02 Wert

Case 21 To 30
SucheEbene03 Wert

[…]

Case 91 To 100
SucheEbene09 Wert

End Select

END SUB

Jetzt die letzte SUB:

SUB SucheEbene01 (Wert)

Select Case Wert

Case 1
Verzweigung001

Case 2
Verzweigung002

Case 3
Verzweigung003

[…]

Case 10
Verzweigung010

End Select

END SUB

Die Folge dieser Zerlegung: Statt einmal 1000 Elemente zu durchsuchen, werden drei Mal je 10 Elemente durchsucht. Sollte eigentlich ziemlich fix gehen.

Grüße
Heinrich

Klingt interessant
Hallo
das klingt ja schon ganz gut, du argumentierst also so, das man auf diese Weise Zeit sparen würde (was sicher auch stimmt).

Vielleicht sollte ich das nochmals etwas genauer erläutern was ich bräuchte, damit es auch andere verstehen.

Nun genau 1000 Werte werden es sicherlich nicht sein, es ist eher so, das es ein Block aus diesen 1000 Werten ist, welche alle zu dem gleichen Folgecode führen würden.
Also zB.:

wenn der Wert der Variable oder des Strings (ich habe Strings, damit ich flexibler bin) = 50 oder 99 oder 102 oder 103 ist,
dann bedeutet dies, das die Punkte zu dem Horizont x gehören

bei 51, 60, 71, 72, 73 Horizont y

usw.

Von dem her kann ich deine Routine schon verwenden, Sie ändert aber nichts an der Menge des Programmcodes, das ich jeden Fall (und am besten jeden Wert und nicht den Block) einzeln abfragen müsste, oder???

Mfg Werner

Hallo Werner,

wenn der Wert der Variable oder des Strings (ich habe Strings,
damit ich flexibler bin) = 50 oder 99 oder 102 oder 103 ist,
dann bedeutet dies, das die Punkte zu dem Horizont x gehören

bei 51, 60, 71, 72, 73 Horizont y

usw.

nur zwei Ziele? Dann geht’s einfacher.

1.) Du kennst das System, das dahinter steckt und kannst das Ziel berechnen. Darüber hast Du nichts verraten.

2.) Du verwendest wirklich einen String, der alle Werte für eines der beiden Ziele enthält.
Beispiel:

Teststring = „1/2/5/12/23/…“

If Instr(Teststring,Trim(Str(Wert)) Then
'Dein Code
Else
'Dein Code
Endif

Gruß, Rainer

Hi,
vielleicht hilft Dir auch:

Select Case i
Case 1, 2, 4 To 7, 36 (bzw „a“, „t“ pp)
'Du kannst mehrere Werte bzw. Wertgruppen unter einer Caseabfrage zusammenfassen
Tue dieses
Case 3, 8 To 35
Tue jenes
Case Else
Tue etwas anderes
End Select

Gruss
Wilhelm

Moin Moin!

Zu Rainers Variante 2 noch einen Verbesserungsvorschlag:

Der String bekommt das Trennzeichen auch am Anfang und am Ende verpasst, also etwa so: „/1/2/55/628/999/“
dann wird nicht nach „6“, sondern nach „/6/“ gesucht. Dann schlägt die Prüfung nicht bei Übereinstimmung mit einem Teil einer Zahl zu! In meinem Beispiel würde der Wert 6 sonst gefunden werden, obwuhl die Ziffer 6 nur als Teil einer anderen Zahl enthalten ist.

Eine vielleicht auch nicht uninteressante Variante wäre, das jeweilige Ziel als Integerwert in einem 1000-Zellen-Aray zu speichern, das hätte auch einen gewissen Charme:

if Ziele(clng(Wert)) = Ziel1 Then
Tu was
else
Tu was Anderes
end if

Gruß aus Elmshorn

Sven

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

(…)prüfen will ob er 1, 2, 3 usw bis 1000 ist und demnach eine
Codeverzweigung durchführen möchte.

Hallo Werner,

ich bin in VB nicht mehr so ganz fit, aber es sollte so funktionieren:

On i GOTO (oder GOSUB) str$(i)

Und die Sprungziele mit den Anweisungen sind dann (wie in der guten alten BASIC-Zeit) Zeilen-Nummern.

Schoungen Jrooß ousser Eefel,
Markus Onlein aus Offlein

Uablubb! Brrrrrrr!!! *schudder* fowT

On i GOTO (oder GOSUB) str$(i)

Und die Sprungziele mit den Anweisungen sind dann (wie in der
guten alten BASIC-Zeit) Zeilen-Nummern.

Und wenn wir diesen Code (mit 1000 Sprungzielen) verstanden haben, sind wir auch in der Lage, uns die Skischuhe mit gekochten Spaghetti zu binden …

Also „ON … GOTO [hell]“ ist so ziemlich das Unstrukturierteste, Unübersichtlichste, Unhygienischste und überhaupt Un, wo gibt. In VB(A) kommt man leider wegen der *#%$§ Fehlerbehandlung nicht drum herum … aber ansonsten hätte ein Azubi oder Mitarbeiter von mir, der mir so etwas andrehen wollte, mit Rumsmurmelmützenverweis zu rechnen.

Zum Ursprungsproblem : Wenn sich die verschiedenen Werte irgendwie clustern lassen, bietet sich eine Boole- Variable (bei 2 Sprungzielen) oder eine binäre Entscheidungstabelle (bei mehr Zielen) an. So ab 20 verschiedenen Kategorien aufwärts wird das allerdings auch äußerst bluna.

Ein Programmobjekt mit 1000 verschiedenen Eigenschaften auszurüsten, kann ich mir für die Praxis aber auch nicht denken.

Jedenfalls ist es nicht zu umgehen, wenn es sich tatsächlich um unterschiedliche Eigenschaften handelt, diese auch getrennt abzuarbeiten, i.e., anzuspringen.

Gruß kw

Witzbrett?
Hallo Markus,

On i GOTO (oder GOSUB) str$(i)

falsches Brett, Witze bitte weiter unten. :wink:
Aber OK, der war gut. Nun aber bitte ernstahfte Vorschläge, ja?

Gruß, Rainer

falsches Brett, Witze bitte weiter unten. :wink:

Hallo Rainer,

…zu spät, ich kann meine Antwort nicht mehr löschen, und so würde es ein Doppelposting, was hier noch weit schlimmer geahndet wird als eine schlechte Idee.

Von diesen 2 Übeln nehme ich das geringere: stelle mich in die Ecke und schäme mich eine Runde :wink:

Schounge Jrooß ousser Eefel,
Markus Onlein aus Offlein

Variante String
Hallo
ich habe den Witz natürlcih nicht verstanden, weil ich den Code nicht verstanden habe *grummel*

Die Variante String von Rainer und Sven( mit 1 10 100…) mit Abfrage reicht mir eigentlich aus um die Werte abzufragen.
Über eine Abfrage in 10er Schritten um die Schleife zu reduzieren muß ich noch nachdenken.

Im Moment ist mein Progrämmchen so OK, mein Wissen schon um 1000% gestiegen.

Dankeschön

Hallo Werner,

ich habe den Witz natürlcih nicht verstanden …

den Befehl ‚Goto‘ verwendet man nur, wenn ‚On Error‘ davor steht. :wink:
Sonst wird das Programm davon unübersichtlich.
(Fällt Dir dabei etwas auf? Ich konnte Deinen Code nicht so richtig verstehen … :wink:)
‚Gosub‘ braucht man gar nicht, dafür kann man ja Prozeduren einfügen.

Gosub und Goto ohne Not zu verwenden ist schlechter Programmierstil.

Gruß, Rainer