Discussion:
Html-tags durch Zeichenformattierung ersetzen
(zu alt für eine Antwort)
Hans List
2007-11-28 12:47:21 UTC
Permalink
Hallo Leute,

dtieses Makro funktioniert an und für sich gut:

Sub test()
ResetSearch

'cursief-codes vervangen door opmaak
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
.Text = "\<i\>(*)\</i\>"
.Replacement.Text = "\1"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll

ResetSearch

End Sub

Wenn zwischen dem <i> und </i> jedoch ein {REF...}-Feld steht, wird
dieses Feld nicht kursiviert.

Wer weiss eine Lösung?

Danke!

Hans List
Helmut Weber
2007-11-28 13:10:58 UTC
Permalink
Hallo Hans,

versuchs mal mit dem Textretrievalmode-Objekt:

Sub Test44()
With ActiveDocument.Range.TextRetrievalMode
.IncludeFieldCodes = True
End With
End Sub

Kann's aber jetzt nicht testen.


--

Gruß

Helmut Weber, MVP WordVBA

Vista Small Business, Office XP
Hans List
2007-11-29 07:42:06 UTC
Permalink
Hallo Helmut,
Post by Helmut Weber
Sub Test44()
With ActiveDocument.Range.TextRetrievalMode
.IncludeFieldCodes = True
End With
End Sub
Kann's aber jetzt nicht testen.
Schade: klappt nicht. Wäre eine interessante Lösung gewesen ;-).

Ich hatte auch hier angefragt:

microsoft . public . word . vba

Scheint aber nicht viel los zu sein.

Hier meine eigenen 2 Lösungsvorschläge aus meinem dortigen Posting:

What I can think of are two solutions:

1. Search for <i>. On found:
2. Turn expansion mode on
3. Search for </i>
4. Make the selection italics
5. Etc.
6. Remove the code pairs.

Or:

1. Search for <i>. On found:
2. Define a range until the next </i>, how?

Wie siehst Du das?

Besten Dank!

Hans List
Hans List
2007-11-29 07:59:04 UTC
Permalink
Wie wäre es mit diesem WorkAround ;-):

Sub AlleFelderKursivieren()
Dim aField As Field

For Each aField In ActiveDocument.Fields
If aField.Type = wdFieldRef Then
aField.Select
Selection.Font.Italic = True
End If

Next aField


End Sub
Thomas Gahler
2007-11-29 08:18:36 UTC
Permalink
Hallo Hans

Schau mal ob der Hinweis von Christian was taugt für dich

- Text zwischen Tags finden und bearbeiten
http://www.chf-online.de/vba/vbafindreplace.htm
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP2), Office XP (SP3)
Christian Freßdorf
2007-11-29 08:13:42 UTC
Permalink
Hallo Hans

ausgehend von den Links
http://www.chf-online.de/vba/vbafindreplace.htm
http://www.chf-online.de/vba/vbafindreplace2.htm

hab ich mal das Löschen der Tags eingebaut:

Option Explicit

Function fkt_Search2(strStart As String, strEnd As String, strAktion As String, Optional bInclude As Boolean = False)
Dim rng As Range
Dim rng2A As Range, rng2E As Range
Dim rngText As Range
' Range festlegen
Set rng = ActiveDocument.Range
' Range festlegen
Set rngText = ActiveDocument.Range(0, 0)
rngText.Collapse wdCollapseStart
' Such-Schleife
With rng.Find
.Format = False
.Text = strStart
' Suche nach Start-Tag
.Execute
Do While .Found = True
' Fundstelle mit Start-Tag anlegen
rngText.SetRange rng.Start, rng.End
' Suchtextbereich reduzieren
rng.SetRange rng.End, ActiveDocument.Range.End
' Suche nach End-Tag
.Execute FindText:=strEnd, Forward:=True
' Abbruch wenn kein End-Tag
If .Found = False Then Exit Function
' Fundstelle bis End-Tag erweitern
rngText.SetRange rngText.Start, rng.End
rngText.Select
If bInclude = True Then
' mit Tags
' Beispiel: Kursiv,Fett,Unterstrichen...
Select Case strAktion
Case "Kursiv"
rngText.Font.Italic = True
Case "Fett"
rngText.Font.Bold = True
Case "Unterstrichen"
rngText.Font.Underline = wdUnderlineSingle
End Select
ElseIf bInclude = False Then
' ohne Tags, Tags löschen
' Beispiel: Kursiv,Fett,Unterstrichen...
Set rng2A = ActiveDocument.Range(0, 0)
Set rng2E = ActiveDocument.Range(0, 0)
rng2E.SetRange rngText.End - Len(strEnd), rngText.End
rng2E.Select
rngText.SetRange rngText.Start, rng.End
rng2A.SetRange rngText.Start, rngText.Start + Len(strStart)
rng2A.Select
rngText.SetRange rngText.Start + Len(strStart), rngText.End - Len(strEnd)
Select Case strAktion
Case "Kursiv"
rngText.Font.Italic = True
Case "Fett"
rngText.Font.Bold = True
Case "Unterstrichen"
rngText.Font.Underline = wdUnderlineSingle
End Select
rng2E.Delete 'Start-Tag löschen
rng2A.Delete ' End-Tag löschen
End If
' Suchtextbereich zur Endposition reduzieren
rng.Collapse wdCollapseEnd
' Start-Tag suchen
.Execute FindText:=strStart, Forward:=True
Loop
rng.Collapse wdCollapseEnd
End With
End Function
Sub Aufruf()
'Function, Start-Tag, End-Tag, Aktion, Tag behalten
fkt_Search2 "<i>", "</i>", "Kursiv", False
End Sub

HTH
--
Gruß Christian
~~~~~~~~~~~~
Antworten / Rückmeldungen nur in die NG!
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
Thomas Gahler
2007-11-29 08:24:04 UTC
Permalink
HalloChristian

Da warst du ja zwei Minuten schneller als ich ;-(
Post by Christian Freßdorf
Select Case strAktion
Case "Kursiv"
rngText.Font.Italic = True
Darf ich hier noch einen Verbesserungsvorschlag anbringen?
- Verwende eine Enum für deine Möglichkeiten, diese ein bisschen clever
setzen, dann kann man die auch addieren (Kursiv + Unterstrichen). Kannst
dann aber keine Selct Case mehr verwenden sondern jede Möglkilchkeit muss
mit einem If abgefragt werden.
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP2), Office XP (SP3)
Hans List
2007-11-29 10:17:14 UTC
Permalink
Post by Thomas Gahler
HalloChristian
Da warst du ja zwei Minuten schneller als ich ;-(
Post by Christian Freßdorf
Select Case strAktion
Case "Kursiv"
rngText.Font.Italic = True
Darf ich hier noch einen Verbesserungsvorschlag anbringen?
- Verwende eine Enum für deine Möglichkeiten, diese ein bisschen clever
setzen, dann kann man die auch addieren (Kursiv + Unterstrichen). Kannst
dann aber keine Selct Case mehr verwenden sondern jede Möglkilchkeit muss
mit einem If abgefragt werden.
Hallo Thomas und Christian,

hoffe diese Antwort kommt durch (Thunderbird ist für NEWS nicht sehr
zuverlässig). Erst einmal herzlichen Dank.

Thomas, verstehe ich Dich richtig, daß Du eine Möglichkeit ansprichst
die für sämtliche HTML-Formattierungen (<b>, <i>, <u>, <sub> und <sup>)
funktionieren würde?

Danke!

Hans List
Thomas Gahler
2007-11-29 10:43:31 UTC
Permalink
Hallo Hans
Thomas, verstehe ich Dich richtig, daß Du eine Möglichkeit ansprichst die
für sämtliche HTML-Formattierungen (<b>, <i>, <u>, <sub> und <sup>)
funktionieren würde?
Das kannst du ja mit den Möglichkeiten von Christiansvorschlag schon machen

fkt_Search2 "<i>", "</i>", "Kursiv", False
fkt_Search2 "<b>", "</b>", "Kursiv", False
usw.
Du musst einfach je Kombination einzelen aufrufen, oder du packst diese mal
in ein Array rein und dann kannst du eine Schleife verwenden, oder du nimmst
eine kleine Textdatei welche die Kombinatioinen extrern enthält.


Aber ich habe eher daran gedacht, dass beim aktuellen Vorschlag keine
Möglichkeit besteht zwei Formatierungen zu setzen.
fkt_Search2 "<b>", "</b>", "Kursiv und Unterstrichen", False
das geht nicht, wenn mit einer Enum gearbeitet wird, dann könnte dies dann
aber klappern.

PseudeoCode
Enum eFormatierung
eFormatFett = 1
eFormatKursiv = 2
eFormatUnterstrichen = 4
end enum
'...


der Aufruf wäre dann so
fkt_Search2 "<b>", "</b>", eFormatKursiv + eFormatUnterstrichen, False
'...

und die Verarbeitung müsste dann so aussehen
if (action AND eFormatKursiv) = eFormatKursiv then
....italic= true
else
....italic = false
endif
if (action AND eFormatKursiv) = eFormatFett then
....bold = true
else
....bold = false
endif
'...
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP2), Office XP (SP3)
Lesen Sie weiter auf narkive:
Loading...