Die unabkömmlichen String-Funktionen Left, Right und Mid in neuem Gewand - und was für eines! String sind die mit am häufigsten verwendeten Datentypen in Visual Basic Anwendungen. Und für String-Manipulationen hat uns Microsoft dann auch die entsprechenden Funktionen bereit gestellt: Left, Right und Mid. Diese drei Funktionen bedürfen wahrscheinlich keiner großen Erklärung meinerseits - man sollte sie kennen und beherrschen (na ja, zu beherrschen gibt es da ja nicht viel Die beiden Funktionen Left und Right werden verwendet, um einen Teilstring bestimmter Länge aus einem Gesamtstring zu ermitteln - entweder links oder rechts beginnend. Mit Hilfe der Mid-Funktion hingegen lässt sich ein Teilstring inmitten eines Gesamtstrings ermitteln - und zwar ab einer bestimmten Position und optional mit einer bestimmten Länge. Bei allen drei Funktionen wird die Position bzw. die Länge des zu ermittelnden Teilstrings immer als Zahl angegeben, also: ' ersten 10 Zeichen sTeilstring = Left(sGesamtstring, 10) ' letzten 5 Zeichen sTeilstring = Right(sGesamtstring, 5) ' 5 Zeichen ab Position 3 sTeilstring = Mid(sGesamtstring, 3, 5) Jetzt soll es aber nicht selten vorkommen, dass man die exakte Position des zu ermittelnden Teilstrings gar nicht kennt. Vielmehr möchte man alle Zeichen links beginnend bis zu einem bestimmten Zeichen ermitteln. Enthält z.B. ein String den vollständigen Namen eines Kunden, man braucht aber im Moment nur den Nachnamen, so müsste man also zunächst per InStr-Funktion nach dem ersten Leerzeichen suchen, um dann mittels Left den linken Teilstring zu extrahieren. Dim sName As String sName = "Otter Dieter" ' Nachname ermitteln Dim lPos As Long Dim sNachname As String lPos = InStr(sName, " ") sNachname = Left(sName, lPos - 1) Genauso verhält es sich mit der Mid oder Right-Funktion. Um in unserem Beispiel den Vornamen zu ermitteln, würde man wiederum per InStr nach dem ersten Leerzeichen suchen, um dann mittels Mid den rechten Teilstring zu extrahieren: Dim lPos As Long Dim sVorname As String lPos = InStr(sName, " ") sVorname = Mid(sName, lPos + 1) Sie sehen also, es sind immer mehrere Zeilen Code notwendig - und das x-mal in der VB-Anwendung. LeftStr, MidStr und RightStr Aus diesem Grund habe ich mir gedacht: "Wäre doch ideal, wenn man der Left, Mid und Right-Funktion die gewünschte Position optional auch in Form des gesuchten Zeichens übergeben könnte." Gedacht - gemacht ' LeftStr ersetzt die Left-Funktion ' ' vDelimiter gibt entweder die Position als Zahl an ' oder aber das gesuchte Zeichen, bis zu dem ' der Teilstring zurückgegeben werden soll. ' ' bDelimiter legt fest, ob der Teilstring bis einschl. ' dem ersten Vorkommen des gesuchten Zeichens ' zurückgegeben werden soll (True) oder um ein Zeichen ' gekürzt (False = Standard) Public Function LeftStr(sString As Variant, _ ByVal vDelimiter As Variant, _ Optional ByVal bDelimiter As Boolean = False) As String Dim lPos As Long If VarType(vDelimiter) = vbString Then lPos = InStr(sString, vDelimiter) If Not bDelimiter Then lPos = lPos - 1 If lPos < 1 Then lPos = 0 Else lPos = Val(vDelimiter) End If LeftStr = Left(sString, lPos) End Function ' RightStr ersetzt die Right-Funktion ' ' vDelimiter gibt entweder die Position als Zahl an ' oder aber das gesuchte Zeichen, ab dessen letztes ' Vorkommen der Teilstring zurückgegeben werden soll. ' ' bDelimiter legt fest, ob der Teilstring einschl. ' dem gesuchten Zeichen zurückgegeben werden soll (True) ' oder um ein Zeichen nach rechts versetzt ' (False = Standard) Public Function RightStr(sString As Variant, _ ByVal vDelimiter As Variant, _ Optional ByVal bDelimiter As Boolean = False) As String Dim lPos As Long If VarType(vDelimiter) = vbString Then lPos = InStrRev(sString, vDelimiter) If lPos > 0 Then If Not bDelimiter Then lPos = lPos + 1 RightStr = Mid(sString, lPos) End If Else lPos = Val(vDelimiter) RightStr = Right(sString, lPos) End If End Function ' MidStr ersetzt die Mid-Funktion ' ' vDelimiter1 gibt entweder die Position als Zahl an ' oder aber das gesuchte Zeichen, ab der der Teilstring ' zurückgegeben werden soll. ' ' vDelimiter2 ist optional und bestimmt die Länge des ' Teilstrings, der zurückgegeben werden soll. ' Wird hier ein Zeichen angegeben, so wird der ' Teilstring ab vDelimiter1 und bis zum nächsten ' Vorkommen des in vDelimiter2 angegebenen Zeichens ' ermittelt. ' ' bDelimiter legt fest, ob der Teilstring einschl. ' dem der in vDelimiter1 und vDelimiter2 angegebenen ' Zeichen zurückgegeben werden soll (True) oder um ' je ein Zeichen links und rechts gekürzt (False). Public Function MidStr(sString As Variant, _ ByVal vDelimiter1 As Variant, _ Optional ByVal vDelimiter2 As Variant, _ Optional ByVal bDelimiter As Boolean = False) As String Dim lPos As Long If VarType(vDelimiter1) = vbString Then lPos = InStr(sString, vDelimiter1) If lPos > 0 And Not bDelimiter Then lPos = lPos + 1 Else lPos = Val(vDelimiter1) End If If lPos > 0 Then If IsMissing(vDelimiter2) Then MidStr = Mid(sString, lPos) Else MidStr = LeftStr(Mid(sString, lPos), _ vDelimiter2, bDelimiter) End If End If End Function Um nun bei unserem Eingangs erwähnten Beispiel zu bleiben, würden sich Vorname und Nachname nun folgendermaßen bestimmen lassen: Dim sName As String sName = "Otter Dieter" ' Nachname ermitteln Dim sNachname As String sNachname = LeftStr(sName, " ") ' Vorname ermitteln Dim sVorname As String sVorname = MidStr(sName, " ") Selbstverständlich kann man die neuen Funktionen auch folgendermaßen einsetzen: ' ersten 10 Zeichen sTeilstring = LeftStr(sGesamtstring, 10) ' letzten 5 Zeichen sTeilstring = RightStr(sGesamtstring, 5) ' 5 Zeichen ab Position 3 sTeilstring = MidStr(sGesamtstring, 3, 5) Also alles in allem ein gleichwertiger Ersatz - nur um ein nettes Feature erweitert. Funktion UND Anweisung Aber halt! Die Mid-Funktion gibt es in Visual Basic ja auch noch als Anweisung - und zwar lässt sich hiermit ein Teilstring fester Länge durch einen gleichlangen anderen String ersetzen: Dim sString = "Ich bin hier!" Mid(sString, 5, 3) = "war" ' Ergebnis: Ich war hier! Dieses Feature sollte man nicht unbeachtet lassen - habe ich mir zumindest gedacht. Property heißt die Lösung! Also schnell ans Werk: Aus Function wird Property Get ' LeftStr ersetzt die Left-Funktion ' ' vDelimiter gibt entweder die Position als Zahl an ' oder aber das gesuchte Zeichen, bis zu dem ' der Teilstring zurückgegeben werden soll ' ' bDelimiter legt fest, ob der Teilstring bis einschl. ' dem ersten Vorkommen des gesuchten Zeichens ' zurückgegeben werden soll (True) oder um ein Zeichen ' gekürzt (False = Standard) Public Property Get LeftStr(sString As Variant, _ ByVal vDelimiter As Variant, _ Optional ByVal bDelimiter As Boolean = False) As String Dim lPos As Long If VarType(vDelimiter) = vbString Then lPos = InStr(sString, vDelimiter) If Not bDelimiter Then lPos = lPos - 1 If lPos < 1 Then lPos = 0 Else lPos = Val(vDelimiter) End If LeftStr = Left(sString, lPos) End Property ' RightStr ersetzt die Right-Funktion ' ' vDelimiter gibt entweder die Position als Zahl an ' oder aber das gesuchte Zeichen, ab dessen letztes ' Vorkommen der Teilstring zurückgegeben werden soll. ' ' bDelimiter legt fest, ob der Teilstring einschl. ' dem gesuchten Zeichen zurückgegeben werden soll (True) ' oder um ein Zeichen nach rechts versetzt ' (False = Standard) Public Property Get RightStr(sString As Variant, _ ByVal vDelimiter As Variant, _ Optional ByVal bDelimiter As Boolean = False) As String Dim lPos As Long If VarType(vDelimiter) = vbString Then lPos = InStrRev(sString, vDelimiter) If lPos > 0 Then If Not bDelimiter Then lPos = lPos + 1 RightStr = Mid(sString, lPos) End If Else lPos = Val(vDelimiter) RightStr = Right(sString, lPos) End If End Property ' MidStr ersetzt die Mid-Funktion ' ' vDelimiter1 gibt entweder die Position als Zahl an ' oder aber das gesuchte Zeichen, ab der der Teilstring ' zurückgegeben werden soll. ' ' vDelimiter2 ist optional und bestimmt die Länge des ' Teilstrings, der zurückgegeben werden soll. ' Wird hier ein Zeichen angegeben, so wird der ' Teilstring ab vDelimiter1 und bis zum nächsten ' Vorkommen des in vDelimiter2 angegebenen Zeichens ' ermittelt. ' ' bDelimiter legt fest, ob der Teilstring einschl. ' dem der in vDelimiter1 und vDelimiter2 angegebenen ' Zeichen zurückgegeben werden soll (True) oder um ' je ein Zeichen links und rechts gekürzt (False). Public Property Get MidStr(sString As Variant, _ ByVal vDelimiter1 As Variant, _ Optional ByVal vDelimiter2 As Variant, _ Optional ByVal bDelimiter As Boolean = False) As String Dim lPos As Long If VarType(vDelimiter1) = vbString Then lPos = InStr(sString, vDelimiter1) If lPos > 0 And Not bDelimiter Then lPos = lPos + 1 Else lPos = Val(vDelimiter1) End If If lPos > 0 Then If IsMissing(vDelimiter2) Then MidStr = Mid(sString, lPos) Else MidStr = LeftStr(Mid(sString, lPos), _ vDelimiter2, bDelimiter) End If End If End Property Und hier die gleichnamigen Property Let Prozeduren: ' Beschreibung der Parameter siehe ' "Property Get LeftStr" Public Property Let LeftStr(sString As Variant, _ ByVal vDelimiter As Variant, _ Optional ByVal bDelimiter As Boolean = False, _ ByVal sNewString As String) Dim lPos As Long If VarType(vDelimiter) = vbString Then lPos = InStr(sString, vDelimiter) If Not bDelimiter Then lPos = lPos - 1 If lPos < 1 Then lPos = 0 Else lPos = Val(vDelimiter) End If If lPos > 0 Then sString = sNewString & Mid(sString, lPos + 1) End If End Property ' Beschreibung der Parameter siehe ' "Property Get RightStr" Public Property Let RightStr(sString As Variant, _ ByVal vDelimiter As Variant, _ Optional ByVal bDelimiter As Boolean = False, _ ByVal sNewString As String) Dim lPos As Long If VarType(vDelimiter) = vbString Then lPos = InStrRev(sString, vDelimiter) If lPos > 0 Then If Not bDelimiter Then lPos = lPos + 1 sString = Left(sString, lPos - 1) & sNewString End If Else lPos = Val(vDelimiter) sString = Left(sString, Len(sString) - lPos) & _ sNewString End If End Property ' Beschreibung der Parameter siehe ' "Property Get MidStr" Public Property Let MidStr(sString As Variant, _ ByVal vDelimiter1 As Variant, _ Optional ByVal vDelimiter2 As Variant, _ Optional ByVal bDelimiter As Boolean = False, _ ByVal sNewString As String) Dim lPos As Long Dim sLen As Long If VarType(vDelimiter1) = vbString Then lPos = InStr(sString, vDelimiter1) If lPos > 0 And Not bDelimiter Then lPos = lPos + 1 Else lPos = Val(vDelimiter1) End If If lPos > 0 Then If IsMissing(vDelimiter2) Then sString = Left(sString, lPos - 1) & sNewString Else sLen = Len(LeftStr(Mid(sString, lPos), vDelimiter2)) If sLen > 0 And Not bDelimiter And _ VarType(vDelimiter2) = vbString Then sLen = sLen - 1 If sLen > 0 Then sString = Left(sString, lPos - 1) & _ sNewString & Mid(sString, lPos + sLen) End If End If End If End Property Anwendung der Funktionen und Anweisungen Und diese (nun ingesamt 6) neuen Funktionen und Prozeduren lassen sich wirklich gut verwenden: Teilstring links bis zum ersten Leerzeichen ersetzen
sName = "Otter Dieter" LeftStr(sName, " ") = "Müller" ' Ergebnis: Müller Dieter Teilstring inmitten des Strings durch einen längeren String ersetzen sText = "Heute ist es kälter als gestern!" MidStr(sText, "kälter", 6) = "viel kälter" ' Ergebnis: Heute ist es viel kälter als gestern! Es ließen sich hier noch viele Beispiele aufführen. Ich denke aber, Sie wissen was gemeint ist und wie das Ganze funktioniert. Jetzt kommt aber sicherlich die große Frage: Na, wir wollen das ganze doch mit Klasse machen (deshalb auch der Titel des Workshops). Ergo: Wir erstellen ein Klassenmodul und nennen es clsNewString. Nun fügen Sie alle 6 Property-Prozeduren in das Klassenmodul ein. Der Zugriff auf unsere neuen erweiterten String-Funktionen erfolgt dann über Referenzierung der Klasse: ' Im Form-Modul Option Explicit Dim cString As New clsNewString Und immer wenn wir innerhalb der Form die neuen Stringfunktionen benötigen, schreiben wir folgenden Code: cString.LeftStr(myString, "|") = "..." oder MsgBox cString.MidStr(myString, 5, "@") Abschließend noch ein paar Anwendungsbeispiele ' vollständige Mail-Adresse strMail = "dieter@vbarchiv.de" strDomain = cString.MidStr(strMail, "@") Oder: Sie lesen den Inhalt einer Textdatei zeilenweise aus. Die Zeilen sind folgendermaßen aufgebaut: Name;Vorname;Telefon In einer ListBox sollen jetzt nur die Nachnamen aufgeführt werden - sonst nichts: Open "Daten.txt" For Input As #1 While Not Eof(1) Line Input #1, strLine List1.AddItem cString.LeftStr(sLine, ";") Wend Close #1 Noch ein Beispiel: For I = 0 To UBound(myArray) cString.MidStr(myArray(I), " ", 1, True) = ", " Next I Machen Sie sich ruhig ein wenig vertraut mit den neuen String-Funktionen. Probieren Sie auch ein wenig aus. Wenn Sie sich an die neuen String-Funktionen erst einmal gewöhnt haben.... na dann Dieser Workshop wurde bereits 119.808 mal aufgerufen.
Anzeige
![]() ![]() ![]() (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevPopUp 2.0 ![]() Dynamische Kontextmenüs! Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Tipp des Monats ![]() Manfred Bohn IndexOf für mehrdimensionale Arrays Die generische Funktion "IndexOf" ermittelt das erste Auftreten eines bestimmten Wertes in einem n-dimensionalen Array Access-Tools Vol.1 ![]() Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
|||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |