RTF2Text VBA Problem
01.08.2024 11:33:50
mirko_hh
Meine Hoffnung ist natürlich, dass die Profis hier sofort wissen, wo das Problem ist.
Funktion:
Function RTF2TEXT(rtf As String) As String
Dim i As Long
Dim char As String
Dim inControlWord As Boolean
Dim inGroup As Integer
Dim plainText As String
Dim skipNext As Boolean
Dim hexMode As Boolean
Dim hexChar As String
Dim controlWord As String
' Initialisiere Variablen
inControlWord = False ' Flag, das angibt, ob wir uns gerade in einem Steuerwort befinden
inGroup = 0 ' Zähler für die Anzahl der geöffneten Gruppen
plainText = "" ' Variablen zum Speichern des resultierenden Klartextes
skipNext = False ' Flag, das angibt, ob das nächste Zeichen übersprungen werden soll
hexMode = False ' Flag, das angibt, ob wir uns im Hexadezimalmodus befinden
hexChar = "" ' String zum Speichern der aktuellen Hexadezimal-Zeichenfolge
controlWord = "" ' String zum Speichern des aktuellen Steuerwortes
' Schleife über jedes Zeichen im RTF-String
For i = 1 To Len(rtf)
char = mid(rtf, i, 1) ' Hole das aktuelle Zeichen
If skipNext Then
skipNext = False
GoTo ContinueLoop ' Gehe zum nächsten Schleifendurchlauf
End If
' Bearbeite RTF-Steuerwörter und Gruppen
Select Case char
Case "\"
' Wenn das aktuelle Zeichen ein Backslash ist, überprüfe das nächste Zeichen
If mid(rtf, i + 1, 1) = "'" Then
' Wenn das nächste Zeichen ein Apostroph ist, setze den Hexadezimalmodus
hexMode = True
hexChar = "" ' Setze den Hexadezimal-Zeichenpuffer zurück
skipNext = True ' Überspringe das nächste Zeichen
Else
' Andernfalls, beginne ein neues Steuerwort
inControlWord = True
controlWord = ""
End If
Case "{"
' Wenn das aktuelle Zeichen eine öffnende geschweifte Klammer ist, erhöhe die Gruppenanzahl
inGroup = inGroup + 1
Case "}"
' Wenn das aktuelle Zeichen eine schließende geschweifte Klammer ist, verringere die Gruppenanzahl
inGroup = inGroup - 1
Case " ", ";", "\par", vbCr, vbLf
' Falls das aktuelle Zeichen ein Leerzeichen, Semikolon, Zeilenumbruch oder Zeilenwechsel ist
If inControlWord Then
' Wenn wir uns in einem Steuerwort befinden
If controlWord = "par" Then
' Ersetze Steuerwort "\par" durch einen Zeilenumbruch
plainText = plainText & vbCrLf
ElseIf controlWord = "tab" Then
' Ersetze Steuerwort "\tab" durch einen Tabulator
plainText = plainText & vbTab
End If
inControlWord = False ' Beende die Steuerwortverarbeitung
controlWord = "" ' Setze das Steuerwort zurück
ElseIf Not hexMode And inGroup = 1 Then
' Wenn wir uns nicht im Hexadezimalmodus befinden und in der ersten Gruppe sind
plainText = plainText & char ' Füge das Zeichen dem Klartext hinzu
End If
Case Else
' Alle anderen Zeichen
If inControlWord Then
' Falls wir uns in einem Steuerwort befinden, füge das Zeichen dem Steuerwort hinzu
controlWord = controlWord & char
ElseIf hexMode Then
' Falls wir uns im Hexadezimalmodus befinden
hexChar = hexChar & char
If Len(hexChar) = 2 Then
' Wenn der Hexadezimal-String 2 Zeichen lang ist
plainText = plainText & ChrW(CInt("&H" & hexChar)) ' Konvertiere die Hex-Zahl in ein Zeichen und füge es dem Klartext hinzu
hexMode = False ' Beende den Hexadezimalmodus
End If
ElseIf inGroup = 1 Then
' Wenn wir uns nicht in einem Steuerwort oder Hexadezimalmodus befinden und in der ersten Gruppe sind
plainText = plainText & char ' Füge das Zeichen dem Klartext hinzu
End If
End Select
ContinueLoop:
Next i
' Entferne führende und nachfolgende Leerzeichen, ersetze mehrere Leerzeichen durch ein einzelnes Leerzeichen
plainText = Application.Trim(plainText)
' Gebe den extrahierten Klartext zurück
RTF2TEXT = Trim(plainText)
End Function
Bei z.B. diesem Text funktioniert sie gut:
{\rtf1\ansi\ansicpg1252\deff0\nouicompat{\fonttbl{\f0\fswiss\fcharset0 Arial;}} {\*\generator Riched20 10.0.17763}\viewkind4\uc1 \pard\f0\fs20\lang1031 Vorschwei\'dfflansch PN6 Stahl DN80\par }
Bei diesem bricht sie ab - funktioniert aber wenn ich aus der Zeile das \'dc händisch entferne:
{\rtf1\ansi\ansicpg1252\deff0\nouicompat{\fonttbl{\f0\fswiss\fcharset0 Arial;}} {\*\generator Riched20 10.0.17763}\viewkind4\uc1 \pard\f0\fs20\lang1031\'dcbergangsverschraubung Einsteckende AG Kohlenstoffstahl Pressverbindung Klimakaltwasser AD 60,3mm R2\par }
Hier eine Beispieldatei (ENTHÄLT MACROS): https://www.herber.de/bbs/user/171389.xlsm
Hilfe und Verbesserungen wären toll, die Einschränkung ist, dass kein WordObj verwendet werden darf.
Anzeige