Ich versuche, eine VBA-Funktion in Access zu schreiben, die Wörter in einem Adressfeld durch den Standard United States Postal Abbreviations ersetzt. Mir ist klar, dass dies niemals perfekt sein wird, aber ich möchte zumindest einfache Abkürzungen machen (ohne eine Adressformatierungssoftware kaufen zu müssen), , z.B.Verwenden von RegEx und Ersetzen zum Aktualisieren von Adressfeldern mit USPS-Abkürzungen in MS-Access
input output
------- -------------
North -> N
Street -> ST
Drive -> DR
Lane -> LN
Ich dachte über eine einfache Tabelle mit dem String und die Ersatzzeichenfolge zu speichern, und dann Schleife durch diese Tabelle/Cord-eine einfache Suche durchführen und ersetzen mit der Replace()
Funktion, z.B. unter Verwendung der immediate window
:
?Replace("123 North 3rd St", "North", "N", compare:=vbTextCompare)
123 N 3rd St
Jedoch kann dieses Verfahren möglicherweise zu Fehlern führen, z.B.
?Replace("123 Northampton St", "North", "N", compare:=vbTextCompare)
123 Nampton St
Meine ursprüngliche Strategie war es, eine Ersetzungstabelle mit regulären Ausdruck Muster und Ersatzzeichenfolgen zu erstellen, dann Schleife durch diese Tabelle eine genauere Suche und ersetzen zu tun.
pattern abbrev
------------------- ------------
{pattern for North} N
{pattern for Street} ST
Ich erkennen, dass RegEx Overkill hier sein könnte, zumal ich Schleife durch Adressfelder immer und immer wieder in einer Datenbank sein werde, aber denken Sie konnte nicht von einem einfacheren Weg, nur mit der Replace()
Funktion (Update: siehe Antworten von @ mwolfe02 und @ Cylian und eine Hybridlösung).
In dem obigen Beispiel möchte ich nach den Wörtern North und Street suchen, wenn sie entweder als ein Wort in einer Zeichenfolge (also durch zwei weiße Leerzeichen getrennt) oder am Ende der Zeichenfolge oder Anfang von a existieren Zeichenfolge. Dies deckt die meisten Situationen ab, die eine Abkürzung rechtfertigen. z.B.
address formatted
---------------------- --------------------------
123 North 3rd St -> 123 N 3RD ST
123 ABC Street North -> 123 ABC ST N
North 3rd Street -> N 3RD ST
123 North Northampton St -> 123 N NORTHAMPTON ST
Wie in diesen Beispielen möchte ich in der Folge alle Instanzen des Musters ersetzen. Ich konvertiere auch alles in Großbuchstaben (ich kann UCase()
auf das Endergebnis kein Problem verwenden).
Weiß jemand von einem vorhandenen Modul, das so etwas tut? Kann jemand mit dem Mustervergleich wie in den obigen Beispielen helfen? Für zusätzliches Guthaben bin ich auch neugierig auf das Erstellen von Regeln in der Tabelle zum Formatieren von Post-Office-Boxen, z. B. , z.
address formatted
---------------------- --------------------------
P.O. Box 345 -> PO BOX 345
PO Box 345 -> PO BOX 345
Post Office Box 345 -> PO BOX 345
PO. Box 345 -> PO BOX 345
P. O. Box 345 -> PO BOX 345
This stack overflow post ergibt sich folgendes Muster einige Postfächer zu erkennen "^ \ s * P.? \ S? O.? \ SB [Oo] [Xx]." (freilich nicht das dritte Beispiel oben). Wiederum bin ich nicht so gut mit Matching- und Ersatz-Sets vertraut, um herauszufinden, wie man diese präzisere Ersatzfunktion schreibt. Gibt es einen RegEx/Access-Experten, der helfen kann?
Im Moment habe ich Probleme mit der '' SubstituteUSPS() '' Funktion beim Durchlaufen meiner Quellentabelle. Ich habe keine Probleme mit der Funktion, wenn sie alleine benutzt wird; aber es scheint nicht zu funktionieren, wenn es mit einem anderen Re-Cord-Set kombiniert wird. Ideen? – regulus
Ich habe es herausgefunden. Nach jedem Durchlauf muss ich das statische Recordset ** rst_abbrev ** auf die erste Position zurücksetzen. Ich habe den Code aktualisiert. – regulus