Best Practices > Diskussionen zu Best Practices
COM-Schnittstelle MS Word
Axel:
Sehr oft wird hier im Forum danach gefragt wie kann ich Daten in ein Worddokument einfügen oder wie erstelle ich einen Serienbrief.
Ich möchte, alternativ zu diesem Thread COM-Schnittstelle MS Excel, das gleiche für Word zusammentragen und daraus eine Klasse und/oder einzelne Funktionen in einer Scriptlibrary erstellen.
Ich freue mit schon auf zahlreiche Beiträge. Auch hier bitte für eine bessere Übersicht pro Funktion eine Antwort.
Axel
Axel:
Hier gleich mal eine Klasse mit einigen Grundfunktionen.
--- Code: ---'--- Deklaration von API-Funktionen ---
Declare Function SetActiveWindow Lib "user32" Alias "SetActiveWindow" (Byval Hwnd As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (Byval Hwnd As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (Byval ClassName As String, Byval lpWindowName As Long) As Long
'--- Klasse cWord Klasse mit Grundfunktionen
Class cWord
objWord As Variant
'Kontruktor - Prozedur
Sub New
Set objWord = Nothing
On Error Resume Next
Set objWord = GetObject("", "Word.Application")
If Err = 208 Then ' Fehler 208 tritt auf wenn Word noch nicht läuft
Err = 0
Set objWord = CreateObject("Word.Application")
objWord.Visible = True 'Word sichtbar machen
End If 'If Err = 208 Then
End Sub
'Destruktor-Prozedur
Sub Delete
Set objWord = Nothing
End Sub
'Beendet Word
Sub CloseWord
objWord.Quit 0
End Sub
'Bringt Word als Vollbild in den Vordergrund
Sub ActivateWord
Dim hWnd As Long
objWord.WindowState = 1 ' Application - Fenster auf Vollbild
hWnd = FindWindow("OPUSAPP", 0) 'Handle auf Wordfenster
If hWnd = 0 Then Exit Sub
Call SetActiveWindow(hWnd)
Call SetForegroundWindow(hWnd)
End Sub
'Neues Dokument auf Basis einer Vorlage erstellen. Name wird als Parameter übergeben.
Sub CreateNewDoc (strVorlage As String)
objWord.Documents.Add Rtrim$(strVorlage), False
End Sub
'Einfügen eines Textbausteins an einer Textmarke
Sub InsertAutoTextAtBM(strMarke As String, strTextbaustein As String)
objWord.ActiveDocument.Bookmarks(strMarke).Select ' Zu Textmarke springen
objWord.ActiveDocument.AttachedTemplate.AutoTextEntries(Cstr(strTextbaustein)).Insert(objWord.Selection.Range)
End Sub
'Einfügen eines Textbausteins in Fußzeile
Sub InsertAutoTextInFooter(strText As String)
'Geteilte Darstellung aufheben
If objWord.ActiveWindow.View.SplitSpecial <> wdPageNone Then
objWord.ActiveWindow.Panes(2).Close
End If 'If objWord.ActiveWindow.View.SplitSpecial <> wdPageNone Then
'Wenn nicht Seitenlayout angezeigt wird, das umschalten auf Ansicht Seitenlayout
If objWord.ActiveWindow.ActivePane.View.Type = wdNormalView Or _
objWord.ActiveWindow.ActivePane.View.Type = wdOutlineView Or _
objWord.ActiveWindow.ActivePane.View.Type = wdMasterView Then
objWord.ActiveWindow.ActivePane.View.Type = wdPageView
End If 'If objWord.ActiveWindow.ActivePane.View.Type = wdNor...
'Anzeigen der Fußzeile
objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
If objWord.Selection.HeaderFooter.IsHeader = True Then
objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
Else
objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
End If 'If objWord.Selection.HeaderFooter.IsHeader = True Then
'Textbaustein in Fußzeile einfügen
objWord.ActiveDocument.AttachedTemplate.AutoTextEntries(Cstr(strText)).Insert(objWord.Selection.Range)
If objWord.ActiveWindow.View.SplitSpecial = wdPageNone Then
objWord.ActiveWindow.ActivePane.View.Type = wdNormalView
Else
objWord.ActiveWindow.View.Type = wdNormalView
End If 'If objWord.ActiveWindow.View.SplitSpecial = wdPageNone Then
End Sub
'Setzen der Schriftart, derSchriftgröße und verschiedener Attribut
Sub SetFontAttributes(strFont As String, intSize As Integer, intBold As Integer, intItalic As Integer, intUnderline As Integer)
With objWord.Selection.Font
.Name = Cstr(strFont) 'Schriftart
.Size = intSize 'Schriftgröße
.Bold = intBold 'Fett
.Italic = intItalic 'Kursiv
.Underline = intUnderline 'Unterstreichen
End With
End Sub
'Einfügen von Texten, die als Parameter übergeben werden, in Formularfelder.
Sub InsertInField(strFeld As String, strText As String)
objWord.ActiveDocument.FormFields(Cstr(strFeld)).Result = strText
End Sub
'Einfügen eines Textes an einer Textmarke
Sub InsertAtTM(strMarke As String, strText As String)
objWord.ActiveDocument.Bookmarks(strMarke).Select ' Zu Textmarke springen
objWord.Selection.TypeText strText ' text an Cursorposition einfügen
End Sub
'Einfügen eines Textes an aktuelle Cursorposition
Sub Insert(strText As String)
objWord.Selection.TypeText strText ' Text an Cursorposition einfügen
End Sub
'Springen zu einer Textmarke
Sub GotoTM(strMarke As String)
objWord.ActiveDocument.Bookmarks(strMarke).Select ' Zu Textmarke springen
End Sub
'Einfügen von einem oder mehreren Zeilenumbrüchen
Sub NewLine(intCount As Integer)
Dim i As Integer
For i = 1 To intCount
objWord.Selection.TypeParagraph ' Zeilenschaltung einfügen
Next 'For i = 1 To intCount
End Sub
'Ausführen eines Makros
Sub RunMacro (strMakro As String)
'Abfrage ob Dokument geschützt ist. Wenn ja, muß er vorher aufgehoben werden.
'Es darf kein Passwort vorhanden sein
If objWord.ActiveDocument.ProtectionType <> wdNoProtection Then
objWord.ActiveDocument.Unprotect
objWord.Run strMakro
'Dokumentenschutz wieder einschalten
objWord.ActiveDocument.Protect wdAllowOnlyFormFields, True, ""
Else
objWord.Run strMakro
End If
End Sub
'Ausführen einens Makros mit Übergabe eines Parameters
Sub RunMacroEx (strMakro As String, strParam As String)
'Abfrage ob Dokument geschützt ist. Wenn ja, muß er vorher aufgehoben werden
'Es darf kein Passwort vorhanden sein
If objWord.ActiveDocument.ProtectionType <> wdNoProtection Then
objWord.ActiveDocument.Unprotect
Call objWord.Run(strMakro, strParam)
'Dokumentenschutz wieder einschalten
objWord.ActiveDocument.Protect wdAllowOnlyFormFields, True, ""
Else
Call objWord.Run(strMakro, strParam)
End If
End Sub
End Class 'Class cWord
--- Ende Code ---
Dazu gehört noch eine Library den benötigten Word-Konstanten. Diese muss mit
Use "Word-Konstanten"
im [Options] - Abschnitt der Lib für die Klasse eingebunden werden. Die Lib mit den Konstanten ist im Anhang zu finden.
Eine detaillierte Auflistung der Word-Konstanten ist hier zu finden.
Axel
ata:
... da kann ich auch noch einiges beitragen...
Toni
Fedaykin:
Hi zusammen
Wenn es wem hilft helfe ich auch bei dem Teil.
Sonst folgendes:
-Mit Select und Selection arbeiten ist oft nicht so toll (sinnlose rumhüpferei, mit Range arbeiten ist besser)
-Textmarken in Kopf-/Fusszeile ausfüllen ist auch so Sache für sich (Stichwort: StoryRanges)
-Formfields ausfüllen kann auch gemein werden (mehr als bestimmte Anzahl Zeichen und CRLF), gibt aber Trick.
Also meldet euch wenn an meiner Hilfe interessiert.
Gruss
Remo
koehlerbv:
Natürlich sind wir interessiert!
Danke im Voraus, Remo.
Bernhard
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln