none
Umwandlung slawischer Sonderzeichen in den Grundbuchstaben RRS feed

  • Frage

  • Hallo,

    ich bekomme Listen, mit diversen Namen, leider sind dabei auch einige mit (slawischen) Sonderzeichen (Háček), diese müssen in unserer Datenbank aber mit dem Basisbuchstaben dargestellt werden.
    Leider bekomme ich das mit VBA irgendwie nicht hin.
    Wenn ich z.B. aus dem Namen
    Zieliński das ń nehme und in VBA einfüge habe ich plötzlich dieses Zeichen: ñ

    Auch finde ich ń und weitere Sonderzeichen nicht im ASCII  Zeichensatz.

    Kann mir jemand sagen, wie ich diese Sonderzeichen in die jeweiligen Basisbuchstaben umwandeln kann?

    Gruß

    cheapy

    Dienstag, 5. September 2017 09:13

Alle Antworten

  • VBA arbeitet normalerweise in Unicode, für die Umwandlung stehen die Funktionen UCASE bzw. LCASE zur Verfügung.
    In der Datenbank (welche nimmst du da?) müssen die Datenfelder als N[VAR]CHAR auch Unicodefähig sein.

    Der VBA-Code selber ist nicht unicodefähig, deshalb funktioniert dies nicht mit Textkonstanten.
    Ebenso wie das Anzeigen im Debugger bzw. Debug.Print. Auch diese unterstützen keinen Unicode.

    Dienstag, 5. September 2017 09:23
  • Ach ja, ich arbeite mit Access 2013.

    Dass das mit den Konstanten nicht funktioniert, ist mir schon aufgefallen, darum habe ich das mit den Zeichen, von denen ich den ASCII Code kenne, so gelöst:

    X = Replace(X, Chr(225), Chr(97), , , vbBinaryCompare)                  'á

    Aber diese betroffenen Zeichen finde ich halt nicht in der ASCII Tabelle.

    Dienstag, 5. September 2017 09:41
  • Access nimmt ebenso Unicode, wenn die Felder als TEXT definiert sind.
    Ansonsten lass das mit dem Replace, da du nicht alle Sprachvarianten (französisch, spanisch, skandinavisch,...) damit abdecken kannst.
    Verwende einfach X = UCASE(X).
    UCASE (Uppercase) ist entsprechend mit Codetabellen hinterlegt, dafür ist es da, genauso wie LCASE (Lowercase).
    Dienstag, 5. September 2017 10:27
  • Der Name stammt aus einer verlinkten CSV-Datei, im Entwurfsmodus wird mir das Feld als Kurzer Text angezeigt.

    UCASE in der Abfrage führt zu folgendem Ergebnis:

    <tfoot></tfoot>
    Abfrage5
    Last Name UPPERCASE
    Zieliński ZIELIŃSKI

    Ich habe die Daten in eine interne Tabelle übernommen und die Felder als Langer Text umdefiniert, ohne Erfolg bei UCASE in der Abfrage, wenn ich diese neue Tabelle benutze.


    Dienstag, 5. September 2017 12:18
  • Dein Problem ist ggf. die verlinkte CSV-Datei.
    Hier tritt ggf. das Problem mit den Daten bereits ein da die Codeübersetzung falsch läuft.
    Lese die Datei selber z.B. mittels ADODB.Stream-Objekt als Unicode bzw. UTF8 ein.
    Dienstag, 5. September 2017 12:43
  • Ich würde die Daten gerne Selbst auslesen aber ich bezweifle das unser Kunde mir erlaubt in sein SAP System zuzugreifen, abgesehen davon dass SAP sich da wohl auch quer legt.

    Leider

    Dienstag, 5. September 2017 13:28
  • Dann hast du mich falsch verstanden.
    Aus dem SAP bekommst du eine CSV-Datei die du dann per Link in deine Access-MDB lädst?
    Auch SAP kann beim Export einer CSV diese als UTF8-Datei ausgeben, gerade wegen der ganzen Sonderzeichen.
    Wenn der CSV-Treiber für den Link native Unicode unterstützt, hast du da keine Probleme.
    Allerdings kann es eben auch sein, dass dies nicht unterstützt wird.

    Also beschreibe vielleicht noch mal genau den Weg deiner Daten und was du dabei mit VBA machst.

    Dienstag, 5. September 2017 15:59
  • Moin,

    das, was Du suchst, ist die Normalisierung. Ein klassischer Approach ist hier beschrieben: http://archives.miloush.net/michkap/archive/2007/05/14/2629747.html

    .NET hat eine Normalize-Funktion, VBA leider nicht.

    Hier ist noch ein interessanter Artikel: https://www.codeproject.com/Articles/13503/Stripping-Accents-from-Latin-Characters-A-Foray-in

    Vielleicht muss es nicht zwingend VBA sein, und Du kannst von den Beispielen in den verlinkten Ressourcen direkt profitieren?


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Dienstag, 5. September 2017 20:37
  • Ich habe den Begriff "Basisbuchstaben" wohl überlesen. Das ist natürlich mit UCASE nicht machbar.
    Mittwoch, 6. September 2017 07:26
  • Nein, es ging nicht um Großbuchstaben, sondern darum, dass

    Zieliński

    in

    Zielinski umgewandelt wird.

    Leider finde ich eben dieses ń und weitere Sonderzeichen nicht in der ASCII Tabelle so dass ich es in meiner ACESS Datenbank mittel VBA umwandeln kann.
    Ich hab mir erstmal damit geholfen, dass ich diese Änderungen mittels Replace in der Abfrage anpasse aber das kann nicht die Lösung sein, da das beleibig unübersichtlich werden kann.
    Die Vorschläge von Evgenij sind zwar interessant aber in Acess nicht zu machen, da müsste ich ein anteres Tool einbinden, was das Handling auch nicht unbedingt vereinfacht.

    Gruß

    cheapy

    Mittwoch, 6. September 2017 07:37
  • Nun, dann musst du dir die Mühe machen, die "Zeichentabelle" aus Windows zu verwenden.
    Hier kannst du dir den Unicode-Zeichensatz ansehen und jedes Zeichen mit seinem Hex-Wert (Unicode sind 4 Bytes!) betrachten.
    Alle Zeichen lassen sich von dort aus auch kopieren.
    Nun erstellst du dir eine Access-Tabelle bestehend aus 2 Textfeldern (wegen Unicode).
    Im 1. Feld erfasst du das ermittelte Sonderzeichen, z.B. "é", schreibst es in das 1. Feld und schreibst ein "e" in das 2. Feld. Leider etwas mühsam, aber dies ist ja nur einmalig und lässt sich jederzeit erweitern.
    Nun kannst du diese Tabelle z.B. in ein ADODB.Recordset einlesen und in einer Schleife Zeichen für Zeichen ersetzen.
    Zur Beschleunigung wäre folgendes Vorgehen möglich (Syntax nur vom Prinzip!):

    dim Rcd as new adodb.recordset
    Rcd.CursorLocation = adUseClient
    rcd.open "Name der Tabelle", aktuelle Verbindung
    rcd("Name des 1.Feldes").Attributes("Optimize") = true ' Interne Indexoptimierung für Find

    dim Name as string
    dim Ind as integer

    for Ind = 1 to len(Name)
    rcd.Find "Name des 1. Feldes = '" & mid(Name, Ind, 1) & "'",,,1 ' Immer ab 1.Satz suchen
    if rcd.eof = false then
    mid(Name, Ind, 1) = rcd!Name des 2.Feldes
    endif
    next

    Mittwoch, 6. September 2017 08:19