Ein Textfeld durchsuchen

Hallo,

ich möchte gerne ein Textfeld nach einem Stringmuster durchsuchen. Und zwar will ich wissen ob in einem Textfeld eine Kundennummer enthalten ist.

Aufbau der Kundennummer ist z.B. GER.000023 (erst 3 Buchstaben für das Land und dann eine 6-stellige Nummer).

In dem Textfeld kann die Kundennummer an beliebiger Stelle stehen oder auch ganz fehlen.

Hat jemand für mich einen Tipp wie man danach am besten suchen kann.

Danke,
Christian

Hallo,

Benutz doch die Funktion InStr([Text],[zu suchende Zeichenfolge]), die gibt sogar zurück ab dem weivielten zeichen der Text beginnt.

mfg
Raber

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

Aber was sollte man in die „zu suchende Zeichenfolge“ reinschreiben?

Die Kundennummer ist beim Suchen noch unbekannt. Ich will im Prinzip nach einer Zeichenkette suchen, die zuerst 3 Buchstaben, dann einen Punkt und zum Schluß 6 Ziffern besitzt. Erst danach will ich in einer Datenbank nach schauen um welchen Kunden es sich handelt.

Christian

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

Versuch doch mal so

[String2] = Left([String1],".")
[String3] = Right([String1],Len([String1]) - Len([String2]))

Dann hast du einen String wo alles nach dem Punkt steht
und dann könntest du mit

IsInt([String3])

überprüfen ob es sich um eine Zahl handelt :wink:

ich hoffe da gibt es noch eine schönere Version, da die eigentliche Kundennummer komplizierte aufgebaut ist, nämlich

3 Buchstaben . 4 Ziffern . 2 Ziffern . 2 Ziffern . 3 Ziffern

Alles schön mit den Punkten getrennt. Ich habe bei der Lösung so etwas wie unter Linux gedacht. Wenn man dort mit dem Befehl „grep“ arbeiten könnte, wäre das super.

Christian

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

ich hoffe da gibt es noch eine schönere Version, da die
eigentliche Kundennummer komplizierte aufgebaut ist, nämlich

3 Buchstaben . 4 Ziffern . 2 Ziffern . 2 Ziffern . 3 Ziffern

Alles schön mit den Punkten getrennt. Ich habe bei der Lösung
so etwas wie unter Linux gedacht. Wenn man dort mit dem Befehl
„grep“ arbeiten könnte, wäre das super.

Christian

Und du willst die 3 Buchstaben abschneiden, wenn sie vorhanden sind?
Und mit der _eigentlichen_ Kundennummer willst dann in einer Datenbank suchen? Die Nummer ist aber schon in der Datenbank gleich gespeichert oder?

Dann könntest du es ja mal so versuchen:

if IsInt (Left ([String1]),"." -1) = False then
[String2] = Right ([STring1],Len([String1]) - Len (Left([String1],"."))
else
[String2] = [String1]
end if

Nein, ich habe einen String den ich aus der Betreff Zeile von Outlook habe. Jetzt will ich nachschauen ob in diesem String sich irgendwo eine Kundennummer befindet (Die Kundennummer ist alphanumerisch), somit will ich die 3 Buchstaben nicht abschneiden.

Christian

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

Christian

Hallo
Ich sehe keine andere Möglichkeit als den Text nach Bekanntem zu durchsuchen.
Das wäre dieses „GER“ oder diese Punkte.
Dann mußt Du im Programm testen, ob der Text drum herum dem Format einer Kundennummer entspricht.
Sind die Ziffer von verschiedener Länge oder beginnen die Ziffern nicht alle mit „GER“ dann mußt Du mehr Code schreiben, so lange bis es klappt.
Das „ger“ würde es einfach machen, es ginge auch noch mit wenigen weiteren „ABC“ Stellen.
MfG

Hallo Christian,

klingt fast so, als würden hier reguläre Ausdrücke zum Ziel führen.

Zuerst brauchst du ein passendes Objekt hierfür:
Set RegEx = CreateObject(„vbscript.regexp“)

Nun legst du die Suchkriterien fest (3 Grossbuchstaben, ., 5 Ziffern:
RegEx.Pattern = „[A-Z]{3}.[0-9]{5}“

Wenn du nur wissen willst, ob so eine Zeichenkette enthalten ist, reicht dann der Aufruf:
If RegEx.Test(txt_ZuTesten.Text) Then Debug.Print „Ist da“

Gruß
Daniel

Hi!

Nein, ich habe einen String den ich aus der Betreff Zeile von
Outlook habe. Jetzt will ich nachschauen ob in diesem String
sich irgendwo eine Kundennummer befindet (Die Kundennummer ist
alphanumerisch), somit will ich die 3 Buchstaben nicht
abschneiden.

Ich gehe jetzt einfach mal von deinem Ursprungsbeispiel aus (mit dem „GER.000023“):

Zuerst definierst du dir alle notwendigen Variablen. Das sind:

Dim cTextFeld As String
Dim cGesucht As String
Dim cKdNr As String
Dim bGueltig As Boolean
Dim lZaehler As Long
Dim lStart As Long

Dann schiebst du den Inhalt des Textfeldes in die entsprechende Variable:

cTextFeld = Text1.Text

Du definierst dir den Suchbegriff:

cGesucht = „.“

Du ermittelst die Länge des zu durchsuchenden Strings und ziehst davon sechs Stellen ab (Bei einer sechsstelligen Kundennummer kann an z.B. fünfletzter Stelle kein Punkt mehr mit nachfolgender gültiger Kundennummer kommen):

lLenText = Len(cTextFeld) - 6

Du legst den Startwert fest, ab wo die erste Durchsuchung des Strings starten soll (ist immer 1):

lStart = 1

Nun nimmst du eine Schleife (z.B. FOR … NEXT) von Stelle 1 des Strings bis zur letzten gültigen Position, an der ein Punkt erscheinen kann

For lZaehler = 1 To lLenText

Über die INSTR-Funktion suchst du die Position, an der ein Punkt steht und merkst dir diese Position in der Variablen „lPosPunkt“:

lPosPunkt = InStr(lStart, cTextFeld, cGesucht)

Wurde im String ein Punkt gefunden, ist „lPosPunkt“ ungleich 0:

If lPosPunkt > 0 Then

Nun löst du aus dem String die nächsten sechs auf den Punkt folgenden Stellen heraus, beginnend mit der Stelle _nach_ dem Punkt:

cKdNr = Mid$(cTextFeld, lPosPunkt + 1, 6)

Jetzt überprüfst du, ob diese sechs Stellen einen numerischen Wert darstellen (also sechs Ziffern gefunden wurden). Dafür nimmst du die Funktion ISNUMERIC, die dir einen booleschen Wert (True oder False) zurückliefert:

bGueltig = IsNumeric(cKdNr)

Handelt es sich um sechs Ziffern … :

If bGueltig Then

… brichst du die Schleife ab (in der Variablen „cKdNr“ hast du deine gültige Kundennummer):

Exit For

Handelt es sich _nicht_ um sechs Ziffern … :

Else

setzt du den Startwert für die Suche nach dem nächsten Punkt im String auf die Position nach dem gerade gefundenen Punkt:

lStart = lPosPunkt + 1

Ende der IF-Abfrage des booleschen Wertes

End If

Wurde überhaupt kein Punkt im String gefunden … :

Else

… brichst du die Schleife ebenfalls ab. Die Variable „cKdNr“ ist leer:

Exit For

Ende dieser IF-Abfrage

End If

Falls ein Punkt gefunden wurde, aber keine gültige Kundennummer folgte, wird weitergesucht:

Next lZaehler

Und das war’s!

Das Fehler-Handling, die weitere Verarbeitung usw. kannst du gemäß deinen Anforderungen einbauen.

Solltest du den Landercode und den Punkt im Prüfergebnis brauchen, mußt du die vier Stellen von der Kundennummer wieder anfügen.

Hier nochmal der komplette Code ohne Erläuterungen (ist doch eigentlich ganz einfach, oder? :wink: )

Dim cTextFeld As String
Dim cGesucht As String
Dim cKdNr As String
Dim bGueltig As Boolean
Dim lZaehler As Long
Dim lStart As Long

cTextFeld = Text1.Text
cGesucht = „.“
lLenText = Len(cTextFeld) - 6
lStart = 1

For lZaehler = 1 To lLenText
lPosPunkt = InStr(lStart, cTextFeld, cGesucht)
If lPosPunkt > 0 Then
cKdNr = Mid$(cTextFeld, lPosPunkt + 1, 6)
bGueltig = IsNumeric(cKdNr)
If bGueltig Then
Exit For
Else
lStart = lPosPunkt + 1
End If
Else
Exit For
End If
Next lZaehler

Grüße
Heinrich

Hi Daniel,

das sieht auf den ersten Blick schon mal sehr vielversprechend aus, aber kannst du mir dazu bitte noch mehr Informationen geben? Was ist Regex? Wie baue ich mir ein Objekt davon?

Wäre super,

Christian

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

Hallo Heinrich,

danke für deine Mühe, ich bin noch dabei es auszuprobieren.

Christian

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

Hallo Christian,

RegEx steht für Regular Expressions, also Reguläre Ausdrücke. Mit diesen kann man bestimmte Muster definieren denen ein Text entsprechen soll (eben z.B. 3 beliebige Buchstaben, dann 1 Punkt, dann 5 bel. Zahlen).

Die dafür unter VB/VBA benötigte Bibliothek heiss Microsoft VBScrip Regular Expressions (Datei vbscript.dll) und kommt in der Regel spätestens mit der Installation eines halbwegs aktuellen Windows / IE.

Nun wie du das Objekt erstellst siehe 1. Posting, ich hatte nur vorher die Deklaration noch vergessen:
Dim RegEx As Object
Set RegEx = CreateObject(„vbscript.regexp“)

RegEx ist danach dann bereits das gesucht Objekt. Und mit diesem kannst du dann die Suchkriterien festlegen und dann testen lassen, ob der Text diese Kriterien erfüllt.

Gruß
Daniel

Hallo,

ich schlage Dir den „Like“ Operator vor, da dieser schon in VB integriert ist.
Das müsste dann ungefähr so aussehen:

If Textfeld Like „*[A-Z][A-Z][A-Z].######*“ Then
MsgBox „Kundennummer wurde entdeckt!“
End If

Falls es wirklich nur Grossbuchstaben sein dürfen musst Du darauf achten, dass in dem jeweiligen Modul nicht"Option Compare Text" verwendet werden darf. Oder Du schreibst zur Sicherheit „Option Compare Binary“.

Wenn aber in der Gross- und Kleinschreibung nicht unterschieden werden soll, muss in dem jeweiligen Modul „Option Compare Text“ stehen.

Gruss,
Robert