SoundEx-Funktion - aber schnell!

Wie war doch gleich noch mal der genaue Name? Schmidt, Schmitt oder Smith? Wenn man nach Namen suchen muss, wird man die SoundEx-Funktion zu schätzen wissen. Mit ihr kann man nach ähnlich klingenden Namen suchen. Das wird auch als unscharfe Suche bezeichnet und ist vor allem für Datenbanken sehr nützlich.

Der SoundEx-Funktion wird der zu vergleichende Quellstring − also z. B. der Name − übergeben. Sie gibt einen Vergleichsstring zurück, der für ähnliche Quellstrings identisch ist. Das erste Zeichen des Vergleichsstrings ist mit dem Quellstring identisch, jedes weitere Zeichen des Quellstrings wird im Vergleichsstring durch je eine Ziffer ersetzt. Dabei werden ähnlich klingende Konsonanten des Quellstrings wie z. B. b, f, p, v jeweils durch die gleiche Ziffer repräsentiert. 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. Um nun ähnlich klingende Namen zu suchen, sucht man einfach nach identischen SoundEx-Codes.

Diese altbekannte Funktion wurde schon lange für VBA umgesetzt, war aber bisher recht langsam. Hier nun eine überarbeitete, ca. 400% schnellere Version. Diese Leistungssteigerung funktioniert dank eines einfachen Tricks: Ein Computer kann Zahlen sehr viel schneller verarbeiten als Text. Deshalb wird der Vergleichsstring einem ByteArray zugewiesen:

Dim t() As Byte
t() = strQuellstring

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.

Die SoundEx-Funktion gibt es hier als Download:  soundexDemo.accdb. Kopiert man das darin enthaltene Modul in eine beliebige Officedatei, steht dort die SoundEx-Funktion zur Verfügung.