vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2017
 
zurück
Rubrik: Verschiedenes   |   VB-Versionen: VB5, VB601.02.02
Left, Right und Mid-Funktion ganz neu - und mit Klasse!

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 :-))

Autor:  Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  111.098 

Neue Version! sevEingabe 3.0 (für VB6 und VBA)
Das Eingabe-Control der Superlative! Noch besser und noch leistungsfähiger!
Jetzt zum Einführungspreis       - Aktionspreis nur für kurze Zeit gültig -

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.
Also so:

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 und herausgekommen sind zunächst drei neue Funktionen: LeftStr, RightStr und MidStr. Die Parameter zur Positionsangabe können hierbei entweder als Zahl oder als String angegeben werden:

' 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.
Aber wie? Eine Funktion gleichzeitig auch als Anweisung?

Property heißt die Lösung!
Wenn man nun die drei neuen Funktionen als Property Get Prozeduren deklariert, dann kann man über die gleichnamigen Property Let Prozeduren aus der Funktion eine Anweisung machen.

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:
Wohin mit den neuen Property-Prozeduren?

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
In der Variable strMail ist eine EMail-Adresse gespeichert. Sie brauchen für die Verarbeitung aber nicht die gesamte EMail-Adresse, sondern nur den Domain-Namen.

' 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:
In einem Array-Feld sind Namen gespeichert, wobei der Vorname vom Nachnamen durch ein Leerzeichen getrennt ist. Nun soll aber nach dem Vornamen zunächst ein Komma stehen, dann das Leerzeichen und danach erst der Vorname. Das einzelne Leerzeichen muss folglich durch eine zweistellige Zeichenfolge ersetzt werden:

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 111.098 mal aufgerufen.

Über diesen Workshop im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Workshop, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(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.
 
   

Druckansicht Druckansicht Copyright ©2000-2017 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel