SoundEx-Funktion - aber schnell!

Wie war doch gleich noch mal der genaue Name? Schmidt, Schmitt oder Smith? Wer nach Namen suchen muss, weiß die SoundEx-Funktion zu schätzen. Mit ihr kann man nach ähnlich klingenden Namen suchen. Das ist auch als unscharfe Suche bekannt und besonders für Datenbanken äußerst nützlich.

Die SoundEx-Funktion bekommt den zu vergleichenden String − also z. B. den Namen − übergeben und gibt einen anderen String zurück, der für ähnliche Vergleichsstrings identisch ist. Das erste Zeichen des Vergleichsstrings bleibt dabei unverändert, die weiteren Zeichen des Vergleichsstrings werden durch je eine Ziffer ersetzt. Dabei bekommen ähnlich klingende Konsonanten wie z. B. b, f, p, v jeweils die gleiche Ziffer. Buchstabenwiederholungen, Sonderzeichen und Vokale werden ignoriert und nach drei Ziffern wird die Funktion beendet. Heraus kommt ein maximal vierstelliger SoundEx-Code, etwa der Art m262. Nun können andere Datensätze mit dem gleichen Soundex-Code in einer Abfrage gesucht werden.

Diese altbekannte Funktion ist schon lange für VBA konvertiert worden, war aber bisher ziemlich langsam. Hier nun eine überarbeitete, ca. 400% schnellere Version. Diese Performancesteigerung klappte dank eines einfachen Tricks: Ein Computer kann Zahlen nämlich sehr viel schneller verarbeiten als Text. Daher wird der Vergleichsstring einem ByteArray zugeordnet:

Dim t() As Byte
t() = strVergleichsstring

Der Array t() wird so mit den UTF16-Werten des Vergleichsstrings belegt. t(0) + t(1) * 256 ergibt den Zeichenwert des ersten Zeichens usw. Mit Bytewerten kann der Computer anschließend wesentlich schneller arbeiten als mit einem String. Dieser Trick kann natürlich auch für andere Auswertungen von Strings interessant sein.

Übrigens ist die Idee für diese Version einst auf dem Access-Stammtisch Rhein-Main entstanden.

Eine Demo zur SoundEx-Funktion gibt es hier als Download:  soundexDemo.accdb. Kopiert man das darin enthaltene Modul in eine beliebige Officedatei, kann in ihr die SoundEx-Funktion genutzt werden.