Wie implementiere ich Long Text-Handling mit besserem Unicode-Support in VBA?

Viele Access-Anwendungen arbeiten mit langen Texten: Notizen, Beschreibungen, HTML-Fragmente, E-Mails, Protokolle oder XML-Daten. DafĂŒr gibt es in Microsoft Access das sogenannte Memo-Feld (heißt ab Access 2013 offiziell „Long Text“). Dieses Feld kann bis zu 1 GB Text speichern – also weit mehr als die 255 Zeichen eines klassischen Textfelds.

Allerdings gibt es Fallstricke:

  • Probleme mit Sonderzeichen (z. B. Emojis, Arabisch, Chinesisch, kyrillisch)
  • VerstĂŒmmelte Inhalte beim Speichern ĂŒber DAO/ADO
  • Unerwartete Abschneidungen bei Abfragen
  • EinschrĂ€nkungen beim Export oder bei Debug.Print

Die Ursache: VBA ist nativ ANSI-basiert (8-Bit-Zeichen), wÀhrend Access intern Unicode (UTF-16) nutzt. Wenn man lange Texte falsch behandelt, gehen Sonderzeichen verloren oder Inhalte werden abgeschnitten.

Unicode und VBA: Ein kurzer Überblick

VBA verwendet intern den String-Datentyp, der Unicode-fĂ€hig ist. Jeder String speichert Zeichen als 16-Bit-Werte, also als UTF-16. Solange Du mit String arbeitest, ist Unicode kein Problem – aber:

  • Viele Office-Komponenten (z. B. DAO, Textboxen, Clipboard) nutzen nur ANSI
  • Beim Export, Schreiben in Dateien oder Anzeige in Formularen gehen Unicode-Zeichen verloren, wenn Du nicht aufpasst
  • Einige APIs brauchen explizit UTF-8 oder UTF-16 Encodings

Beispiel 1: Unicode sicher in Long Text speichern und lesen

Public Sub SpeichereUnicodeNachricht()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim UnicodeText As String

    UnicodeText = "Hallo 🌍 - Ù…Ű±Ű­ŰšŰ§ ŰšŰ§Ù„ŰčŰ§Ù„Ù… - ПроĐČДт ĐŒĐžŃ€ - äž­æ–‡æžŹè©Š"

    Set db = CurrentDb
    Set rs = db.OpenRecordset("tbl_Nachrichten", dbOpenDynaset)

    rs.AddNew
    rs!Titel = "Unicode-Test"
    rs!Nachricht = UnicodeText  ' Feldtyp: Long Text
    rs.Update

    rs.Close
    Set rs = Nothing
    Set db = Nothing

    MsgBox "Nachricht gespeichert: " & UnicodeText, vbInformation
End Sub

Wichtig: Achte darauf, dass das Feld Nachricht in der Tabelle den Typ „Langer Text“ hat – kein Text(255), sonst wird es abgeschnitten.

Beispiel 2: Unicode aus Datei einlesen und speichern

Möchtest Du einen UTF-8- oder UTF-16-kodierten Text einlesen (z. B. XML, HTML, JSON), dann brauchst Du spezielle File-I/O-Routinen:

Public Function LeseUTF16Datei(Dateipfad As String) As String
    Dim fso As Object
    Dim stream As Object

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set stream = CreateObject("ADODB.Stream")

    With stream
        .Charset = "utf-16"
        .Open
        .LoadFromFile Dateipfad
        LeseUTF16Datei = .ReadText
        .Close
    End With

    Set stream = Nothing
    Set fso = Nothing
End Function

Verwendung:

Dim inhalt As String
inhalt = LeseUTF16Datei("C:\Daten\test.txt")

Beispiel 3: Unicode korrekt exportieren (UTF-8)

Beim Schreiben in Dateien solltest Du nicht Open ... For Output verwenden (ANSI), sondern ADODB.Stream oder CreateTextFile mit Unicode-Encoding:

Public Sub SchreibeUTF8Datei(Dateipfad As String, Inhalt As String)
    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")

    With stream
        .Charset = "utf-8"
        .Open
        .WriteText Inhalt
        .SaveToFile Dateipfad, 2  ' 2 = ĂŒberschreiben
        .Close
    End With

    Set stream = Nothing
End Sub

So bleiben alle Unicode-Zeichen wie Emojis oder nicht-lateinische Buchstaben erhalten.

Formularanzeige: Emojis und Sonderzeichen korrekt anzeigen

Access-Formulare unterstĂŒtzen Unicode auch in Textfeldern. Achte darauf, dass die Steuerelementeigenschaft „Textformat“ auf „Rich Text“ oder „Nur Text“ steht – Rich Text kann aber zusĂ€tzliche HTML-Interpretationen mitbringen, was manchmal stört.

Wenn Du im Formular Texte einbindest, kannst Du einfach so schreiben:

Me.txtAnzeige.Value = "Letzter Status: ✅ erfolgreich ĂŒbermittelt"

Auch eine direkte Ausgabe aus der Tabelle klappt – solange der Feldtyp „Langer Text“ ist.

Sonderfall: SQL-Abfragen mit Long Text

In Access-Abfragen werden Long-Text-Felder standardmĂ€ĂŸig abgeschnitten, wenn sie Teil eines Gruppierungsvorgangs oder einer JOIN-Abfrage sind. Du kannst dieses Verhalten umgehen, indem Du:

  • das Feld nicht gruppierst
  • mit Nz() oder CStr() in der SELECT-Klausel arbeitest
  • das Feld im VBA auswertest, nicht per SQL

Fazit

Unicode und lange Texte lassen sich in Access und VBA sehr gut verarbeiten – wenn Du die richtigen Techniken anwendest. Achte darauf:

  • String ist Unicode-fĂ€hig, aber viele Office-Komponenten nicht
  • Nutze ADODB.Stream fĂŒr Dateioperationen mit Encoding
  • Verwende „Langer Text“-Felder fĂŒr Inhalte >255 Zeichen
  • Teste mit realen Unicode-Zeichen – Emojis, arabischer Text, kyrillisch, CJK

Wenn Du mit mehrsprachigen Anwendungen, HTML-Inhalten, JSON oder Textverarbeitung in Access arbeitest, sind diese Techniken unverzichtbar.

Du brauchst UnterstĂŒtzung bei Unicode-Problemen, Textimport/-export oder einem mehrsprachigen Access-Frontend? Melde Dich gern bei mir – ich helfe Dir weiter.

🐑 DatenschĂ€fer – Analyse, Auswertung und Automatisierung fĂŒr KMU im Norden
📧 Kontakt ĂŒber sesoft.de | 💬 Access · VBA · Unicode · Power Platform

Kategorien:

Schlagwörter:

Keine Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert