Microsoft Word mit VBA programmieren
Sub Example() Dim r As Revision Dim i As Integer Dim j As Integer For i = 1 To ActiveDocument.Paragraphs.Count If ActiveDocument.Paragraphs( i ).Range.Revisions.Count > 0 Then For j = 1 To ActiveDocument.Paragraphs( i ).Range.Revisions.Count ' ignore type 11 ? Debug.Print ActiveDocument.Paragraphs( i ).Range.Revisions( j ).Author : Next : EndIf : Next : End Sub
Bereitstellen der Objektbibliothek Word
Damit Word programmiert werden kann, muß die Objektbibliothek Word als Verweis mit einem Häkchen versehen sein. Dies ist normalerweise bereits der Fall, wenn VBA von Word aus aufgerufen wurde. Ansonsten kann in der Oberfläche von VBA im Extras -Menü der EIntrag „Verweise … “ aktiviert werden. Dort sollte dann ein Häkchen vor der Objektbibliothek Word gesetzt werden. Der genaue Name dieser Bibliothek in der Liste der Verweise hängt von der verwendeten Version von Word ab. Bei Word 2000 lautet er beispielsweise „Microsoft Word 9.0 Object Library “, bei späteren Versionen ist die Zahl „9“ wahrscheinlich durch eine größere Zahl ersetzt.
Das Objekt der Anwendung Word
Die Bibliothek Word enthält ein Objekt »Word.Application«, welches eine eventuell gerade laufende Word-Anwendung repräsentiert.
Überprüfen des Zugriffs auf das Word -Objekt
Wenn bei der Ausgabe von »Word.Application« ein Text erscheint, so ist wahrscheinlich die richtige Bibliothek verwendbar.
- Direktbereich
? Word.Application Microsoft Word
Unter Umständen kann das Objekt auch ohne Qualifikation bezeichnet werden.
- Direktbereich
? Application Microsoft Word
Das Objekt »Word.Application.Selection«
Das Objekt »Word.Application.Selection« repräsentiert die „aktuelle Markierung“. Dies ist entweder ein selektierter (markierter) Text, oder – wenn kein Text selektiert wurde – das Zeichen rechts von der Schreibmarke. Das Feld »Text« enthält die Zeichenfolge der Selektion.
- Direktbereich
? Word.Application.Selection.Text X
Unter Umständen kann das Objekt auch ohne Qualifikation bezeichnet werden. Die Eigenschaft »Text« ist die Fehleigenschaft des Objekts.
- Direktbereich
? Selection X
Durch Auslesen der Selektion kann Code einen Text verarbeiten, den der Benutzer zuvor durch Selektion festgelegt hat.
Durch eine Zuweisung an die Selektion kann Code den Text der Selektion verändern oder festlegen.
Das folgende Makro ersetzt den Text der Selektion durch »Desoxyribonukleinsäure«. Wenn kein Text selektiert ist, wird »Desoxyribonukleinsäure« an der Stelle der Schreibmarke eingefügt, als ob es gerade über die Tastatur eingegeben worden sei. Falls jemand das lange Wort „Desoxyribonukleinsäure“ öfter eingeben muß, könnte solch ein Makro eine Eingabeerleichterung darstellen.
- Code-Bereich
Sub DNS() Word.Application.Selection.Text ="Desoxyribonukleinsäure" End Sub
Das folgende Makro multipliziert eine selektierte Zahl mit 2,54, dem Faktor für die Umrechnung von Zoll in Zentimeter. Das geht aber nur, wenn zuvor auch eine Zahl im passenden Format selektiert wurde.
Code-Bereich
Sub ZentimeterAusZoll() Word.Application.Selection.Text = Word.Application.Selection.Text * 2.54 End Sub
Festlegen der Selektion
Das Festlegen der Selektion erfolgt nicht wie man denken könnte über das Selection-Objekt, sondern über die Select-Methode eines Range-Objekt.
Schreiben in ein Dokument
Das folgende Programmbeispiel zeigt beispielhaft einige Aufrufe zum Schreiben in das aktuelle Dokument.
With Selection .TypeText Text:="Absatz" .TypeParagraph .TypeText Text:="Zweiter Absatz -- " .Font.Bold = True .TypeText "Fettschrift" .Font.Bold = False .TypeText Text:="-- Fortsetzung." .Comments.Add Selection.Range, "Kommentar" .TypeParagraph .TypeText Text:="Dritter Absatz." .EndKey unit:=wdLine End With
Vordefinierte Standard-Dialog von Word
With Dialogs(wdDialogFormatFont) .DefaultTab = wdDialogFormatFontTabCharacterSpacing .Show End With .show = Standardfunktionalität .display = Spezialfunktionalität .execute = Standardverhalten With Dialogs(wdDialogFileSaveAs) .Name = “Yellow Paint Primer” .Show End With
Überschreiben von Standardprozeduren
(hat keine Entsprechung bei Excel)
z.B.:
FileClose
DocClose
Public Sub DocClose()
FileClose
End Sub
Public Sub FileClose()
MsgBox "test"
ActiveDocument.Close SaveChanges:=wdSaveChanges
End Sub
DocClose
FileClose
FileCloseOrExit
FileExit
vgl App event DocumentBeforeClose DocumentBeforeClose and DocumentBeforeSave , geht auch, wenn Standard-Subs umgangen werden, aber es wird auch von Problemen damit berichtet
private void wordApp_DocumentBeforeClose(Word.Document doc, ref bool cancel)
{
}
Document_Close event in Word 2010
Private Sub Document_Close()
MsgBox "Beispiel"
End Sub
Sub FileSave()
MsgBox "Datei Speichern"
End Sub
Kommandoliste: Tools > Macro > Macros...
CTRL+ALT+Num+ ergibt Mauszeiger, der das bei Auswahl anzeigt
Verschiedene Symbole der Oberfläche mit gleicher Bedeutung führen manchmal zu unterschiedlichen Prozedurnamen!
Das WordBasic-Objekt
WordBasic wurde mit Word97 durch VBA ersetzt.
Sub SortTest()
Dim text(2) As String
Dim i As Integer
text(0) = "ctrl"
text(1) = "alt"
text(2) = "num"
WordBasic.SortArray text()
Debug.Print text(0)
Debug.Print text(1)
Debug.Print text(2)
End Sub
Formulare in Word
Symbolleiste „Formular“, nicht „Steuerelemente-Toolsbox“
Sub Form1()
Dim X As String, Y As String
X = ActiveDocument.FormFields(1).Result
Y = ActiveDocument.FormFields(2).Result
MsgBox "Name = " & X & CHR$(10) & CHR$(13) & "DEM = ” & Y
End Sub
Datenübertragung zwischen Word und Excel
Einzelne Beispiele
' Application.Screenupdating = False Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Sub shrink() 'ctrl - Let ActiveWindow.ActivePane.View.Zoom.Percentage = ActiveWindow.ActivePane.View.Zoom.Percentage / 1.1 End Sub Sub grow() 'ctrl + On Error Resume Next Let ActiveWindow.ActivePane.View.Zoom.Percentage = ActiveWindow.ActivePane.View.Zoom.Percentage * 1.1 End Sub Sub restoreMySettings() ActiveWindow.View.ShowHiddenText = True CommandBars("Web").Visible = False End Sub Sub setMyOptions() Dim lResult As Long, lKeyValue As Long lResult = RegOpenKey(HKEY_CURRENT_USER, "Software\Microsoft\Office\9.0\Word\Data", lKeyValue) lResult = RegDeleteValue(lKeyValue, "Settings") lResult = RegCloseKey(lKeyValue) End Sub
Beispiel Kopieren eines Bereichs von Dokument zu Dokument
Sub Test() Dim A As New Word.Document Dim B As New Word.Document B.Select Selection.TypeText ("Beta") A.Paragraphs.first.Range.FormattedText = B.Paragraphs.first.Range.FormattedText End Sub
Gemeinsame Makros
Man kann Makros, welche von mehreren Dokumenten gemeinsam genutzt werden sollen, in eine Dokumentvorlage speichern, welche von den Dokumenten eingebungen wird.
Diese Dokumentvorlage kann zur besseren Übersicht auch versteckt werden.
Bei Laufzeitfehlern in einer versteckten Dokumentvorlage wird die Stelle des Fehlers aber dann nicht angezeigt; dazu muß die Dokumentvorlage dann explizit geladen werden.
Übungsaufgaben
Umlaute und Eszett durch ASCII ersetzen.
Interne Notizen
— Makros Documents.Open( "A" ) statt Documents( "A" ) in Web kopieren
— Auto-Start-Makros löschen
— Anpassungen entfernen
Private Sub createAndExecuteASub() Dim module As VBIDE.VBComponent Set module = ActiveDocument.VBProject.VBComponents( "Modul1" ) module.CodeModule.AddFromString _
"Public Sub macro1()" & vbCrLf & _
" Debug.Print ""macro1""" & vbCrLf & _
"End Sub" Application.Run MacroName:="Project1.Modul1.macro1" Set module = Nothing End Sub