PDA

Vollständige Version anzeigen : numerischen Teil aus Textfeld lesen


Anne Berg
23.03.2006, 09:31
Hallo ihr Lieben.

Mit der Suche habe ich leider keinen Erfolg, bin aber sicher, dass diese Frage so neu nicht ist:

Gibt es eine einfache Methode, wie ich den numerischen Teil aus einem Textfeld auslesen/extrahieren kann? Die Val-Funktion greift ja nur, wenn der Inhalt mit Ziffern beginnt, bei mir stehen sie jedoch am Ende.

Ich freue mich auf eure Vorschläge (und hoffe, die Lösung ist nicht zu trivial... :rolleyes: )

Lia
23.03.2006, 09:49
Man könnte die Zeichen einzeln von Anfang bis Ende durchgehen und prüfen (evtl. select case), ob es eine Ziffer ist. Es gibt ja nur 10.

Je nach dem, was man braucht, könnte man sich die Ausgabe dementsprechend erstellen.

Edit: habe momentan keine Zeit, es selbst zu schreiben. Aber das dürfte für dich ein leichtes sein. :)

Locutus
23.03.2006, 09:49
Hi Anne,

Folgende Funktion habe ich mal vor längerem geschrieben, sie macht im Prinzip das Gewünschte
Function ZahlwertAusString(zeichenfolge As String) As Double
'=============================================================================== ===================================================================
' Funktion: ZahlwertAusString
' Zweck: Extrahiert aus einem komplexen String aus Zahlen und anderen Zeichen
' den Zahlwert. Bei mehreren Zahlwerten wird nur der erste zurückgegeben
' Argumente: String mit Zahlwert(en)
' Aufrufe: Nulltozero
' Rückgabe: Zahlwert als Double, sonst 0
'------------------------------------------------------------------------------------------
On Error GoTo ZahlwertAusString_Err

Dim Zeichen As String, Zahlstring As String
Dim I As Integer, AsciiWert As Integer, gefunden As Integer

For I = 1 To Len(zeichenfolge)
Zeichen = Mid(zeichenfolge, I, 1) 'Ein Zeichen aus dem String auslesen
AsciiWert = Asc(Zeichen) 'Welchen Ascii-Wert hat das zeichen?
If AsciiWert >= 48 And AsciiWert <= 57 Or AsciiWert = 44 Then 'Ist es eine Zahl oder ein Komma?
Zahlstring = Zahlstring & Zeichen 'Wenns eine Zahl oder ein KOmma war, dranhängen
gefunden = True
Else
If gefunden = True Then Exit For 'Verläßt die Schleife nach dem Ende des Zahlstrings
End If
Next

If Len(Zahlstring) > 0 And IsNumeric(Zahlstring) Then
ZahlwertAusString = CDbl(Zahlstring) 'Zahlstring in Double-Zahl konvertieren
Else
ZahlwertAusString = 0 'Wenn keine Zahl enthalten, dann 0
End If

ZahlwertAusString_Exit:
Exit Function

ZahlwertAusString_Err:
MsgBox "Fehler in Funktion ZahlwertAusString" & vbLf & "Fehlercode: " & Err.Number & vbLf & "Beschreibung: " & Err.Description
Resume ZahlwertAusString_Exit

End Function

Gruß Jörn

Großer Meister
23.03.2006, 09:49
also habe es nicht einfacher hinbekommen:
dim teststring as string, numerisch as string, Zeichen as string
testString = me.textfeld

for i = 1 to len(teststring)
Zeichen = mid(teststring,i,1)
if isnumeric(Zeichen) then numerisch=numerisch & Zeichen
next

ups, ok vorausgesetzt du hast keine kommazahlen. Aber dafür gibt es ja auch schon eine Antwort.

TommyK
23.03.2006, 09:54
Hallo Anne,

schau mal hier: Nur Zahlen aus einem String ermitteln (http://access-beispiele.tommyk-webbox.de/code/code_string.htm#string_monoz)

Lia
23.03.2006, 09:55
@Locutus

"Asc(Zeichen)" => DAS hätte ich auch mal gebraucht. Danke.

@Großer Meister

Genau sowas hab ich gemeint. Hätte es nur nicht so kurz hinbekommen. ;)

Anne Berg
23.03.2006, 10:04
Herzlichen Dank für die zahlreiche Beteiligung!

Die Funktion von Jörn ist komfortabel, aber mir genügt die "kleine Lösung" von Markus (bzw. angedacht von Julia), wobei natürlich der Code von Tommy mal wieder nicht zu toppen ist! :top:

Nochmals Danke! :hands:

Sascha Trowitzsch
23.03.2006, 11:10
Falls es auf Performance ankäme und die Zahlen wirklich ausschließlich am Ende der Strings stehen, dann sähe der Code IMHO so aus:
Function ExtractNumber(sIn As String) As Variant
Dim L As Long, i As Long
L = Len(sIn)
For i = 1 To L
If IsNumeric( Mid$ ( sIn, i, 1)) Then Exit For
Next i
ExtractNumber = Mid( sIn, i)
End Function
Falls die Strings ziemlich lang sind, dann so:
Function ExtractNumber(sIn As String) As Variant
Dim L As Long, i As Long
L = Len(sIn)
For i = L To 1 Step -1
If Not IsNumeric( Mid$ ( sIn, i, 1)) Then Exit For
Next i
ExtractNumber = Mid( sIn, i + 1)
End Function

Ciao, Sascha

Anne Berg
23.03.2006, 12:13
Danke auch dir, Sascha.
Unter der Voraussetzung, dass die Zahl am Ende steht, würde ich Methode-2 bevorzugen. Macht irgendwie mehr Sinn. ;)

Anne Berg
23.03.2006, 12:21
Damit mein "PS" auch jeder mitkriegt, hier noch einmal:


PS:
Ich hatte ursprünglich gedacht, es gäbe vielleicht eine eingebaute Funktion (in Anlehnung an InStrRev etc.), die ich nicht kannte....

Nun bin ich selbst drauf gekommen: ?strReverse(Val(strReverse("txt123"))) bringt das gewünschte Ergebnis. :idee:

Arne Dieckmann
23.03.2006, 12:23
Ich hab gedacht, dass es StrReverse nicht unter A97 gibt - deshalb hatte ich das nicht vorgeschlagen. Oder verwendest du den Ersatz von VBA Tipp: Access 2000 String-Funktionen in Access 97 nutzen - DBWiki (http://www.dbwiki.de/wiki.php?title=VBA_Tipp:_Access_2000_String-Funktionen_in_Access_97_nutzen)?

Anne Berg
23.03.2006, 12:26
Danke, Arne. ;)
Aber es gibt da auf dbWiki den VBA Tipp: Access 2000 String-Funktionen in Access 97 nutzen und den Code habe ich schon standardmäßig eingesetzt. - Man muss sich nur auskennen in seinen Tools! :D

Ja, genau. Da war ich wohl zu schnell mit dem Lesen...

Arne Dieckmann
23.03.2006, 12:29
Hab ich es doch geahnt (s. oben) - der grüne Teil deiner Signatur gilt auch für mich. ;)


Nun bin ich darauf reingefallen. :D

Anne Berg
23.03.2006, 12:37
Bleibt nur noch zu hoffen, dass dieser Thread denn auch gefunden wird, wenn das Thema nochmal aufkommt. Da mag sich dann jeder die für seinen Fall geeignete Lösung aus den verschiedenen Vorschlägen heraussuchen. :)

Sascha Trowitzsch
23.03.2006, 12:42
Vielleicht sollte man noch drauf hinweisen, dass alle Codes hier nur für GANZZAHLEN funktionieren!
(Und außerdem, dass die Sache mit StrReverse + A97-Ersatz unter Performancegesichtspunkten wieder nicht ganz optimal ist... ;) )

Ciao, Sascha

Anne Berg
23.03.2006, 12:53
Ganzzahlen: nicht ganz, bei Jörn "Locutus" werden auch Dezimalzahlen erkannt.

Und Performance: ich setze so etwas ja nicht in der Massenverarbeitung ein, lediglich bei Auswertung des aktuellen Datensatzes...

Großer Meister
23.03.2006, 14:24
nicht ganz, bei Jörn "Locutus" werden auch Dezimalzahlen erkannt.
was ist aber wenn es um so einen String geht:
'abc,def123'?
Dann hat das Komma u.U. nichts mit der 123 zu tun. Man müsste da sicherlich von Fall zu Fall noch unterscheiden.

Anne Berg
23.03.2006, 14:28
Hast du das Beispiel mal mit Jörns Prozedur getestet? :p

Oder hättest du in dem Fall gerne "0,123" als Ergebnis? (das wäre wirklich nicht sinnvoll)

Locutus
23.03.2006, 14:44
Ich habe es selbst mal mit "abc,def123'" getestet und die Funktion verhält sich da ziemlich salomonisch: Das Komma wird ins Visier genommen, es gibt keine Vorkomma-Stelle, keine (unmittelbar folgende) Nachkommastelle, also liefert die Funktion 0 zurück. Irgendwie auch unbefriedigend... Ich denke, man muß wirklich abschätzen, was als Input so ankommt und danach die Funktion wählen/umbauen.
Ich brauchte meine Version damals übrigens, um Strings der Art "blablabla 10,35 €" auszuwerten.

Anne Berg
23.03.2006, 14:59
Interessant, so hatte ich das nicht getestet. Aber das müsste sich doch noch nachbesssern lassen. Sobald vor oder nach dem Komma eine Ziffer steht, kommt ein gescheites Ergebnis heraus!