E164Fix

Dieses Outlook VBA-Marko habe ich geschrieben, um die Menge an Telefonnummern in meinem Kontaktordner alle an die E164-Schreibweise anzupassen. Diese ist für die Verwendung mit TAPI und vor allem OCS natürlich wichtig. Nur so kann der OCS-Server oder auch jede andere TAPI-Anwendung "richtig" wählen.

Aber auch der Abgleich mit dem Mobiltelefon per ActiveSync oder andere Lösungen sorgt so dafür, dass die Rufnummern immer und überall funktionieren. Wenn ich z.B. in meinen Kontakten einfach nur 05251304613 eingetragen habe, dann funktioniert diese Nummer nur mit dem Mobiltelefon, wenn ich in Deutschland bin.

Auch die "Nummer zu Namen"-Auflösung ist von einer korrekten Nummer abhängig. Es hat sich eingebürgert, dass die anrufende Nummer auch in der E164-Schreibweise übermittelt wird. Damit aus +495251304613 auch "Frank Carius" wird, muss die Nummern passend erfasst sein.

Auch wenn Sie zwischen mehreren Telefonanlagen wechseln und manchmal eine "Amtsholung" benötigen und manchmal nicht, ist die E164-Rufnummer immer die beste Basis um die "richtige" zu wählende Nummer zu verwenden. Bei VoIP-Anbindungen wird auch bevorzugt die E164-Nummer verwendet, um keine falschen Verbindungen aufzubauen.

Vorüberlegungen.

Nun wäre es etwas kurz gegriffen, einfach bei jeder Nummer die führende 0 durch ein +49 zu ersetzen. Es gibt ja auch viele "falsche" Schreibweisen, die sich eingebürgert haben, selbst wenn Outlook bei der Eingabe einer Rufnummer mit einem Assistenten die "korrekte" Eingabe forciert. Wenn Sie aber in einem Outlook Kontakt einfach mal die "normale deutsche Rufnummer" mit 05251304600 eingeben, dann werden Sie sehen, was Outlook darauf per Default macht:

Outlook Normalisierung 

Sie sehen schon, dass hier eine "0" unglücklich" eingefügt wird. Ich habe auch schon jede Menge andere Schreibweisen gesehen, die sich natürlich auch bei mir in meinen Kontakten wieder finden. Beim Entwickeln des Skript ist mit auch so der ein oder andere Kontakt aufgefallen, den ich schon aus Lotus Organizer-Zeiten mit ziehen.

Und da "Handarbeit" bei solchen müssenÄnderungen auch sehr fehleranfällig ist, habe ich ein VBA-Makro geschrieben, mit dem ich mit die Rufnummern "OCS-tauglich gemacht habe.

Normalisierung des Skript

Zuerst muss man natürlich mal überlegen, welche Rufnummern man wie normalisieren will. Alle Eventualitäten habe ich sicher nicht abgedeckt, wenngleich ich meine Nummern damit sehr einfach umgesetzt habe. Folgende Platzhalter werden a, Anfang des Skript definiert:

  • <c>  z.B.: "+49"
    Standard Ländercode, der addiert wird. Wenn also Österreicher, Schweizer, Niederländer oder andere Nationen das Skript einsetzen, dann ist der Wert zu ändern
  • <IntPrefix>  z.B.: "+495251304"
    Dieser String wird am Anfang addiert, wenn die Rufnummer so kurz ist, dass Sie als "intern" angesehen wird.
  • <Local>  z.B. "+495251"
    E164-Teil des lokalen Ortsnetz

Hier die im Skript hinterlegten Korrekturregeln. Die Regeln werden von oben nach unten bis zum ersten Treffer abgearbeitet. Vorab werden aber z.B. auf "++" ein "+" gemacht und mit TRIM die Leerzeichen entfernt

Suche Ersetzen Bemerkung

+10*

+1*

USA mit falscher 0 vor dem Regionalcode

+xx0*

+xx*

Sonstige E164 Nummer mit falscher "0" nach dem Ländercode

+*

+*

Gehe von korrekter E164 Nummer aus

(0)*

<c>*

Ersetze (0) am Anfang und setze den Ländercode davor

*(0)*

+**

Entferne (0) in der Nummer. Addiere ein "+", wenn es am Anfang fehlen sollte

Kürzer <len>

<IntPrefix>*

Nummer wird als "intern" angesehen und um Ländercode, ONKZ und Anschluss erweitert

(0*

<c>(*

Ersetze führende "(0" durch den Ländercode mit Klammer

(*

<c>(*

Erweitere führende "(" mit Ländercode

00*

+*

Ersetze "00" durch "+"

0

<c>*

Ersetze deutsche Nummer durch den Ländercode

*

<local>*

Vermutlich Nummer im gleichen Ortsnetz. Addiere Land und Ortsnetz.

Sicher könnte ich die Ersetzungen auch über RegEx realisieren, aber das dürfte ihre eigenen Anpassungen eher erschweren. Aktuell ist nicht abgedeckt, wenn jemand auch die "Amtsholung" in die Rufnummer hinterlegt hat.

Skript einsetzen

Das Skript ist ein VBA-Makro, welches jeder Mitarbeiter selbst ausführen kann. Um unbedachte Aktionen zu verhindern, ändert das Makro erst einmal nichts, da die entsprechende Zeile "contact.save" auskommentiert ist. Wer das VBA-Makro als einfach so in den VBA-Editor importiert, die Konstanten anpasst und startet, wir nur eine CSV-Datei mit den alten und neuen Rufnummern erhalten. Folgende Konstanten sind erst einmal zu definieren.

Const conIntLength = 3  ' length of internal numbers
Const conCountrycode = "+49"  ' Countrycode
Const conAreaNr = "5251"   ' Areacode bzw Ortznetz
Const conLine = "304"  ' Hauptanschluss
Const conlogfile = "C:\\e164fix.log"

Zudem fordert Sie das Skript immer zur Auswahl einen Kontaktordners auf, auf dem die Normalisierung angewendet wird.

Es ist also kein Skript, welches auf dem Server automatisch durch alle Postfächer und mehrere Kontaktordner durchläuft. Das Ende des Skripts wird durch eine Messagebox angezeigt.

 Je nach Anzahl der Kontakte und Performance ihres Servers kann der Durchlauf einige Minuten dauern. Warten Sie einfach etwas ab oder schauen Sie anhand der CPU-Last von Outlook, dass es noch arbeitet. Nach dem Sie das Skript importiert, angepasst und gestartet haben, sollten Sie in der angegebenen Protokolldatei eine Übersicht der Kontakte mit allen alten und geplanten neuen Telefonnummern haben. Unterziehen Sie dieses Datei zumindest einer kurzen Überprüfung, ehe Sie dann die Betriebsart auf "Write" umsetzen.

E164 CSV-Report

Die Datei enthält die Spalten "SaveAs, Old, New, Rule, Update" und einen Tabulator als Trenner, so dass in Excel die Datei sehr einfach geöffnet werden kann. Danach können Sie im Header die Betriebsart umstellen, indem sie die erste Zeile durch die Zweite ersetzen:

Const conMode = "read"
'Const conMode = "WRITE!"

e164fix.bas.txt
Das Skript ist sicher nicht perfekt codiert. Es ist, wie es so oft heißt, "historisch gewachsen". Speziell da ich einige globale Variablen nutze.
Zum Einbinden in Outlook finden Sie auf Outlook VBA weitere Hinweise

E164 Normalisator auch entfernen von "/" etc", da Mobiltelefone und andere dies nicht können

Bitte prüfen Sie selbst das Skript genau, ob es ihren Erwartungen entspricht. Ich bin nicht für verstümmelte Rufnummern verantwortlich.

Weitere Links