Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

RTF2Text VBA Problem

Forumthread: RTF2Text VBA Problem

RTF2Text VBA Problem
01.08.2024 11:33:50
mirko_hh
Ich stehe vor der Herausforderung, dass ich häufiger Text, die in einem RTF Format vorliegen als reinen Text benötige. Ich brauchte eine Funktion, die rein in Excel ausgeführt wird, ohne dass Word benutzt/geöffnet wird. Meine Funktion funktioniert in den meisten Fällen, aber es gibt einzelne Strings, die mit einem Fehler abgebrochen werden, und ich weiss nicht warum.

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

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: RTF2Text VBA Problem
01.08.2024 14:25:29
Kuwer
Hallo Mirco,

füge mal über
Case Else
diese Anweisung ein:
hexMode = False


Gruß, Uwe
AW: RTF2Text VBA Problem
01.08.2024 15:28:14
mirko_hh
OMG, vielen Dank.

Die Funktion arbeitet nun genau wie sie soll. Da hat mich verrückt gemacht.

Und für andere, welche ggfs. das gleiche Problem haben (Beim Googlen habe ich nur Fragen bzgl. RTF2Text gefunden, aber nichts passendes gefunden)

Hier eine Funktionsfähige - aber sicher optimierungsbedürftige - 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
hexMode = False
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
Anzeige
AW: ??
01.08.2024 16:28:57
mirko_hh
Danke, dass Du Dir die Zeit genommen hast dies zu posten. Aber leider funktioniert diese Lösung für mich nicht.
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige