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
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 wieif 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.
Gruß Rainer
… aber ich lasse meine Antwort trotzdem stehen.
Hallo Rainer,
vllt. solltest du sie doch verändern
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
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! 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 wieif 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 …
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 SelectDas 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. 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.
Gruß
Reinhard
Sorry, erst jetzt habe ich verstanden…
Hallo Alex,
… was genau du mit Select Case meintest
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
Unter Net, würde ich das aber wiederum ganz anders lösen. Was xmal schneller ist
Return (From vRet In x Where vRet = y).Count \> 0
Wobei hier X das Array ist und Y der gesuchte Wert
Wie du siehst kommt hier das SQL Schema zu tragen. Unter .Net nennt sich die Technologie LinQ
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
Sub test()
MsgBox inMenge(6, „1,2,6,7,16“)
End SubFunction 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 FunctionAber 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 übergibstNö, nicht wenn Split verbessert wurde.
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
Hi Alex,
Hallo Rainer,
warum macht ihr es denn euch immer so kompliziert?
frag doch mal etwas leichteres …
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 SelectDas 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 selectJa. Genau so. Das war wohl doch nichts für die Mittagspause.
Mittagspause ? Hast du denn etwa nur 5 Minuten Pause
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
Genauso wie das beruehmte IIF
-) Sorry.
Gruß Rainer
MfG Alex
Hallo Alex,
Hallo Reinhard,
… was genau du mit Select Case meintest
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
Gruß
Reinhard
MfG Alex
Hi Alex,
frag doch mal etwas leichteres …
Wird es morgen schneien ? *gg*
hier nicht, es regnet.
Ja. Genau so. Das war wohl doch nichts für die Mittagspause.
Mittagspause ? Hast du denn etwa nur 5 Minuten Pause
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
Genauso wie das beruehmte IIF
Genau. 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