Mittwoch, 16. April 2014

TM-SmartString: ToProperCase verbessert

Vor kurzem las ich in einem Newsletter über die Unzulänglichkeiten der Funktion ToProperCase. Die Funktion liefert grundsätzlich richtige Ergebnisse. Problematisch wird es allerdings, wenn ein zusammengesetztes Wort wie z.B. "Baden-Württemberg" richtig umgewandelt werden soll.
Basierend auf dem Newsletterbeitrag habe ich die Eigenschaft ToProperCase so angepasst, dass auch zusammengesetzte Wörter richtig umgewandelt werden.

Ausganssituation:
Bei der Umwandlung des Wortes "baden-württemberg" mit der Eigenschaft ToProperCase erhalten wir folgendes Ergebnis:
Baden-württemberg
Warum das Ergebnis so ist, wie es ist, ist schnell erklärt. Für die aufgerufene Funktion ist dieses Wort ein einziges Wort und dessen erster Buchstabe wird in Großbuchstaben umgewandelt. Die Funktion erkennt leider nicht, dass hier zwei Worte mit einem Bindestrich zusammengesetzt wurden.

Lösungsansatz:
Der Text muss so angepasst werden, dass das zusammengesetzte Wort in zwei Worte aufgeteilt wird. Vor dem zweiten Wort, in diesem Fall "württemberg", muss dazu ein Leerzeichen eingefügt werden.
Wenn man jetzt den Bindestrich durch ein Leerzeichen ersetzen würde, werden zwar zwei Worte erkannt. Die einfache Rückumwandlung des Leerzeichen in einen Bindestrich wird aber nicht von Erfolg gekrönt sein, da alle vorhandenen Leerzeichen durch einen Bindestrich ersetzt würden.

Es muss also eine andere Ersatzzeichenfolge gefunden werden. Dafür bietet sich das so genannte Pipezeichen ("|") gefolgt von einem Leerzeichen an. Es ist kaum anzunehmen, dass diese Kombination in einem normalen Text vorhanden ist. Die Rückumwandlung erfolgt also fehlerfrei und gefahrlos.

Plumpe Umsetzung:
Die plumpe und einfache Umsetzung sieht wie folgt aus:
 ToProperCase = Replace(StrConv(Replace(m_String, "-", "| "), vbProperCase), "| ", "-")  

Die gesamte Funktionalität ist in einer Zeile abgebildet. Diese Zeile zu verstehen ist schon nicht ganz einfach. Noch schlimmer wird es aber, wenn ein Fehler auftaucht. Dann geht die Suche los, da nicht unbedingt klar ist, in welchem Teil die Ursache zu finden ist.

Implementierung
Die Implementierung erfolgt in mehreren Zeilen. Dabei erledigt jede Zeile genau einen Teilschritt. Die Funktion ist so übersichtlich und leicht verständlich.
1:  Public Property Get ToProperCase() As String  
2:    Dim strTmp As String  
3:    strTmp = VBA.Replace(m_String, "-", "| ")  
4:    strTmp = StrConv(strTmp, vbProperCase)  
5:    strTmp = VBA.Replace(strTmp, "| ", "-")  
6:    ToProperCase = strTmp  
7:  End Property  
In der dritten Zeile wird ein eventuell vorhandener Bindestrich durch unsere Ersatzzeichenfolge "| " ersetzt. In Zeile vier sorgt die Umwandlung mittels vbProperCase dafür, dass jedes Wort mit einem Großbuchstaben beginnt. In der fünften Zeile wird dann die Ersatzzeichenfolge "| " wieder durch einen Bindestrich ersetzt.


Dieser Code ist ein weiteres Beispiel für die Vorteile, die sich aus der Nutzung einer Klasse ergeben. Diese Funktion wird einmal im Klassenmodul implementiert und kommt automatisch an allen Stellen zum Einsatz, an der die Methode ToProperCase verwendet wird.

Die neue Version 1.22.02 steht (wie immer) auf meiner Webseite zum Download bereit.

Keine Kommentare: