Wenn Sie aus einem Browser-Fenster, aus einer HTML-Seite in Microsoft FrontPage oder einem anderen HTML-Fenster HTML-Text in die Zwischenablage kopiert haben, können Sie diesen in ein Microsoft Word-Dokument einfügen. Beim Einfügen bemüht sich Word, den HTML-Text möglichst originalgetreu wiederzugeben und die Formatierungen, Tabellen usw. so weit als möglich zu übernehmen.
Falls die Quelle Ihres HTML-Textes kein Zwischenablagen-Inhalt aus einem HTML-Fenster ist (also im Zwischenablagen-Format HTML), sondern Sie den HTML-Text selbst generieren und dieser dann als einfacher String vorliegt, können Sie diesen zwar auch in ein Word-Dokument einfügen - sowohl durch Zuweisung an die aktuelle Selection als auch über die Zwischenablage. Doch dann wird der Text nur als reiner Text eingefügt. Die HTML-Formatierung wird nicht erkannt und alle Tags werden im Dokument im Klartext dargestellt. Die naheliegendste Lösung (und offensichtliche auch einzige Möglichkeit) wäre nun, Ihren String im HTML-Format in die Zwischenablage zu verfrachten und ihn von dort aus in das Word-Dokument einzufügen.
Hierbei hilft Ihnen das DataObject aus der MSForms-Bibliothek. Sie können einer Instanz dieses DataObjects Daten unter Angabe einer beliebigen Format-Kennung übergeben - nicht nur in den geläufigen Standardformaten Text, RTF, Bitmap usw. - und von dort aus in die Zwischenablage verschieben. Die Format-Kennung für das HTML-Format liefert Ihnen die API-Funktion RegisterClipboardFormat. Dieser übergeben Sie den standardisierten Klartext-Namen des Formats, hier "HTML Format", und erhalten die Kennung als Rückgabewert. Es ist dabei unerheblich, ob das Format bereits registriert ist oder nicht - es wird nur einmal von Ihrer Anwendung registriert und die Funktion gibt bei jedem erneuten Aufruf die gleiche Kennung zurück.
Die Daten, die Sie nun so in die Zwischenablage verschieben können, müssen allerdings aufbereitet werden. Vor den eigentlichen HTML-Text müssen Sie einen Vorspann setzen, der eine Versions-Nummer enthält und die Position des zu übertragenden HTML-Textes innerhalb des gesamten Datenblocks spezifiziert. Für unsere Zwecke genügt es, lediglich unseren HTML-String übertragen zu wollen. Das HTML-Format ist zwar um einiges flexibler, doch darauf möchte ich hier nicht weiter eingehen. Es genügen die Angaben für StartHTML, EndHTML, StartFragment und EndFragment, wie Sie sie im untenstehenden Code der Prozedur HTMLToClipboard sehen. Der Wert zu StartFragment (Das Fragment ist unser HTML-String) enthält die Anzahl der Zeichen einschließlich der Zeile EndFragment. EndFragment soll dagegen die Anzahl der Zeichen bis zum Ende des darauffolgenden HTML-Strings enthalten. Wir fügen diesen daher an den Vorspann an, ermitteln nun die gesamte Länge des Strings und ersetzen mittels der Replace-Funktion den Platzhalter "°°°°°°" hinter EndFragment durch den auf sechs Stellen (das sollte auch für sehr umfangreiche HTML-Strings reichen) formatierten Wert der Gesamtlänge.
Nun instanzieren wir ein DataObject, leeren es ausdrücklich und übergeben den soeben generierten HTML-Datenblock mit der oben ermittelten Format-Kennung. Allerdings müssen wir diesen Datenblock im reinen Ascii-Byte-Format übergeben. Da aber VBA intern einen String im als Unicode-String verwaltet, ist der Datenblock zur Übergabe mit der Funktion StrConv aus dem Unicode-Format zu konvertieren. Zu guter Letzt veranlassen wir das DataObject über die Methode PutInClipboard noch dazu, den Datenblock endgültig in die Zwischenablage zu verschieben.
Private Declare Function RegisterClipboardFormat Lib "user32" _
Alias "RegisterClipboardFormatA" (ByVal lpString As String) _
As Long
Public Sub HTMLToClipboard(HTMLText As String)
Dim nCFHTML As Long
Dim nClipboardText As String
nCFHTML = RegisterClipboardFormat("HTML Format")
nClipboardText = "Version:0.9" & vbCrLf
nClipboardText = nClipboardText & "StartHTML:-1" & vbCrLf
nClipboardText = nClipboardText & "EndHTML:-1" & vbCrLf
nClipboardText = nClipboardText & "StartFragment:000081" & vbCrLf
nClipboardText = nClipboardText & "EndFragment:°°°°°°" & vbCrLf
nClipboardText = nClipboardText & HTMLText & vbCrLf
nClipboardText = Replace(nClipboardText, "°°°°°°", _
Format$(Len(nClipboardText), "000000"))
With New DataObject
.Clear
.SetText StrConv(nClipboardText, vbFromUnicode), nCFHTML
.PutInClipboard
End With
End Sub
Nun verbleibt nur noch die Aufgabe, den Zwischenablage-Inhalt in das Word-Dokument einzufügen. Sie können dies im Prinzip schlicht mit der folgenden Anweisung erledigen:
Selection.Paste
Doch sicherheitshalber sollten Sie die Methode PasteSpecial mit der FormatAngabe wdPasteHTML verwenden:
Selection.PasteSpecial , , , , wdPasteHTML
Die Hilfsprozedur PasteHTML vereinfacht dieses Aufruf ein wenig und gestaltet ihn insofern auch flexibler, als dass Sie sowohl das Selection-Objekt als auch jedes beliebige Range-Objekt übergeben können. Und wenn Sie im optionalen Parameter HTMLText den einzufügenden HTML-String gleich mit übergeben, sorgt die Prozedur selbst für das Einfügen des HTML-Strings in die Zwischenablage - Sie können sich so den separaten Aufruf der obenstehenden Prozedur HTMLToClipboard sparen.
Public Sub PasteHTML(Obj As Object, Optional HTMLText As String)
If Len(HTMLText) Then
HTMLToClipboard HTMLText
End If
If (TypeOf Obj Is Range) Or (TypeOf Obj Is Selection) Then
Obj.PasteSpecial , , , , wdPasteHTML
End If
End Sub
|