Discussion:
Formatierten Text aus Tabellenzelle auslesen
(zu alt für eine Antwort)
Norbert Schiller
2004-02-09 14:13:35 UTC
Permalink
Hallo NG,

bin in Sachen VBA leider momentan noch etwas unbedarft. Evt. könnte mir
bitte einer von Euch etwas auf die Sprünge helfen.

Es geht darum, einen formatierten Text aus einer Tabellenzelle auszulesen,
diesen mit entsprechenden HTML-Tags zu versehen und dann diesen String für
die Weiterverarbeitung in einer Variablen abzulegen. Bei der Ermnittlung der
Formatierung wären nur die Tags relevant für Bold,Italic und Underlined.
(also <b> , <i> , <u>).

Habe im Web zwar nen Codeschnippsel für das gesamte Dokument gefunden.
Dieser arbeitet mit dem Find-Objekt. Nur leider funktioniert der erstens
nicht bei ner Tabellenzelle und zweitens ändert dieser mir
unerwünschterweise den aktuellen Text.

Momentan mach ich das so :

Sub FormatierterTextMitHTMLTagsVersehen()
Dim c As Cell, Flag As Boolean
Set c = Tables(1).Cell(1, 1)
Application.ScreenUpdating = False

With c.Range.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = ""
.Format = True
.Font.Bold = True
Flag = .Execute
Do While Flag = True
.Parent.InsertBefore "<b>"
.Parent.InsertAfter "</b>"
c.Range.SetRange Start:=.Parent.End, End:=c.Range.End
Flag = .Execute
Loop
End With

Tja, und da hängt sich alles in einer Endlosschleife auf.

Hat jemand einen Tipp für mich, wo es bei mir hakt und evt. auch nen
Hinweis, wie ich formatierten Text auslesen kann ohne ihn dabei für den User
sichtbar zu verändern.

Danke schon mal für Eure Mühe.

--
Gruß, Norbert
[mailto:***@freenet.de]
Helmut Weber
2004-02-09 17:03:37 UTC
Permalink
Hallo Norbert,
das schreib ich jetzt zum zweiten mal,
bitte um Nachsicht, wenn's auch zweimal auftaucht.
Erst müsste man mal wissen, wie die Texte in den
Zellen aussehen. Einheitlich formatiert? Dann
sollte es nicht allzu schwierig sein.
Gemischt formatiert, also wie ein kleines Dokument,
mal so mal so? Kursiv, fett, unterstrichen zugleich,
gefolgt von "normalem" Text, etc. Dann kann es elend
kompliziert werden. Für den Augenblick sehe ich nur die
Komplikation, dass .Parent.InsertAfter "</b>"
gar nicht hinter den Range kommt, wegen der
besonderen Eigenschaften des End-of-Cell-Marker.
Kann man sich ansehen, wenn man c.range.select
vorschaltet. Man kommt also nie über diese Marke
hinaus. Dummerweise kann der End-of-Cell-Marker auch
noch fett etc. sein. Und wenn man Clearformatting auf
ihn anwendet, ist der Rest der Zelle auch entformatiert.
Es sei denn, es sind noch Absatzmarken in der Zelle.
Also Komplikationen über Komplikationen.

Gruss
Helmut Weber
"red.sys" & chr$(64) & "t-online.de"
Word XP, W98
Norbert Schiller
2004-02-10 17:39:51 UTC
Permalink
Hallo Helmut,
Post by Helmut Weber
Gemischt formatiert, also wie ein kleines Dokument,
mal so mal so? Kursiv, fett, unterstrichen zugleich,
gefolgt von "normalem" Text, etc. Dann kann es elend
kompliziert werden.
Ja, ist leider so.
Post by Helmut Weber
Also Komplikationen über Komplikationen.
Kann von mir aus schon komplex werden, steh ich schon durch :-). Und seitens
Performance ist auch keine Untergrenze vorgegeben. Funktionieren soll es
halt nur.

Danke für deine Mühe und Tipps.

--
Gruß, Norbert
[mailto:***@freenet.de]
Klaus Linke
2004-02-09 21:35:45 UTC
Permalink
Hallo Norbert,

Zwei Dinge fallen mir auf:

-- .Wrap ist nicht gesetzt ... Ich bin mir nicht sicher über den Default,
aber ich würde zur Sicherheit ".Wrap=wdStop" einfügen.

-- Du durchsuchst ja immer wieder c.Range, also den Range der Zelle. Und da
der fette Text fett bleibt, wird er immer wieder gefunden.
Als Ausweg könntest du ihn gleich mager machen:
Do While Flag = True
.Parent.Font.Bold = False
' ...
Oder du benutzt eine eigene Range für die Suche:
Dim rng_c As Range
Set rng_c = ActiveDocument.Tables(1).Cell(1, 2).Range.Duplicate
' ...
... und setzt sie nach jeder erfolgreichen Suche neu (auf den Rest der
ursprünglichen Range).


Allerdings scheint mir, dass du das Ganze zu kompliziert angehst. Ersetzt
einfach alles Fette durch <b>^&</b> ersetzt (wdReplaceAll), ohne das "Do
While ...".


Wenn du eine Lösung suchst, die das Dokument nicht verändert, kannst du
entweder eine Textmarke einfügen, und am Ende des Makros solange mit .Undo
alles rückgängig machen, solange die Textmarke vorhanden ist (... ein Trick,
den Roemer Lievaart in einer VBA-Newsgroup beschrieben hat).
Oder du merkst dir die fetten, kursiven, und unterstrichenen Ranges, und
fügst die entsprechenden Tags in den reinen Textstring ein.
Falls du das versuchst, würde ich nicht alles in ein Makro packen, sondern
mir einige Hilfs-Makros basteln.
Wenn es nicht arg auf Geschwindigkeit ankommt, kannst du die Zelle Zeichen
für Zeichen durchgehen (For each myChar in c.Range.Characters), das
entsprechende Zeichen an den String anhängen, und bei Fontwechsel die
entsprechenden Tags einfügen.
Den "End-of-Cell-Marker" Chr(13) & Chr(7) am Ende der Zelle wirst du
entfernen müssen.


Gruß,
Klaus
Post by Norbert Schiller
Hallo NG,
bin in Sachen VBA leider momentan noch etwas unbedarft. Evt. könnte mir
bitte einer von Euch etwas auf die Sprünge helfen.
Es geht darum, einen formatierten Text aus einer Tabellenzelle auszulesen,
diesen mit entsprechenden HTML-Tags zu versehen und dann diesen String für
die Weiterverarbeitung in einer Variablen abzulegen. Bei der Ermnittlung der
Formatierung wären nur die Tags relevant für Bold,Italic und Underlined.
(also <b> , <i> , <u>).
Habe im Web zwar nen Codeschnippsel für das gesamte Dokument gefunden.
Dieser arbeitet mit dem Find-Objekt. Nur leider funktioniert der erstens
nicht bei ner Tabellenzelle und zweitens ändert dieser mir
unerwünschterweise den aktuellen Text.
Sub FormatierterTextMitHTMLTagsVersehen()
Dim c As Cell, Flag As Boolean
Set c = Tables(1).Cell(1, 1)
Application.ScreenUpdating = False
With c.Range.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = ""
.Format = True
.Font.Bold = True
Flag = .Execute
Do While Flag = True
.Parent.InsertBefore "<b>"
.Parent.InsertAfter "</b>"
c.Range.SetRange Start:=.Parent.End, End:=c.Range.End
Flag = .Execute
Loop
End With
Tja, und da hängt sich alles in einer Endlosschleife auf.
Hat jemand einen Tipp für mich, wo es bei mir hakt und evt. auch nen
Hinweis, wie ich formatierten Text auslesen kann ohne ihn dabei für den User
sichtbar zu verändern.
Danke schon mal für Eure Mühe.
--
Gruß, Norbert
Norbert Schiller
2004-02-10 17:59:39 UTC
Permalink
Hallo Klaus,
Post by Klaus Linke
-- .Wrap ist nicht gesetzt ... Ich bin mir nicht sicher über den Default,
aber ich würde zur Sicherheit ".Wrap=wdStop" einfügen.
Danke. Kannte .wrap nicht bzw. dessen Bedeutung.
Post by Klaus Linke
-- Du durchsuchst ja immer wieder c.Range, also den Range der Zelle. Und da
der fette Text fett bleibt, wird er immer wieder gefunden.
Stimmt. :-(

[schnippel]
Post by Klaus Linke
Allerdings scheint mir, dass du das Ganze zu kompliziert angehst. Ersetzt
einfach alles Fette durch <b>^&</b> ersetzt (wdReplaceAll), ohne das "Do
While ...".
Da ich mit VBA noch nicht allzuviel gemacht habe, habe mich nach dem
erstbesten Codeschnippsel, den ich aus dem Web gezogen hatte, gerichtet und
daran rumprobiert. Ein einfacherer Weg wär mir allerdings auch schon lieber.
Post by Klaus Linke
Wenn du eine Lösung suchst, die das Dokument nicht verändert, kannst du
entweder eine Textmarke einfügen, und am Ende des Makros solange mit .Undo
alles rückgängig machen, solange die Textmarke vorhanden ist (... ein Trick,
den Roemer Lievaart in einer VBA-Newsgroup beschrieben hat).
Textmarken sollten aussen vor bleiben. Grund ist der, dass so ne Textmarke
vom User schnell mal unbeabsichtigt gelöscht wird und dann der Datenexport
vom Word-Dokument in eine fremde WaWi (KHK) nicht mehr stimmen würde.
Arbeite deshalb nur mit einzelnen Tabellen, deren Indexe ich verwalte.
Trotzdem eine pfiffige Lösung.
Post by Klaus Linke
Wenn es nicht arg auf Geschwindigkeit ankommt,
Nein, hab im Grunde alle Zeit der Welt (natürlich in gewissen Grenzen).
Post by Klaus Linke
kannst du die Zelle Zeichen für Zeichen durchgehen (For each myChar in
c.Range.Characters), das
Post by Klaus Linke
entsprechende Zeichen an den String anhängen, und bei Fontwechsel die
entsprechenden Tags einfügen.
Den "End-of-Cell-Marker" Chr(13) & Chr(7) am Ende der Zelle wirst du
entfernen müssen.
Das ist im Grunde genau das was ich bräuchte. Wusste bisher nicht, dass man
jeden Character im Range einzeln ansprechen kann.

Tausend Dank für deine Tipps und deine Mühe.


--
Gruß, Norbert
[mailto:***@freenet.de]

Loading...