Sonntag, 29. Juni 2014

Like: Der vergessene Befehl?

Bei der Recherche rund um das Thema Regular Expressions bin ich auf den Befehl Like in VBA gestoßen. Dieser Befehl ermöglicht einfache Vergleiche mit Suchmustern, ohne das es notwendig ist, eine Bibliothek für Regular Expressions einzubinden.

Wenn man an LIKE denkt, fällt einem sicherlich (als erstes) der Operator in Abfragen ein. Dieser Operator ermöglicht einfache Suchabfragen unter Verwendung von Wildcards. So steht das Zeichen "*" für ein oder mehrere beliebige Zeichen.
Was in SQL-Abfragen geht, ist aber auch direkt in VBA möglich. Eine Dokumentation findet man in der Online-Hilfe oder in der MSDN.

Jetzt stellt sich natürlich die Frage, was man mit diesem Befehl anstellen kann, was nicht mit anderen Befehlen auch gelöst werden kann.
Wenn man z.B. wissen möchte, ob ein Text in einem anderen Text enthalten ist, kann man das mit Like lösen:
1:  str = "Brave new world"  
2:  If (str Like "*new*") Then  
Man kann für diese Aufgabe alternativ den Befehl InStr verwenden:
1:  str = "Brave new world"  
2:  If (InStr(str, "new") > 0) Then  

Ähnlich verhält es sich, wenn man prüfen möchte, ob ein Text mit einer Zeichenfolge beginnt oder endet. Mit dem Befehl Like sieht der Code wie folgt aus:
1:  str = "Hello world"  
2:  If (str Like "Hello*") Then  
3:  ...  
4:  If (str Like "*World") Then  
Die meisten Programmierer werden diese Aufgabe wahrscheinlich mit Hilfe der Befehle Left$ und Right$ lösen:
1:  str = "Hello world"  
2:  If (Left$(str, 5) = "Hello") Then  
3:  ...  
4:  If (Right$(str, 5) = "World") Then  

Ich habe die konkrete Aufgabe, eine eingegebene Kunden-Nr. auf Gültigkeit hin zu überprüfen. Ein Kriterium ist, dass die Kunden-Nr. nur aus Ziffern besteht. Die Kunden-Nr. kann dabei beliebig viele Stellen haben. Eine Prüfung mit einer Schleife, Zeichen für Zeichen, wollte ich ausschließen, da die Funktion später auch in Abfragen zur Prüfung des kompletten Datenbestands eingesetzt werden soll.
Schnell kam ich auf die Idee, die Eingabe mit der Funktion IsNumeric zu prüfen:
1:  strInput = "1234"  
2:  If (IsNumeric(strInput) = False) Then  
Auf den ersten Blick sieht diese Lösung gut aus. Die Nachteile offenbaren sich erst später. So akzeptiert die Funktion nicht nur Ziffern für die Eingabe. Es werden auch der Punkt und das Komma als Tausender- bzw. als Dezimaltrennzeichen akzeptiert:
 ? IsNumeric("-1.234,2")  
 Wahr  

Hier schlägt jetzt die Stunde des Like-Befehls. Sicher könnte man die von der Funktion IsNumeric akzeptierten Zeichen, die keine Ziffer sind, mit Hilfe des InStr-Befehls herausfinden. Der Code wird dann aber schnell lang und unübersichtlich. Einfacher geht es mit dem richtige Suchmuster beim Like-Befehl.

Mit dem Like-Befehl kann man prüfen, ob ein Zeichen in einer Werteliste vorkommt. Für Ziffern ist die Werteliste 0 bis 9:
 ? "1" Like "[0-9]"  
 Wahr  
Man kann die Prüfung auch umkehren und prüfen, ob ein Zeichen gefunden wird, dass nicht in der Werteliste vorkommt:
 ? "1" Like "[!0-9]"  
 Falsch
Wenn man diese Prüfung jetzt noch auf jedes Zeichen der Eingabe anwendet, ist das Ziel erreicht:
1:  Dim strInput As String  
2:  strInput = "-1.234,5"  
3:  If strInput Like "*[!0-9]*" Then  
4:    MsgBox "Unzulässiges Zeichen!"  
5:  End If  
Mit dem Like-Befehl wird jetzt geprüft, ob es irgendwo in der Eingabe ein Zeichen gibt, das nicht in der Werteliste [0-9] enthalten ist. Mit diesem einfachen Befehl habe ich mein Ziel erreicht.


Es scheint, als ob der Befehl Like unter VBA nicht die notwendige Aufmerksamkeit erhält, die er verdient. Mit diesem Befehl kann man Prüfungen, die man sonst mit Left$, Right$ und InStr vornimmt, auf einfache Art durchführen. Außerdem sind Vergleiche mit komplexeren Suchmustern möglich. Ein Beispiel habe ich in diesem Beitrag aufgezeigt.
Der Befehl Like kann mehr, als man im ersten Moment denkt. Es lohnt sich auf jeden Fall, sich mit den Möglichkeiten zu beschäftigen.

Donnerstag, 19. Juni 2014

TM-SmartString: SubStr, SubString

In diesem Beitrag wird das Klassenmodul TM-SmartString um zwei Eigenschaften erweitert, die jeweils einen Teil der Zeichenkette zurückgeben: SubStr und SubString.

Montag, 9. Juni 2014

TM-SmartString: IsNull

Eine der lästigen Dinge, auf die man beim Programmieren achten muss, ist die Verwendung von Null. Schnell kommt es zu einem Laufzeitfehler, wenn man nicht explizit Vorkehrungen für die Behandlung von Null in seinem Code getroffen hat. Mit diesem Beitrag wird die Klasse TM-SmartString für den Umgang mit Null optimiert. Außerdem kommt eine weitere Property hinzu: IsNull.