aximand
Goto Top

Select Case wird nicht richtig ausgewertet

Hallo zusammen,

mich plagt etwas. Folgender Code

Select Case intRaster And intLochhoehe
'Raster 20mm  
Case ("20") And ("15"):  
txtAbstandX.Value = 34
'Raster 25mm  
Case ("25") And ("15"):  
txtAbstandX.Value = 42
Case ("25") And ("18"):  
txtAbstandX.Value = 43
Case ("25") And ("19"):  
txtAbstandX.Value = 44
'Raster 35mm  
Case ("35") And ("15"):  
txtAbstandX.Value = 22
Case ("35") And ("18"):  
txtAbstandX.Value = 23
Case ("35") And ("19"):  
txtAbstandX.Value = 24
Case ("35") And ("23"):  
txtAbstandX.Value = 26
Case ("35") And ("25"):  
txtAbstandX.Value = 27

Bis zum Fall "35" AND "18" wird die Textbox auch mit dem richtigen Wert befüllt.

Bei 35,19 würde ich den Wert 24 erwarten, ich bekomme aber eine 22. Ebenso bei 35,23.
Erst das letzte Wertepaar 35,25 zeigt dann die korrekte 27 an.

Ich bin gerade ziemlich verwirrt?!

Content-Key: 364877

Url: https://administrator.de/contentid/364877

Printed on: April 24, 2024 at 06:04 o'clock

Member: emeriks
emeriks Feb 15, 2018 updated at 12:59:41 (UTC)
Goto Top
Hi,
wenn Integer dann auch Integer!
Select Case intRaster And intLochhoehe
  'Raster 20mm  
  Case 20 And 15
    txtAbstandX.Value = 34
  'Raster 25mm  
  Case 25 And 15
    txtAbstandX.Value = 42

..... usw.

end Select

E.
Member: emeriks
emeriks Feb 15, 2018 at 13:01:29 (UTC)
Goto Top
Wobei ich nicht sicher bin, ob das wirklich das ist, was Du suchst.
Ich denke, was du suchst ist:
If intRaster = 20 And intLochhoehe = 15 Then
  'Raster 20mm  
  txtAbstandX.Value = 34
ElseIf intRaster = 25 And intLochhoehe = 15 Then
  'Raster 25mm  
  txtAbstandX.Value = 42
ElseIf ...
..... usw.

end If
Member: Aximand
Aximand Feb 15, 2018 at 13:14:05 (UTC)
Goto Top
Hallo, nein, ich wollte das schon ganz bewusst mit Select Case machen, weil es einfacher zu pflegen scheint, bzw. besser visuell im Code darstellbar.

Allerdings nutzt das editieren der Werte nichts:

...
Case 50 And 19:
txtAbstandX.Value = 31
Case 50 And 23:
txtAbstandX.Value = 33
Case 50 And 25:
txtAbstandX.Value = 34
Case 50 And 28:
txtAbstandX.Value = 36
...
Es erscheinen die selben, für mich nicht nachvollziehbaren Fehler
Member: emeriks
Solution emeriks Feb 15, 2018 updated at 13:20:33 (UTC)
Goto Top
Du hast einen Denkfehler. Select Case ist kein Ersatz für If then ElseIf !

Man kann das so machen, wie Du es versuchst, aber dann muss man sicher sein, dass die möglichen Kombinationen der Werte eindeutige Ergebnisse liefern.

Lass Dir doch mal alle Kombinationen anzeigen:
....
Msgbox 50 And 19
Msgbox 50 And 23
Msgbox 50 And 25
Msgbox 50 And 28
....

Wenn die Ergebnisse nicht eindeutig sind, dann kannst Du das so nicht machen.
Member: Aximand
Aximand Feb 15, 2018 at 13:31:09 (UTC)
Goto Top
Also rein Wertepaartechnisch gibt es keine Dubletten, die sind alle eindeutig. Die Werte hatte ich schon mit Msgbox geprüft und stimmten auch. Allerdings will ich jetzt auch nicht auf biegen und brechen irgendwie den Wurm suchen und habe es dann doch eben mit Bedingung erledigt.

Trotzdem danke für die Mühe face-smile
Member: emeriks
emeriks Feb 15, 2018 at 13:37:45 (UTC)
Goto Top
Also rein Wertepaartechnisch gibt es keine Dubletten, die sind alle eindeutig. Die Werte hatte ich schon mit Msgbox geprüft und stimmten auch.
Unwahrscheinlich!
50 And 19 = 18
50 And 23 = 18
50 And 25 = 16
50 And 28 = 16
Allein hier sind schon 2 Dopplungen!
Member: Aximand
Aximand Mar 19, 2018 at 13:40:43 (UTC)
Goto Top
Wo sind denn hier Dopplungen?

Unterschiedliche Terme können doch identische Ergebnisse haben?
Member: emeriks
emeriks Mar 19, 2018 updated at 14:05:19 (UTC)
Goto Top
Case wertet aber die Ergebnisse aus und nicht die Terme!

Es sei:
intRaster = 50
intLochhoehe = 19

"intRaster And intLochhoehe" ergibt jetzt 18
"50 And 19" ergibt 18 --> Case hat Treffer und arbeitet diesen Block ab.
"50 And 23" ergibt auch 18. --> Dieser Block wird aber nicht mehr ausgeführt

Es sei:
intRaster = 50
intLochhoehe = 23

"intRaster And intLochhoehe" ergibt jetzt 18
"50 And 19" ergibt 18 --> Case hat Treffer und arbeitet diesen Block ab.
"50 And 23" ergibt auch 18. --> Dieser Block wird aber nicht mehr ausgeführt

Case führt also nicht den Block von "50 And 23" aus! Jetzt verstanden?
Member: Aximand
Aximand Mar 21, 2018 at 08:04:54 (UTC)
Goto Top
Ich werte doch nicht die 18 aus, sondern

Case 50 and 19
irgendwas = 18
Case 50 and 23
irgendwas = 18

Sprechen wir aneinander vorbei oder hab ich gerade ein Brett vor dem Kopf, was durchaus sein kann. Dann bin ich dankbar für die Einwände und vor allem Infos
Member: emeriks
emeriks Mar 21, 2018 updated at 14:02:59 (UTC)
Goto Top
Ganz eindeutig: Brett. face-wink

Ein letzter Versuch von mir:
...
Select Case intRaster And intLochhoehe 
  Case 50 And 19
...
bedeutet NICHT: "Wenn intRaster gleich 50 und intLochhoehe gleich 19".

Es bedeutet: Im Falle, dass "intRaster And intLochhoehe" das Selbe ergibt wie "50 And 19".
Mit intRaster = 19 und intLochhoehe = 50 ergibt "intRaster And intLochhoehe" aber auch das Selbe wie mit intRaster = 50 und intLochhoehe = 19.
Ich wette aber, was Du abfragen wilst ist: "Wenn intRaster gleich 50 und intLochhoehe gleich 19 ist ...". Und das bekommst Du mit einem "Select Case" (in jedem Fall nur "unsauber") nur unter bestimmten Bedingungen hin. Nämlich dass die Ausgangswerte in Ihren Kombinationen eineindeutig sind.

Edit:
Falls Du doch tatsächlich das Ergebnis der logischen Verknüpfung zweier Integer-Werte auswerten willst, dann hast Du mit "Select Case" das Problem, dass nur ein Case-Block abgearbeitet wird, nämlich der erste mit einem entsprechenden Wert. Und wenn Dir das bekannt sein sollte, dann verstände ich nicht, warum Du dann mehrere Case-Blöcke für das gleiche Ergebnis hast.

Edit 2:
Alternative:
Annahme: intLochhoehe hat ein Maximum von 99 (0-99, 100 Werte).
Dann bist Du mit "intRaster * 100 + intLochhoehe" eindeutig. Also
...
Select Case intRaster *100 + intLochhoehe 
  Case 50 * 100 + 19
...
Sinn und Unsinn mal dahingestellt ...
Member: Aximand
Aximand Mar 21, 2018 at 14:46:56 (UTC)
Goto Top
bedeutet NICHT: "Wenn intRaster gleich 50 und intLochhoehe gleich 19"


OK, danke - der Taler ist gefallen.

Ich dachte Case bezieht sich auf die Parameter, nicht auf das Ergebnis.

Ich prüfe das mal...