If... then mit Mengen

Hallo,

ich möchte überprüfen, ob der Wert einer integer-Variablen in einer Menge enthalten ist. so etwa wie

if varA in {1,2,3,6,9} then …

Wie definiert man in VB solche Mengen?

Vielen Dank,
Jan

ich möchte überprüfen, ob der Wert einer integer-Variablen in
einer Menge enthalten ist. so etwa wie
if varA in {1,2,3,6,9} then …
Wie definiert man in VB solche Mengen?

Hallo Jan,

vielleicht so:

Sub tt()
Dim varA, Satz As String
varA = 6
Satz = "1,2,3,6,9"
If Left(Satz, 1) "," Then Satz = "," & Satz
If Right(Satz, 1) "," Then Satz = Satz & ","
If InStr(Satz, "," & varA & ",") Then
 MsgBox varA & " ist vorhanden"
End If
End Sub

Gruß
Reinhard

Hallo,

ich möchte überprüfen, ob der Wert einer integer-Variablen in
einer Menge enthalten ist. so etwa wie

if varA in {1,2,3,6,9} then …

Wie definiert man in VB solche Mengen?

das würde ich mit Strings erledigen.

Option Explicit

Private Sub Test()
 Dim Q As String, W As String, a As Long
 Q = "1,2,3,6,9"
 a = 6
 W = CStr(a)
 If InStr(Q, W) Then
 MsgBox "Ja, " & W & " ist Teil der geprüften Menge"
 Else
 MsgBox "Nein, " & W & " ist nicht Teil der geprüften Menge"
 End If
End Sub

Gruß Rainer

Du warst mal wieder schneller …
Hallo Reinhard,

… aber ich lasse meine Antwort trotzdem stehen. :smile:

Gruß Rainer

… aber ich lasse meine Antwort trotzdem stehen. :smile:

Hallo Rainer,

vllt. solltest du sie doch verändern :smile:

Aus diesem Grund (Restcode bleibt gleich):

Q = „1,2,3,5,9,16“

Ich dachte erst an Split, aber dann bräuchte ich eine Schleife.

Gruß
Reinhard

Hallo Reinhard,

vllt. solltest du sie doch verändern :smile:

Aus diesem Grund (Restcode bleibt gleich):

Q = „1,2,3,5,9,16“

Ich dachte erst an Split, aber dann bräuchte ich eine
Schleife.

eben. wozu splitten? Der String soll doch nur durchsucht werden und damit das klappt muss ein Zeichen zwischen den Zahlen stehen.

Q = „1 23 4 6“

Die 23 soll ja auch gefunden werden.
Ob da nun ein Leerzeichen, ein Komma oder etwas anderes steht ist egal, die Zahlen müssen nur getrennt sein.

Was gefällt Dir an …
Q = „1,2,3,5,9,16“
… nicht?

Gruß Rainer

Was gefällt Dir an …
Q = „1,2,3,5,9,16“
… nicht?

Hallo Rainer,

daß wenn ich nach 6 suche, angezeigt wird daß sie in deem Array steht, da steht sie aber nicht, 16 ist was anderes.

Gruß
Reinhard

Hallo Reinhard,

daß wenn ich nach 6 suche, angezeigt wird daß sie in deem
Array steht, da steht sie aber nicht, 16 ist was anderes.

autsch, Du hast Recht! :smile: Da müsste ich esrt noch führenden Nullen einfügen … Mal sehen, ob der Code dafür gebraucht wird.

Gruß Rainer

Hallo,

Function inMenge(intX As Integer) As Boolean
 Dim intY As Integer, intZahlen() As Variant
 inMenge = False
 intZahlen = Array(1, 2, 3, 6, 9)
 For intY = LBound(intZahlen) To UBound(intZahlen)
 If intZahlen(intY) = intX Then
 inMenge = True
 Exit For
 End If
 Next
End Function

Hallo,

ich möchte überprüfen, ob der Wert einer integer-Variablen in
einer Menge enthalten ist. so etwa wie

if varA in {1,2,3,6,9} then …

if inMenge(varA) then

Wie definiert man in VB solche Mengen?

Vielen Dank,
Jan

Gruß, Bernd

Hallo, kleine Verbesserung:

Function inMenge(intX As Integer, strMenge As String) As Boolean
 Dim intY As Integer, strZahlen() As String
 inMenge = False
 strZahlen = Split(strMenge)
 For intY = LBound(strZahlen) To UBound(strZahlen)
 If strZahlen(intY) = intX Then
 inMenge = True
 Exit For
 End If
 Next
End Function

und Aufruf mit

inMenge(5, "1, 2, 3, 6, 9")

Gruß, Bernd

Hallo Bernd,

das kann nicht klappen *glaub* wegen
strZahlen = Split(strMenge)
da der Split-Standardtrenner das Leerzeichen ist und nicht das Komma.

Gruß
Reinhard

Hallo Bernd,

Hallo, kleine Verbesserung:

Wohl eher eine Verschlechterung :s

Function inMenge(intX As Integer, strMenge As String) As
Boolean
Dim intY As Integer, strZahlen() As String
inMenge = False
strZahlen = Split(strMenge)
For intY = LBound(strZahlen) To UBound(strZahlen)
If strZahlen(intY) = intX Then
inMenge = True
Exit For
End If
Next
End Function

Mal abgesehen davon das das Komma m.E nicht der Standardtrenner von Split ist, ergibt eine Prüfung von einer Zeichenfolge auf eine Zahl definitv immer ein False. In deinem Falle wir die Function niemals ein True liefern.

Aber warum macht ihr euch das immer so kompliziert und greift nicht zu den Bordmitteln? Wenn die Zahlenmenge vorgegeben ist, warum dann nicht via Select Case?

und Aufruf mit

inMenge(5, „1, 2, 3, 6, 9“)

wird definitiv ein False zurueckliefern. Selbst wenn du als erstes Argument eine 3 übergibst

Gruß, Bernd

MfG Alex

Hallo,

warum macht ihr es denn euch immer so kompliziert? String Operationen sind aufwendiger und Bedarf mehr Speicher als Operationen mit Zahlen.

Geht es denn nicht am einfachsten, via

Select Case DerGesuchteWert
 Case 6,15,19,234,77 to 154, etc ...
 'Wert wurde gefunden
 case else
 'Wert wurde nicht gefunden
End Select

Das schöne daran ist, flexibel und schnell geaendert. Übersichtlich etc.
Stelle dir mal vor, eine hat eine Zahlenmenge vorliegen von 143 bis 17798 und 20456 … Wie schaut dann euer Source aus?
Sollten die Daten in einem Array vorliegen so ist die Select Case Abweisung schnell geaendert. Bsp.

Select case InStr(1, vbNullChar & Join(DurchsuchendesArray, vbNullChar) & vbNullChar,vbNullChar & ZuSuchenderWert & vbNullChar)
Case 0
'Wert nicht gefunden
Case Else
'Wert gefunden
End select

MfG Alex

Hi Alex,

warum macht ihr es denn euch immer so kompliziert?

frag doch mal etwas leichteres … :smile:

String
Operationen sind aufwendiger und Bedarf mehr Speicher als
Operationen mit Zahlen.

Geht es denn nicht am einfachsten, via

Select Case DerGesuchteWert
Case 6,15,19,234,77 to 154, etc …
'Wert wurde gefunden
case else
'Wert wurde nicht gefunden
End Select

Das schöne daran ist, flexibel und schnell geaendert.
Übersichtlich etc.
Stelle dir mal vor, eine hat eine Zahlenmenge vorliegen von
143 bis 17798 und 20456 … Wie schaut dann euer Source aus?
Sollten die Daten in einem Array vorliegen so ist die Select
Case Abweisung schnell geaendert. Bsp.

Select case InStr(1, vbNullChar & Join(DurchsuchendesArray,
vbNullChar) & vbNullChar,vbNullChar & ZuSuchenderWert &
vbNullChar)
Case 0
'Wert nicht gefunden
Case Else
'Wert gefunden
End select

Ja. Genau so. Das war wohl doch nichts für die Mittagspause. :smile: Sorry.

Gruß Rainer

Hallo Alex,

Mal abgesehen davon das das Komma m.E nicht der
Standardtrenner von Split ist,

okay.

ergibt eine Prüfung von einer
Zeichenfolge auf eine Zahl definitv immer ein False. In deinem
Falle wir die Function niemals ein True liefern.

Ist das in VB bzw. VB.Net so? in Excel-Vba nicht:

Sub test()
MsgBox inMenge(6, "1,2,6,7,16")
End Sub

Function inMenge(intX As Integer, strMenge As String) As Boolean
 Dim intY As Integer, strZahlen() As String
 inMenge = False
 strZahlen = Split(strMenge, ",")
 For intY = LBound(strZahlen) To UBound(strZahlen)
 If strZahlen(intY) = intX Then
 inMenge = True
 Exit For
 End If
 Next
End Function

Aber warum macht ihr euch das immer so kompliziert und greift
nicht zu den Bordmitteln? Wenn die Zahlenmenge vorgegeben ist,
warum dann nicht via Select Case?

Ich weiß ja nicht wie groß die Zahlenmenge ist.

und Aufruf mit

inMenge(5, „1, 2, 3, 6, 9“)

wird definitiv ein False zurueckliefern. Selbst wenn du als
erstes Argument eine 3 übergibst

Nö, nicht wenn Split verbessert wurde. :smile:

Gruß
Reinhard

Sorry, erst jetzt habe ich verstanden…
Hallo Alex,

… was genau du mit Select Case meintest :smile:
Ich sah irgendwie eine irre lange Case Abfrage-Reihe vor mir…

Gruß
Reinhard

Hallo Reinhard,

Mal abgesehen davon das das Komma m.E nicht der
Standardtrenner von Split ist,

okay.

ergibt eine Prüfung von einer
Zeichenfolge auf eine Zahl definitv immer ein False. In deinem
Falle wir die Function niemals ein True liefern.

Ist das in VB bzw. VB.Net so? in Excel-Vba nicht:

Autsch, da hatte ich doch echt eine Bildungsluecke *schaem*
Ich habe es gerade in VB6 probiert und es klappt tatsaechlich. Dennoch bleibt es unsauber und nicht Typgerecht!
Unter .NET hast du andere Möglichkeiten.

Ein direkter Vergleich wie oben angeführt, also String=Zahl löst eine Exception aus. Sprich einen Laufzeitfehler!
Dann hast du noch folgende Möglichkeiten

 Private Sub Button1\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 Dim x As String = "3"
 Dim y As Integer = 3 (4)
 'MsgBox("x=y" & x = y)'Exception
 MsgBox("X Contains:" & x.Contains(CStr(y))) 'true, (False)
 MsgBox("String Equals:" & x.Equals(y)) 'False, (False)
 MsgBox("String Compare:" & String.Compare(x, CStr(y))) '0 , (-1)
 End Sub

Hinter den Anweisungen habe ich einen Wert in Klammern geschrieben. Dieser tritt auf wenn y = 4 ist. Wie du erkennen kannst, liefert die Contains Anweisung den richtigen Wert. Aber dort wandelst du halt den Wert in einen String um, und machst nur einen String Vergleich. Bei Equals vergleicht er 2 Werte ( Stringfolgen) Da bekommt er aber mit das es nicht identische Strings sind. Ist ja ne Zahl und nen String. Die Compare Anweisung, entspricht eigentlich der unter VB6 genannten Instr Function. Aber auch dazu muss der Wert in einen String gewandelt werden :frowning:

Unter Net, würde ich das aber wiederum ganz anders lösen. Was xmal schneller ist :wink:

 Return (From vRet In x Where vRet = y).Count \> 0

Wobei hier X das Array ist und Y der gesuchte Wert :wink:
Wie du siehst kommt hier das SQL Schema zu tragen. Unter .Net nennt sich die Technologie LinQ :wink:

Aber was mir auch gerade einfaellt *gg* in .NEt gibt es die Methode Find für Arrays. Das sagt auch alles oder?

Unter .NET sind alles Objekte und da ist vieles einfacher, wenn man es denn erst einmal verstanden hat :wink:

Sub test()
MsgBox inMenge(6, „1,2,6,7,16“)
End Sub

Function inMenge(intX As Integer, strMenge As String) As
Boolean
Dim intY As Integer, strZahlen() As String
inMenge = False
strZahlen = Split(strMenge, „,“)
For intY = LBound(strZahlen) To UBound(strZahlen)
If strZahlen(intY) = intX Then
inMenge = True
Exit For
End If
Next
End Function

Aber warum macht ihr euch das immer so kompliziert und greift
nicht zu den Bordmitteln? Wenn die Zahlenmenge vorgegeben ist,
warum dann nicht via Select Case?

Ich weiß ja nicht wie groß die Zahlenmenge ist.

und Aufruf mit

inMenge(5, „1, 2, 3, 6, 9“)

wird definitiv ein False zurueckliefern. Selbst wenn du als
erstes Argument eine 3 übergibst

Nö, nicht wenn Split verbessert wurde. :smile:

Das stimmt. Aber wie gesagt. Unter VB6 bin ich nun schon eine Weile raus und tue mich da echt ein wenig schwer mittlerweile :s

Gruß
Reinhard

MfG Alex

1 Like

Hi Alex,

Hallo Rainer,

warum macht ihr es denn euch immer so kompliziert?

frag doch mal etwas leichteres … :smile:

Wird es morgen schneien ? *gg*

String
Operationen sind aufwendiger und Bedarf mehr Speicher als
Operationen mit Zahlen.

Geht es denn nicht am einfachsten, via

Select Case DerGesuchteWert
Case 6,15,19,234,77 to 154, etc …
'Wert wurde gefunden
case else
'Wert wurde nicht gefunden
End Select

Das schöne daran ist, flexibel und schnell geaendert.
Übersichtlich etc.
Stelle dir mal vor, eine hat eine Zahlenmenge vorliegen von
143 bis 17798 und 20456 … Wie schaut dann euer Source aus?
Sollten die Daten in einem Array vorliegen so ist die Select
Case Abweisung schnell geaendert. Bsp.

Select case InStr(1, vbNullChar & Join(DurchsuchendesArray,
vbNullChar) & vbNullChar,vbNullChar & ZuSuchenderWert &
vbNullChar)
Case 0
'Wert nicht gefunden
Case Else
'Wert gefunden
End select

Ja. Genau so. Das war wohl doch nichts für die Mittagspause.

Mittagspause ? Hast du denn etwa nur 5 Minuten Pause :wink:
Was ich nicht verstehe, warum setzt ihr nicht Select Case ein ?
Damit kann man echt viel machen, auch wenn es net auf Anhieb so ausschaut :wink:
Genauso wie das beruehmte IIF :smiley:

-) Sorry.

Gruß Rainer

MfG Alex

Hallo Alex,

Hallo Reinhard,

… was genau du mit Select Case meintest :smile:
Ich sah irgendwie eine irre lange Case Abfrage-Reihe vor
mir…

Nein, du kannst hinter den Case … Abfragen, mehreres kombinieren. Dazu evtl. noch eine Abfrage mit Select Case True *ggg* Kannst ne Menge damit machen :wink:

Gruß
Reinhard

MfG Alex

Hi Alex,

frag doch mal etwas leichteres … :smile:

Wird es morgen schneien ? *gg*

hier nicht, es regnet. :smile:

Ja. Genau so. Das war wohl doch nichts für die Mittagspause.

Mittagspause ? Hast du denn etwa nur 5 Minuten Pause :wink:
Was ich nicht verstehe, warum setzt ihr nicht Select Case ein?

Damit kann man echt viel machen, auch wenn es net auf Anhieb
so ausschaut :wink:
Genauso wie das beruehmte IIF :smiley:

Genau. :smile: Das ist das Selbe. Bei mangelndem Training vergisst man es wieder. Ich habe schon länger kein größeres Projekt mit VB erledigt, nur hier mal Fragen beantwortet. Besser kann man nur werden, wenn man an Grenzen stößt und dafür Lösungen suchen und finden muss. Wenn es gar nichts zu tun gibt, gehen Details verloren.

Gruß Rainer