| Autor |
Nachricht |
lugra
Einsteiger

Verfasst am: 22. Jun 2009, 15:18 Rufname:
Wohnort: Basel
|
|
| Version: Office 2007 |
|
Hallo,
ich möchte gerne in einem längeren Worddokument mehrere Indices eintragen. Ausgangslage ist ein 300-seitiges Word 2007 Dokument mit farblich beleuchteten Wörtern/Begriffen:
türkis beleuchtet = Personenverzeichnis
rot beleuchtet = Ortsverzeichnis
gelb beleuchtet = Sachverzeichnis
-> mit "beleuchtet" meine ich die Texthervorhebungsfarbe
Da ich bisher keine befriedigende Lösung finden konnte, versuchte ich mich selber in VBA-Programmierung -- mein erstes Projekt. Leider bricht mein Skript mit Laufzeitfehler 5850 ab:
| Code: |
Sub MultipleIndices()
'Makro zur Erstellung von mehrere (z.Z. 3) Indices
'Die Einträge müssen farblich markiert sein
'Farbdefinitionen
'****************
Const wdRot = wdColorRed
Const wdTurkis = 3
Const wdGelb = 6
Const wdKeinhighlight = 0
'zugehörige Indextypen
'*********************
Const TypRot = "Ortsverzeichnis"
Const TypTurkis = "Personenverzeichnis"
Const TypGelb = "Sachverzeichnis"
'Word-Dokument
'*************
Const Pfad = "H:\VBA\"
Const Datei = "Lorem"
Const Endung = ".docx"
'Variablen
'*********
Dim Eintrag As String
Dim AnzRot As Integer
Dim AnzTurkis As Integer
Dim AnzGelb As Integer
'Öffnen des Dokumentes
'*********************
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open(Pfad & Datei & Endung)
Set objRange = objDoc.Range
'Suchen der Markierten Wörter
'****************************
objRange.Find.Highlight = True
objRange.Find.Forward = True
AnzRot = 0
AnzTurkis = 0
AnzGelb = 0
'Do While objRange.Find.Execute
' If objRange.HighlightColorIndex = wdRot Then
' objRange.HighlightColorIndex = wdKeinhighlight
'
' Eintrag = objRange
'
' objDoc.Indexes.MarkEntry Range:=Selection.Range, Entry:= _
' TypRot & ":" & Eintrag, EntryAutoText:=TypRot & ":" & Eintrag, _
' CrossReference:="", CrossReferenceAutoText:="", BookmarkName:="", Bold:= _
' False, Italic:=False
'
' AnzTurkis = AnzRot + 1
'
' End If
' intPosition = objRange.End
' objRange.Start = intPosition
'Loop
Do While objRange.Find.Execute
If objRange.HighlightColorIndex = wdTurkis Then
objRange.HighlightColorIndex = wdKeinhighlight
Eintrag = objRange
objDoc.Indexes.MarkEntry Range:=Selection.Range, Entry:= _
TypTurkis & ":" & Eintrag, EntryAutoText:=TypTurkis & ":" & Eintrag, _
CrossReference:="", CrossReferenceAutoText:="", BookmarkName:="", Bold:= _
False, Italic:=False
AnzTurkis = AnzTurkis + 1
End If
intPosition = objRange.End
objRange.Start = intPosition
Loop
'Do While objRange.Find.Execute
' If objRange.HighlightColorIndex = wdGelb Then
' objRange.HighlightColorIndex = wdKeinhighlight
'
' Eintrag = objRange
'
' objDoc.Indexes.MarkEntry Range:=Selection.Range, Entry:= _
' TypGelb & ":" & Eintrag, EntryAutoText:=TypGelb & ":" & Eintrag, _
' CrossReference:="", CrossReferenceAutoText:="", BookmarkName:="", Bold:= _
' False, Italic:=False
'
' AnzTurkis = AnzGelb + 1
'
' End If
'' intPosition = objRange.End
' objRange.Start = intPosition
'Loop
'Ausgabebox mit Informationen
'****************************
MsgBox Prompt:="Es wurden " & AnzTurkis & " Einträge ins Personenverzeichnis, " & AnzRot & " Einträge ins Ortsverzeichnis und " & AnzGelb & " Einträge ins Sachverzeichnis eingefügt.", Title:="LugraSkript", Buttons:=vbInformation
'Speichern und schliessen
'************************
objDoc.SaveAs FileName:=Pfad & Datei & "mitIndices" & Endung
objDoc.Close
End Sub
|
Der Fehler tritt in der Zeile mit | Code: | | objDoc.Indexes.MarkEntry | auf. Ich denke, dass die Anwendung auf das aktuelle Dokument objDoc nicht auf diese Weise gemacht werden kann. Kann mir da jemand einen Tipp geben?
Vielen Dank!
- Lukas
|
|
lugra
Einsteiger

Verfasst am: 24. Jun 2009, 08:44 Rufname:
Wohnort: Basel
|
| |
| Version: Office 2007 |
|
Eine kleine Ergänzung zu meiner ursprünglichen Frage: Ersetze ich die Zeile | Code: | | Set objDoc = objWord.Documents.Open(Pfad & Datei & Endung) | durch | Code: | | Set objDoc = ActiveDocument | so läuft das VBA ohne Laufzeitfehler durch, wenn auch mit dem Nachteil, dass ich damit das Makro in das zu bearbeitende Dokument kopieren muss. Allerdings ist noch ein Fehler im Programm: Die Indexeinträge werden nicht nach jedem markierten Wort/Ausdruck eingefügt, sondern alle genau dort, wo sich zu Beginn der Cursor befand, also beispielsweise am Anfang des Dokumentes. Kann mir diesbezüglich jemand weiterhelfen?
- Lukas
|
|
lugra
Einsteiger

Verfasst am: 26. Jun 2009, 08:38 Rufname:
Wohnort: Basel
|
|
| Version: Office 2007 |
|
Hmm, hat mir gar niemand einen Vorschlag? Wahrscheinlich ist die Frage zu schwierig, zu einfach oder einfach zu langweilig...
- Lukas
|
|
Lisa
Moderator; Word seit Word 5.0 (für DOS)

Verfasst am: 26. Jun 2009, 22:21 Rufname:
Wohnort: Leipzig
|
|
| Version: Office 2007 |
|
Hallo Lukas,
Du kannst ActiveDocument auch verwenden, ohne das Makro in das Dokument zu kopieren. Speicher das Makro in einer Dokumentvorlage, die Dokumentvorlage natürlich im Vorlagenverzeichnis von Word abspeichern.
Dann weise dem Dokument diese Dokumentvorlage explizit zu. Danach hat das Dokument Zugriff auf die in der Dokumentvorlage vorhandenen Makros, ActiveDocument liefert dann einen Zeiger auf das Dokument (nicht auf die Dokumentvorlage), ohne dass das Dokument selbst irgendwelchen Code enthalten muss. Das ist übrigens die Standardvorgehensweise in Word.
(Nur nebenbei: Will man in dieser Konstellation explizit die Vorlage ansprechen, müsste man ThisDocument verwenden.)
Gruß
Lisa
|
|
lugra
Einsteiger

Verfasst am: 27. Jun 2009, 11:45 Rufname:
Wohnort: Basel
|
|
| Version: Office 2007 |
|
Hallo Lisa,
vielen Dank für den Tipp. Das funktioniert ausgezeichnet. Ich war mir nicht bewusst, dass dies die Standardvorgehensweise ist. (Ich dachte, dass ich mir eher eine separate *.docm-Datei mit all meinen Makros anlegen sollte.)
Das Skript läuft nun grundsätzlich, macht aber eines noch falsch: Alle Indexeinträge erfolgen an der Stelle, wo gerade der Cursor stand, als das Skript aufgerufen wurde. Stattdessen sollten sie natürlich jeweils gerade nach dem indizierten Wort/Ausdruck erfolgen. Da habe ich wohl noch einen Überlegungsfehler gemacht...?
Vielen Dank & Grüsse,
Lukas
|
|
Lisa
Moderator; Word seit Word 5.0 (für DOS)

Verfasst am: 27. Jun 2009, 13:23 Rufname:
Wohnort: Leipzig
|
|
| Version: Office 2007 |
|
Hallo Lukas,
ja, das ist klar. Die Quelle des Indexeintrags wird mit der Range-Eigenschaft festgelegt:
| Code: | objDoc.Indexes.MarkEntry Range:=Selection.Range, Entry:= _
TypTurkis & ":" & Eintrag, EntryAutoText:=TypTurkis & ":" & Eintrag, _
CrossReference:="", CrossReferenceAutoText:="", BookmarkName:="", Bold:= _
False, Italic:=False |
Bei Dir steht immer:
| Code: | | Range:=Selection.Range |
Das ist die Stelle, an der die aktuelle Markierung zu Beginn stand (die Selection). Dort sollte etwa stehen:
damit es sich wirklich auf den gefundenen Ort bezieht.
Ansonsten vielleicht noch zur Erläuterung: Jedes Dokument, das einen Verweis auf eine Dokumentvorlage erhält, kann auf alle in der Dokumentvorlage gespeicherten Makros, Schnellbausteine, Formatvorlagen usw. zugreifen. Die "Standardvorgehensweise" bezieht sich darauf, dass man ein neues Dokument gleich aus der Vorlage erstellt (über Datei - Neu und Auswahl der Vorlage). Damit hat man bereits den Verweis, hat ein sauberes Dokument ohne Code und natürlich auch mit allem statischen Text, der evtl. in der Dokumentvorlage hinterlegt ist.
Weiter gibt es noch sogenannte globale AddIns. Ein globales AddIn ist auch eine Dokumentvorlage, die jedoch nicht im Vorlagenverzeichnis von Word, sondern im AutoStart-Verzeichnis (Startup-Verzeichnis) gespeichert wird. Mit diesem Speicherort wird sichergestellt, dass dieses AddIn (Vorlage) beim Start von Word geladen wird. Seine Schnellbausteine und Makros stehen allen Word-Dokumenten in der aktuellen Sitzung zur Verfügung. Ein AddIn kann also so etwas wie eine Code-Bibliothek sein. Das ist durchaus auch sinnvoll.
Ich habe für mich da durchaus eine Struktur. Es gibt ein globales AddIn, das den Code, Userforms und Autotexte enthält, die ich IMMER zur Verfügung haben will. Zusätzlich gibt es einzelne Dokumentvorlagen, die nur den Code/Bausteine enthalten, der nur in den Dokumenten benötigt wird, die aus dieser Dok-Vorlage erzeugt werden. Es lohnt sich durchaus, darüber nachzudenken, wo welcher Code wirklich benötigt wird.
Und zur Vollständigkeit: Es gibt außerdem noch COM-AddIns, die nicht in Word erzeugt werden, sondern mit Fremdanwendungen (etwa VSTO), diese enthalten dann kompilierten Code, der nur benutzt werden kann.
Gruß
Lisa
|
|
lugra
Einsteiger

Verfasst am: 29. Jun 2009, 09:11 Rufname:
Wohnort: Basel
|
| |
| Version: Office 2007 |
|
Hallo Lisa,
vielen Dank für alle Erklärungen, auch jene über die AddIns (klingt praktisch!).
Du hast den Fehler genau gefunden. Allerdings muss es nicht Range:=Eintrag sondern heissen. An einem kleinen Textdokument konnte ich es bereits überprüfen und es funktioniert ausgzeichnet! Heute steht nun der Test am Buch mit 300 Seiten mit insgesamt über 3000 Indexeinträgen bevor.
Mit den Farbdefinitionen stehe ich noch ein wenig auf Kriegsfuss, aber das bekomme ich noch hin. Sobald das Skript dann ganz perfekt funktioniert, poste ich es nochmals komplett hier ins Forum, damit alle etwas davon haben.
Danke für Deine Hilfe & viele Grüsse,
Lukas
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten Du kannst Dateien in diesem Forum herunterladen
|
|
|
|
|