Dies ist die Word-Hilfe
sinnvolle Add-Ins finden sich bei:
weitere bei:
Letzere stehen in Zusammenhang mit den Arbeiten von Shauna Kelly.
siehe E-Books
Gründe können sein:
Typische Anpassungen von Menüband und Schnellzugriffs-Symbolleiste
Die .exportedUI-Datei kann mit jedem ASCII-Editor geöffnet werden. Allerdings sollte ein Editor den Vorzug erhalten, mit dem die Syntax hervorgehoben werden kann.
Ein sehr gut geeigneter Editor ist Notepad++. Zur geordneten Darstellung des Codes am besten XML als Sprache für die Syntaxhervorhebung wählen. Nun erscheinen Elementnamen, Attribute und Attributwerte in unterschiedlichen Farben. Beim Hineinklicken in ein Element werden Anfang und Ende des Elements hervorgehoben.
Bevor man die exportedUI-Datei inhaltlich bearbeitet, sollte sie formal aufbereitet werden und zwar mit dem Ziel, dass jedes Element in einer separaten Zeile steht.
Diese Datei kann nun inhaltlich verändert und anschließend wieder abgespeichert werden.
Grundsätzlich ist es möglich, im Editor z.B.
Nach dem Speichern kann die geänderte Datei erneut in Word (per Menüband anpassen
) importiert werden und alle Änderungen sind zu sehen.
Beispiele für Elemente:
Besonders gut: Mehrere exportedUI-Dateien können zusammengeführt werden! Z.B. kann man den Code, der zu einer Registerkarte gehört (beginnt mit <mso:tab …> und endet mit </mso:tab>), in der einen exportedUI-Datei kopieren und in einer anderen einfügen. Am besten danach unter neuem Namen abspeichern. Importiert man anschließend diese neue exportedUi-Datei in Word, so steht die Registerkarte zur Verfügung.
Es ist klar, dass alle Eingriffe nur sehr moderat vorgenommen werden sollten, damit die von Word erwartete Syntax nicht zerstört wird.
Achtung: Makros werden von Schnellzugriffsleiste oder Menüband aus ausschließlich über den eigentlichen Makronamen aufgerufen (im vorstehenden Beispiel „makro1“). D.h., sie müssen in eindeutiger Weise zur Verfügung stehen. Läuft ein Makro nicht oder falsch, so hat das mindestens einen der folgenden Gründe:
Die Tatsache, dass Makros ausschließlich über den eigentlichen Makronamen aufgerufen werden, bedeutet umgekehrt: im Code einer exportedUI-Datei ist nicht mehr als der Makroname nötig, um eine Verbindung zwischen Menüband/Schnellzugriffsleiste und Makro herzustellen!
Man kann also jedes beliebige Makro jederzeit mit Menüband/Schnellzugriffsleiste verknüpfen; man muss lediglich dafür sorgen, dass der Makroname im Code der exportedUI-Datei (genauer: im Code eines Makro-Buttons) steht und das Makro in der angefügten oder hinzugefügten Dokuvorlage enthalten ist.
Allerdings scheint es nicht möglich zu sein, einfach den Code eines einzelnen Makro-Buttons in der einen exportedUI-Datei zu kopieren und an beliebiger Stelle in einer anderen exportedUI-datei einzufügen. Jeder Button ist Teil einer Gruppe und diese wieder Teil einer Registerkarte. Der Code ganzer Registerkarten kann von einer exportedUI-Datei zu einer anderen übertragen werden, aber bei Gruppen und Buttons scheinen die internen Ids eine große Rolle zu spielen.
Nach dem Import in Word kann aber jede Registerkarte oder Gruppe mit den Word-eigenen Mitteln (Menüband anpassen
) nachbearbeitet werden. Das heißt, überflüssige Buttons können einfach entfernt werden.
Neben der Verwendung von .exportedUI-Dateien gibt es die Möglichkeit, Anpassungen von Menüband und Schnellzugriffsleiste direkt in einem Dokument oder einer Dokumentvorlage abzuspeichern. Insbesondere das Abspeichern in einer Dokumentvorlage hat den Vorteil, dass eine Anpassung sofort zur Verfügung steht, wenn ein Dokument mit der Dokumentvorlage per Anfügen
oder Hinzufügen
verbunden wird. Das heißt, neben einer Dokumentvorlage ist keine andere Datei mehr nötig, um mit Menübandanpassungen arbeiten zu können.
Nachteil dieses Verfahrens: Man muss tief in XML und VBA einsteigen. Man spricht auch von RibbonXML-Programmierung. Während die Erzeugung und die Verwaltung von .exportedUI-Dateien von fortgeschrittenen Word-Usern vorgenommen werden kann, ist die RibbonXML-Programmierung sehr fortgeschrittenen Word-Usern und Programmierern vorbehalten.
Unter https://docs.microsoft.com/de-de/office/vba/library-reference/concepts/customize-the-office-fluent-ribbon-by-using-an-open-xml-formats-file [aufgerufen am 26.12.2021] findet man eine brauchbare Anleitung zur Menübandanpassung auf Basis von XML:
>>
Die Menübandkomponente der Microsoft Office Fluent-Benutzeroberfläche verleiht Benutzern eine flexible Möglichkeit zum Arbeiten mit Office-Anwendungen. RibbonX verwendet einfaches, textbasiertes, deklaratives XML-Markup, um das Menüband zu erstellen und anzupassen. Das Codebeispiel in diesem Thema zeigt, wie Sie dem Menüband für ein einzelnes Dokument benutzerdefinierte Komponenten hinzufügen, anstatt Anpassungen auf Anwendungsebene hinzuzufügen. In den folgenden Schritten fügen Sie dem vorhandenen Menüband in Word eine benutzerdefinierte Registerkarte, eine benutzerdefinierte Gruppe und eine benutzerdefinierte Schaltfläche hinzu. Außerdem wird eine Rückrufprozedur definiert, die einen Firmennamen in das Dokument einfügt.
1. Erstellen Sie die Anpassungsdatei in einem beliebigen Text-Editor, und speichern Sie die Datei mit dem Namen customUI.xml.
2. Fügen Sie der Datei das folgende XML-Markup hinzu, und schließen und speichern Sie die Datei dann.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="CustomTab" label="My Tab"> <group id="SampleGroup" label="Sample Group"> <button id="Button" label="Insert Company Name" size="large" onAction="ThisDocument.InsertCompanyName" /> </group > </tab> </tabs> </ribbon> </customUI>
3. Erstellen Sie auf dem Desktop einen Ordner mit dem Namen customUI, und kopieren Sie die XML-Anpassungsdatei in den Ordner.
4. Überprüfen Sie das XML-Markup mit einem benutzerdefinierten Schema. (Hinweis: Dieser Schritt ist optional.)
5. Erstellen Sie ein Dokument in Word, und speichern Sie es mit dem Namen RibbonSample.docm.
6. Öffnen Sie den Visual Basic-Editor, und fügen Sie dem Codemodul „ThisDocument“ die folgende Prozedur hinzu. Schließen und speichern Sie das Dokument.
Sub InsertCompanyName(ByVal control As IRibbonControl) ' Inserts the specified text at the beginning of a range or selection. Dim MyText As String Dim MyRange As Object Set MyRange = ActiveDocument.Range MyText = "Microsoft Corporation" ' Range Example: Inserts text at the beginning ' of the active document MyRange.InsertBefore (MyText) ' Selection Example: 'Selection.InsertBefore (MyText) End Sub
7. Fügen Sie dem Dateinamen die Erweiterung ZIP hinzu, und doppelklicken Sie dann auf die Datei, um sie zu öffnen.
8. Fügen Sie die Anpassungsdatei dem Container hinzu, indem Sie den Ordner „customUI“ vom Desktop auf die ZIP-Datei ziehen.
9. Extrahieren Sie die RELS-Datei auf dem Desktop. Ein Ordner _rels, der die RELS-Datei enthält, wird auf den Desktop kopiert.
10. Öffnen Sie die RELS-Datei, und fügen Sie die folgende Zeile zwischen dem letzten Relationship-Tag und dem Relationships-Tag hinzu. Dadurch wird eine Beziehung zwischen der Dokumentdatei und der Anpassungsdatei erstellt.
<Relationship Id="someID" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml" />
11. Schließen und speichern Sie die Datei.
12. Fügen Sie den Rels-Ordner wieder zur Containerdatei hinzu, indem Sie ihn vom Desktop ziehen und die vorhandene Datei überschreiben.
13. Benennen Sie die Dokumentdatei in den ursprünglichen Namen um, indem Sie die Erweiterung “.zip„ entfernen.
14. Öffnen Sie das Dokument. Beachten Sie, dass im Menüband nun die Registerkarte My Tab angezeigt wird.
15. Wählen Sie die Registerkarte aus, und beachten Sie die Gruppe „Beispielgruppe“ mit einem Schaltflächensteuerelement.
16. Klicken Sie auf die Schaltfläche, um den Firmennamen in das Dokument einzufügen.
<<
Als wichtige Bestandteile werden also benötigt:
Die Anweisung „ByVal control As IRibbonControl“ im VBA-Code ist wichtig, sonst funktioniert die Schaltfläche nicht.
Getestet werden muss noch, ob der VBA-Code wirklich direkt dem Modul „This Document“ zugeordnet sein muss oder ob ein neues Modul mit benutzerdefiniertem Namen zugeordnet werden kann, auf das in der customUI.xls-Datei Bezug genommen werden kann.
Die Mini-Symbolleiste in Word 2007, 2010, 2013 und 2016 kann nicht verändert werden!
Mini-Symbolleiste in Word 2007: Der Schnellformatvorlagenkatalog ist in der ersten Menüzeile zugänglich.
Für Dokumente und Dokumentvorlagen werden die Standardspeicherorte in den Word-Optionen unter „Speichern“ festgelegt:
Achtung: Neuere Versionen von Word (getestet: 365 bzw. Word 24) und MathType (MT 7) verstehen sich wieder wie in alten Zeiten. Das heißt, in Word steht MathType über das Menüband zur Verfügung und die Umwandlung von Word-eigenen Formeln in MT-Formeln sowie umgekehrt funktioniert problemlos. |
Aus irgendwelchen Gründen hat Microsoft die Zusammenarbeit mit Design Science (dem MathType-Entwickler) aufgekündigt. Bereits seit Word 2007 hat Word einen eigenen Formeleditor (es hatte immer einen eigenen, aber in früheren Versionen fristete er ein absolutes Schattendasein; wobei mit diesem eigenen Formeleditor nicht die abgespeckte Version von MathType gemeint ist, die ab Word 97 zum Standard-Repertoire von Word gehörte; der „eigene“ Formeleditor geht noch auf DOS-Zeiten zurück). Der neue Word-eigene Formeleditor ist ein XML-Tool, das es in ähnlicher Form auch in OpenOffice und in GoogleDocs gibt. Wie diese ist er proprietär, d.h. er verträgt sich mit kaum etwas anderem. Weshalb dieser absolute Rückschritt von Microsoft vollzogen wurde, ist mir nicht klar und es gibt auch in den einschlägigen Foren keine Antwort darauf. Aber es scheint endgültig zu sein.
Konsequenz: Ab Word 2010 kann MathType nicht mehr wie gewohnt in Word eingebunden werden. D.h. u.a., dass MathType nicht in der Multifunktionsleiste erscheint und dass sämtliche von Design Science speziell für Word geschriebenen Makros nicht mehr laufen. Daher können nicht mehr alle in einem Text enthaltenen Formeln auf einen Schlag z.B. mit einer neuen Schrift versehen werden. Und Formeln (auch die des Word-eigenen Formeleditors!) lassen sich nicht mehr auf einfache Weise durchnummerieren. In Word 2007 war MathType noch vollkommen in Word integriert (obwohl das ja auch schon auf XML basiert). Erst mit der Version 2010 wurde ein radikaler Schnitt vorgenommen (genau wie hinsichtlich der Einbindung von Acrobat).
Anmerkung:
Zum Glück funktionieren bei allen Kombinationen aus Word ab 2007 und MathType ab 6.5 noch einige grundlegende Dinge:
Etwas umständlich ist die Nummerierung von Gleichungen:
Anmerkung:
Der eingebaute lässt auf den ersten Blick nur eine einzige Schrift zu. Man kann aber die Schrift einer Formel komplett (oder eines markierten Teils einer Formel) mit dem Befehl Normaler Text
, der sich links auf der Registerkarte Formeltools
befindet, in normale Schrift umwandeln. Danach kann man jede beliebige Schrift auf die Formal anwenden. Allerdings stimmen nun weder die Abstände noch die Kursivierung.
Eine andere und bessere Möglichkeit ist, die Standardschrift zu verändern, die von Formeln verwendet wird. Word bietet von hause aus nur die Cambria an, arbeitet aber perfekt mit einigen TeX-Schriften zusammen: Asana Math und XITS Math sind zwei solcher Schriften, die vom CTAN-Server heruntergeladen werden können. Nach dem Download einfach in den Fonts-Ordner des Systems kopieren. In Word kann man bei den Formeltools die Formeloptionen aufrufen und die Standardschrift einstellen.
Die Schriftgröße lässt sich immer nur für die komplette Formel, nicht für Formelteile, wählen - vorausgesetzt, man arbeitet mit der Standard-Formelschrift. Sind Formelteile in normalen Text umgewandelt (s.o.), so kann deren Schriftgröße unabhängig von der restlichen Formel eingestellt werden. Ob das sinnvoll ist (aus typografischen Gründen), mag dahingestellt sein.
Beim Platzieren in InDesign oder Importieren in FrameMaker kommen die Formeln als reine Grafiken rüber. D.h. eine nachträgliche Bearbeitung ist nicht möglich. Die Größe der Grafiken lässt sich zwar im jeweiligen Layoutprogramm verändern, aber „professionell“ kann diese Art der Weiterverarbeitung nicht genannt werden!
MathType-Formeln können dagegen nach wie vor als Einzeldateien abgespeichert und per Herausgeben und Abonnieren in InDesign oder FrameMaker eingebunden werden. Bei FrameMaker funktioniert sogar OLE. Dass es bei diesem professionellen Verfahren Probelem mit den Schriften geben kann, ist ein anderes Thema, dass bei MathType behandelt wird.
In der Standardeinstelllung können MathType-Formeln nicht im Word-eigenen Formel-Format kopiert oder abgespeichert werden; es ist lediglich möglich, eine MathType-Formel in den Baustein der Word-Formel einzufügen, sie bleibt dort aber ein MathType-Objekt. Das gilt, wie gesagt, für die Standardeinstellung. Aber auch hier (wie in der anderen Richtung von Word zu MathType) hilft MathML! In MathType kann bei den Einstellungen zum Ausschneiden/Kopieren zwischen drei MatML-Arten gewählt werden. Die für Word richtige ist MathML 2.0 (namespace attr):
Darüber hinaus bietet die Firma GrindEQ (www.grindeq.com) eine Konvertierungsmöglicheit an: Das Programm MathTypeToEquation (aufgepasst: nur die 32-bit-Version funktioniert zusammen mit einem 32-bit-Word 2010/2013; die 64-bit-Version von MathTypeToEquation harmoniert nur mit Word 2007 und älter!) klinkt sich in das Menüband ein, außerdem wird ein Speichern-unter-Filter in Word integriert. Über das Menüband kann man MT-Formeln einzeln konvertieren, die Speichern-Unter-Variante erlaubt die Konvertierung aller Formeln auf einmal. Beim Speichern-unter wird ein spezielles RTF-Format (GrindEQ-RTF) angeboten. Nach dem Speichern muss die Datei geschlossen werden. Wird diese RTF-Datei mit Word geöffnet, sind sämtliche Fromeln in das Format des Word-internen Formeleditors konvertiert.
Mit einem solchen Konverter (oder aber auf Basis der obigen MatML-Einstellung in MathType) können Personen, die MathType nicht besitzen, in die Lage versetzt werden, MathType-Formeln zu bearbeiten. Es gilt tatsächlich: Egal, ob MathType auf einem Rechner installiert ist oder nicht - Dokumente lassen sich immer so aufbereiten, dass enthaltene MT-Formeln anschließend mit den Word-eigenen Mitteln bearbeitet werden können.
Achtung: Neuere Versionen von Word (getestet: 365 bzw. Word 24) und MathType (MT 7) verstehen sich wieder wie in alten Zeiten. Das heißt, in Word steht MathType über das Menüband zur Verfügung und die Umwandlung von Word-eigenen Formeln in MT-Formeln sowie umgekehrt funktioniert problemlos. |
In Word-2010 gibt es die Funktion „Gruppierung“, mit der Komplexbilder (also solche, die aus übereinanderliegenden Einzelteilen bestehen) zu normalen Einfachbildern zusammengefügt werden können. Dazu einfach die Einzelteile bei gedrückter Umschalttaste markieren und dann den Befehl Menüband <Format - Anordnen - Gruppieren> aufrufen.
Achtung: Wenn ein Teilbild in der Zeile verankert ist, andere Teilbilder aber vor dem Text liegen, klappt bereits die gemeinsame Markierung nicht. Gemeinsam markieren lassen sich nur Bilder oder Grafiken, die vor dem Text liegen. D.h., bei in der Zeile verankerten Bildern muss man zunächst die Position ändern, so dass sie vor dem Text liegen. Dadurch verrutschen die Bilder und müssen erst wieder richtig angeordnet werden. Dann markieren und gruppieren, danach dann die Position des „Gruppenbildes“ auf „Mit Text in Zeile“ stellen.
Derartig aufbereitete Bilder werden korrekt in HTML und in EPUB bzw. MOBI umgewandelt!
Wird die docx-Datei durch anhängen von .zip in ein Archiv umgewandelt und werden die Bilder dort herauskopiert, so können sie in ein Layoutprogramm wie InDesign eingeladen werden. Es zeigt sich, dass dabei die Gruppierung, die in Word vorgenommen wurde, verlorengeht! Man muss also für die Weiterverarbeitung in Layoutprogrammen zu anderen Gruppierungsmitteln greifen. Am besten ist es, SnagIt zu verwenden, also einen Screenshot eines Komplexbildes zu machen; Vorteil von SnagIt: die Auflösung kann auf hohe Werte (z.B. 600 dpi) eingestellt werden. Eine andere Möglichkeit wäre, die Word-Datei in PDF umzuwandeln und dann mit dem Schnappschussswerkzeug zu arbeiten (vgl. PDF).
Anders als in älteren Versionen kann man in Word 2010/2013 mit dem Werkzeug 'Objekt markieren' nicht mehr einen Markierungsrahmen um mehrere Grafikobjekte auf einer Seite ziehen. Mit dieser alten Methode war es möglich, sämtliche grafischen Objekte auf einer Seite zu finden, selbst wenn wie so klein oder so formatiert (Rahmen, Füllung Schrift) waren, dass sie nicht gleich auffielen. Als Ersatz dafür gibt es jetzt den sog. Auswahlbereich. Dieser listet in einem separaten (verschiebbaren) Fenster alle Grafikobjekte auf einer Seite auf. Im Fenster kann man dann jedes Objekt, egal, wie es formatiert ist, anklicken, was zu einer Markierung im Dokument führt.
In Word lassen sich Bilder oder Grafiken grundsätzlich auf drei Weisen einfügen:
<hi>Erkenntnis: im professionellen Umfeld sollte nur die Includepicture-Feld-Variante genommen werden!</hi>
Geht nur über den Backstage-Bereich: Menüband <Datei - Informationen>, dann rechts unten „Verknüpfungen mit Dateien bearbeiten“: Es geht ein Fenster auf, in dem alle nötigen Einstellungen vorgenommen werden können.
Achtung: „Verknüpfungen mit Dateien bearbeiten“ steht erst dann Verfügung, wenn wenigstens ein Bild per „Verknüpfen“ eingefügt wurde.
Die Auflösung von Bildern in Word wird bestimmt von
Die meisten Bilder, die in Word eingefügt werden, sind ursprünglich separat, also mit einem anderen Programm, erzeugt worden. Solche Bilder haben bestimmte Formate (wie png, jpg, tif, eps, bmp usw.) und bestimmte Auflösungen (oft nicht bewusst gewählt, sondern vom jeweiligen Programm vorgegeben). Für einen professionellen Druck oder auch für ein E-Book sollte der Auflösungswert eines jeden Bildes bekannt sein, damit das Bild entsprechend weiterverarbeitet werden kann.
Am besten lässt man jedes Bild, das in Word eingefügt werden soll, zunächst über Photoshop laufen, um hier die Auflösung festzustellen und evtl. zu ändern. Auch das Bildformat und evtl. die Farbeinstellungen können in Photoshop kontrolliert und bei Bedarf geändert werden.
Was passiert beim Einfügen in Word, wenn ein Bild z. B. eine Auflösung von 300 dpi hat und in einem der Formate png, tif oder jpg vorliegt?
Die Standardeinstellung von Word steht auf 220 dpi. D.h., die Auflösung eines jeden Bildes wird automatisch auf 220 dpi reduziert, falls seine ursprüngliche Auflösung höher war! Spürbar wird der Effekt, sobald die Datei abgespeichert wird. Die Voreinstellung kann zum Glück verändert werden:
Das Setzen des Häkchens bewirkt, dass die Bilder ihre ursprüngliche Auflösung beibehalten. D.h., es sollte gesetzt werden, wenn es um professionelles Drucken oder das Erzeugen von hochaufgelösten PDFs geht!
Format | Auflösung nach dem Einfügen in Word (dpi) |
---|---|
gif | 72 |
jpg | 120 |
png | 150 |
tif: wird nicht angeboten | - |
Diese Effekte sind unabhängig von den Optionseinstellungen! D.h., selbst wenn das Häkchen bei „Bilder in Datei nicht komprimieren“ gesetzt ist, führt jedes Einbetten per „Inhalte einfügen“ zu diesen Werten.
Die höchste Auflösung per „Inhalte einfügen“ wird also mit dem png-Format erzielt.
Fazit: Grundsätzlich sollte auf den Weg über die Zwischenablage besser verzichtet werden, weil man Format und Auflösung nicht richtig im Griff hat. Auf jeden Fall sollte mit Blick auf eine professionelle Weiterverarbeitung zumindest das Häkchen bei „Bilder in Datei nicht komprimieren“ gesetzt werden!
Test haben ergeben, dass Bilder aus anderen Anwendungen (wie MathType, Photoshop, Illustrator, Corel Draw usw.) über die Zwischenablage hinsichtlich Format und Auflösung nicht kontrolliert werden können. Bilder aus Photoshop z.B. landen standardmäßig als Bitmaps (Format unbestimmt) in Word und haben eine Auflösung von 96 dpi - unabhängig von den Word-Optionen! D.h., bei Bildern aus anderen Anwendungen empfiehlt es sich, die Zwischenablage zu umgehen und die Bilder ausschließlich per Menüband <Einfügen - Grafik/Bilder - Einfügen> oder <Einfügen - Grafik/Bilder - Verknüpfen> in Word einzubinden.
Aktion | Format | Auflösung |
---|---|---|
1. Einbettung über Zwischenablage innerhalb von Word (also Copy und Paste innerhalb von Word) | ||
a) per Strg-v | Bild wird im Originalformat eingebettet, wobei mit „Originalformat“ das Format gemeint ist, dass es in Word vor dem Kopieren hat (jpg, png oder tif) | je nach Optionseinstellung 220, 150 oder 96 dpi oder Originalauflösung; Format hat keine Auswirkung auf Auflösung |
b) per „Inhalte einfügen“ | Bild wird im gewählten Format eingebettet | Auflösung von gewähltem Format abhängig: gif: 72 dpi, jpg: 120 dpi, png: 150 dpi; tif wird nicht angeboten; Optionseinstellungen spielen keine Rolle |
2. Einbettung über Zwischenablage aus anderen Anwendungen (also Copy in anderer Anwendung, Paste in Word) | Format kann nicht kontrolliert werden; Erfahrung: Bilder aus Photoshop landen immer als Bitmaps in Word | Auflösung kann nicht kontrolliert werden; Erfahrung: Bilder aus Photoshop haben immer 96 dpi. |
3. Einbettung über Menüband <Einfügen - Grafik/Bilder - Einfügen> | Bild hat immer Originalformat (also das Format der separaten Bilddatei) | je nach Optionseinstellung 220, 150 oder 96 dpi oder Originalauflösung; Format hat keine Auswirkung auf Auflösung |
4. Verknüpfung über Menüband <Einfügen - Grafik/Bilder - Verküpfen> | Bild hat immer Originalformat (also das Format der separaten Bilddatei) | Bild hat immer Originalauflösung |
Folgende Möglichkeiten bestehen:
Am schlechtesten ist der Weg über die Zwischenablage, weil (ähnlich wie beim Einfügen von Bildern in Word) keinerlei Kontrolle darüber ausgeübt werden kann, was mit Auflösung und Bildformaten passiert. Fazit: nicht verwenden!
Beim Speichern als Webseite legt Word einen separaten Bildordner an, in dem pro Bild zwei Versionen gespeichert werden: eine im Originalformat mit hoher Auflösung, eine in einem von Word vorbestimmten Format mit niedriger Auflösung.
Niedrige Auflösung bedeutet in der Standardeinstellung von Word: 96 dpi. Bei den Web-Optionen (im Speichern-Unter-Fenster unter „Tools“ aufrufbar) kann auch 72 dpi oder 120 dpi eingestellt werden.
Was „hohe Auflösung“ bedeutet, hängt vom Originalformat und der Originalauflösung des Bildes ab.
Liegt ein Bild im Original im Format jpg oder png vor, so wird es in seiner Originalauflösung (die z.B. 300 dpi betragen kann) abgespeichert und zusätzlich in niedriger Auflösung. Hat das Bild ein anderes Originalformat, so wird es als jpg- oder png-Bild, und zwar in niedriger Auflösung gespeichert. Insgesamt gilt:
Originalformat | abgespeichertes Format | Auflösung |
---|---|---|
jpg | jpg | Original und niedrig |
png | png und jpg | png: Original; jpg: niedrig |
gif | gif und jpg | gif: Original; jpg: niedrig |
emf | png | niedrig |
wmf | png | niedrig |
Beim Speichern als gefilterte Webseite erzeugt Word immer nur eine von ihm vorbestimmte Version des jeweiligen Bildes, und zwar grundsätzlich in niedriger Auflösung. Insgesamt gilt:
Originalformat | abgespeichertes Format | Auflösung |
---|---|---|
jpg | jpg | niedrig |
png | jpg | niedrig |
gif | jpg | niedrig |
emf | png | niedrig |
wmf | png | niedrig |
Bemerkenswert ist, dass (bei beiden Webseite-Speichermöglichkleiten) das ursprpüngliche png-Format in jpg umgewandelt wird, während ursprüngliche Vektorformate wie emf und wmf in png umgewandelt werden.
Überlegung: Für E-Books wäre es gut, Vektorformate in Pixelformate umwandeln zu können, also z.B. über den Weg
Schlecht dabei ist, dass im ersten Umwandlungsprozess niedrigaufgelöste pngs entstehen. Aber einen Test ist es wert, denn die niedrige Auflösung reicht evtl. immer noch aus, um bei der Anzeige auf dem Reader alles erkennen zu können.
Möglicherweise lassen sich die Umwandlungsformate (wie wmf → png) in der Registry anders einstellen. Müsste getestet werden.
Wenn man wirklich die Originalformate in Originalauflösung aus einer Word-Datei herausholen möchte, bleibt nur ein Weg: der über den XML-Zip-Container:
Leider geht das nur Bild für Bild, nicht für alle Bilder auf einmal, aber immerhin.
Für eine E-Book-Weiterverarbeitung ist es effektiver, sämtliche Bilder, die nach dem HTML-Export im separaten Bild-Ordner liegen, mit einem Bildprogramm (Photoshop, ACDsee, IrfanView) im Batch-Verfahren auf Schwarz/Weiß (genauer: auf Graustufen) umzustellen.
Textmarke
geht auf; hier ist die Textmarke markiert, die mit dem Textstück verbunden ist. Sie (also der Name) kann kopiert und an anderer Stelle (im Dokument oder in einem Makro oder sonst wo) eingefügt werden. Das ist z. B. beim Verschieben von Textmarken hilfreich. Textmarke
geht auf; hier in den freien Streifen oben den Namen der Textmarke einfügen und Hinzufügen
wählen. Dadurch wird der Name vom altem Textstück entfernt und die Textmarke dem neuen zugewiesen.Bis zur Version 2007 bestand der Standardweg zur Erzeugung professioneller PDFs darin, in den Adobe-PDF-Treiber zu drucken. Dabei ließen sich alle wichtigen Parameter detailliert einstellen, z.B. konnte die Schrifteinbettung perfekt gesteuert werden und auch die Bildauflösung konnte man exakt einstellen. Seit Word 2010 und parallel dazu Acrobat X bzw XI hat sich alles geändert! Man sollte jetzt auf keinen Fall mehr direkt in den Adobe-PDF-Treiber drucken (weil die Bildauflösung dabei nicht mehr einstellbar ist!), und beim Schrifteinbetten gilt es ganz andere Dinge zu berücksichtigen als bisher (z.B. kann es von Vorteil sein, PDFs im Archivformat zu erzeugen). Näheres siehe Acrobat/PDF
Eine Möglichkeit besteht darin, die Datei im html-Format zu speichern und dann daraus PDF zu erzeugen.
For Each oField In ActiveDocument.Fields oField.Unlink Next oField
Formel | Erklärung |
---|---|
{ = {SEQ bild \c} + 1 } | sucht die aktuelle Bildnummer und gibt einem um 1 erhöhten Wert wieder; kann z. B. verwendet werden, wenn ein Bildverweis im Text vor dem Bild kommt, man aber denselben Nummerierungslauf („bild“) verwenden möchte, der zur Nummerierung der Bilder eingesetzt wird. Zum SEQ-Feld siehe unten |
Nummerierungen können auf unterschiedliche Weisen vorgenommen werden:
Am sichersten sind die Methoden
Das manuelle Verfahren ist bei langen Dokumenten natürlich zu aufwändig und soll deswegen nicht näher betrachtet werden.
Die anderen beiden Verfahren sind so komplex, dass auf mein Buch zu Dokument- und Formatvorlagen in Word 210/2013 verwiesen sein soll.
Unter dem Strich lässt sich auf jeden Fall sagen, dass das Nummerierungsproblem heute (2015) noch dasselbe ist wie vor 13 Jahren, als Word 2002 herauskam und zum ersten Mal Listen-Formatvorlagen vorgestellt wurden. Keineswegs hat sich, wie von manchen behauptet, seit Word 2007 die Situation gebessert. Es ist kompliziert und wird es wohl auch bleiben. Aber wenn so vorgegangen wird, wie in meinem Buch beschrieben, kann nichts passieren.
Meine bevorzugte Methode, Überschriften oder auch andere Textstellen zu nummerieren, ist die mit dem SEQ-Feld. Die Nutzung dieses Feldes bietet dermaßen viele Möglichkeiten, dass alles andere in den Schatten gestellt wird. Eigene Listen-Formatvorlagen mit zugehörigen Absatz-Formatvorlagen zu nehmen, ist ebenfalls praktikabel, aber verglichen mit dem SEQ-Feld nicht so umfassend und flexibel.
Mit dem SEQ-Feld lassen sich beliebige Absätze nummerieren, ja man kann dieselben Absätze gleichzeitig auf unterschiedliche Weise mit Nummern versehen (siehe Absatznummerierung). Und mit diesen Absatznummern kann sogar ein Register erstellt (siehe Schalter des XE-FEldes ) oder ein automatisches Inhaltsverzeichnis erzeugt werden! Zum Inhaltsverzeichnis aus beliebigen Absätzen sei angemerkt, dass mit TC-Feldern („Verzeichniseintragsfeldern“) gearbeitet werden muss.
Ein Problem von Word (und im Grunde von allen Text- und Layoutprogrammen!) ist die Verwaltung von automatischen Nummerierungen, also wenn man so will, die Verwaltung von nummerierten Listen. Es gibt zwar seit 2002 einen Formatvorlagentyp „Liste“, den Microsoft extra entwickelt hat, um die Autonummerierung in den Griff zu bekommen, aber in der Praxis zeigt sich immer wieder, dass Word aus dem Tritt gerät bzw. dass man als Anwender total überfordert ist, die zahlreichen Einstellungen bei der Definition der Listenformatvorlagen korrekt vorzunehmen. Nicht selten gibt man nach stundenlangem Probieren auf und nummeriert alles von Hand durch.
Ein Mittelweg zwischen manuell und vollautomatisch ist die Nummerierung mit den SEQ-Feldern. Diese Felder sind eigentlich zur Nummerierung von Abbildungen und Tabellen gedacht, sie können aber auch für beliebig andere Nummerierungen verwendet werden.
Vorgehen:
Indem man nun 1] F3 (falls Autotext) oder einfach nur 1] (falls Autokorrektur) eintippt, wird an dieser Stelle im Dokument ein SEQ-Feld eingefügt, das die Nummer 1 erzeugt. Dabei spielt es keine Rolle, ob dasselbe Feld oder ein anderes SEQ-Feld bereits vorher im Dokument steht. Immer ab der Stelle, wo 1] eingefügt wird, werden alle nachfolgenden SEQ-Felder bei 1 beginnend duchnummeriert. Das gilt aber nur solche SEQ-Felder, die denselben Nummerierungsnamen haben (im Beispiel „Test“) und den Schalter \n enthalten. D.h. an allen Stellen, die automatisch nummeriert werden sollen ist per n] F3 (Autotext) bzw. einfach n] (Autokorrektur) das zweite SEQ-FEld einzufügen.
Die Nummerierung wird (im Unterschied zu den üblichen Word-Listen) nicht automatisch aktualisiert, sondern man muss den gesamten Text markieren und die allgemeine Feldaktualisierungsfunktion aufrufen: F9.
In der Praxis benötigt man z.B. eine Nummerierung für die Kapitel, die nächste für die Unterkapitel, eine weitere für die Unterunterkapitel usw. D.h. man erzeugt die Felder
usw.
sowie
usw.
Dabei sind k1, kn, uk1, ukn usw. die Nummerierungsnamen.
Entsprechend würde man in die Autokorrektur aufnehmen:
usw.
In den Überschriften werden dann die Felder kombiniert:
{SEQ k1 \r 1}.{SEQ uk1 \r 1}.{SEQ uuk1 \r 1}<tab>Blablabla ((Überschrift von Unterunterkapitel 1.1.1))
TextTextTextTextTextTextText
TextTextTextTextTextTextText
{SEQ k1 \r 1}.{SEQ uk1 \r 1}.{SEQ uukn \n}<tab>Blablabla ((Überschrift von Unterunterkapitel 1.1.2))
TextTextTextTextTextTextText
TextTextTextTextTextTextText
{SEQ k1 \r 1}.{SEQ uk1 \r 1}.{SEQ uukn \n}<tab>Blablabla ((Überschrift von Unterunterkapitel 1.1.3))
TextTextTextTextTextTextText
TextTextTextTextTextTextText
usw.
später im Text:
{SEQ k2 \2}.{SEQ uk1 \r 1}.{SEQ uuk1 \r 1}<tab>Blablabla ((Überschrift von Unterunterkapitel 2.1.1))
TextTextTextTextTextTextText
TextTextTextTextTextTextText
{SEQ k2 \2}.{SEQ uk1 \r 1}.{SEQ uukn \n}<tab>Blablabla ((Überschrift von Unterunterkapitel 2.1.2))
TextTextTextTextTextTextText
TextTextTextTextTextTextText
{SEQ k2 \2}.{SEQ uk1 \r 1}.{SEQ uukn \n}<tab>Blablabla ((Überschrift von Unterunterkapitel 2.1.3))
TextTextTextTextTextTextText
TextTextTextTextTextTextText
usw.
Das Ganze ist schon noch recht aufwändig und auch fehleranfällig, aber wenn das System einmal steht, weiß man genau, wo man eingreifen muss, um Fehler zu korrigieren. Und es reicht aus, punktuell einzugreifen, denn F9 aktualisiert ja wieder auf Knopfdruck. Darüberhinaus hat man volle Kontrolle über den Aufbau der Nummerierung, man kann Tabulatoren, Punkte oder andere Zeichen nach Belieben (natürlich mit System) setzen, ohne dass irgendein geheimnisvoller Automatismus alles umformatiert!
Die Idee für diese Lösung stammt von David Knopf: www.knopf.com/tips/pdf/autonumber.pdf
Zur Absatznummerierung gibt es mindestens 3 verschiedene Möglichkleiten:
Zu 1. siehe oben: Nummerierungen.
Zu 2. hat Jack Lyon, Autor von „Microsoft Word for Publishing Professionals“, ein Makro entwickelt:
Sub paranum() ' ' paranum Makro ' ' Dim para, p For Each para In ActiveDocument.Paragraphs p = p + 1 para.Range.Select Selection.MoveLeft Unit:=wdCharacter Selection.Font.Hidden = True Selection.Font.Color = wdColorRed Selection.TypeText text:=LTrim(Str(p)) Next para End Sub
Das Makro nummeriert alle Absätze fortlaufend und versteckt die Nummern dann (Selection.Font.Hidden = True). Er nutzt es z.B. in Dexter, seinem Word-Add-In zur Index-Erzeugung.
Zu 3: Marginalien können in Word mit Positionsrahmen erzeugt werden. Seit Word 2010 sind Positionsrahmen Teil der Definition von Absatzformatvorlagen. Gegenüber Textrahmen haben sie den großen Vorteil, in der Textebene zu liegen, währen Textrahmen immer in einer Ebene vor (oder „oberhalb“) des Textes liegen. In Positionsrahmen können Felder genauso verwendet werden wie im normalen Text. Das geht bei Textrahmen nicht. Daher kann man z.B das SEQ-Feld nicht in in einen Textrahmen stecken, aber in einen Positionsrahmen. Die Anordnung des Rahmens (z.B. horizontaler Abstand vom eigentlichen Fließtext Text) lässt sich bequem und genau einstellen. Positionsrahmen sind absolut stabil, bleiben also immer mit dem jeweiligen Absatz, der als Anker dient, verbunden und verschieben sich mit ihm, wenn es Layoutänderungen gibt.
Das besonders Gute: mit Marginalientext, der auf diese Weise erzeugt wird, können Absatznummern auf dem Rand vergeben werden, die
Das könnte insgesamt dann so aussehen:
3.2 5. Text des Listenabsatzes Text des Listenabsatzes Text des Listenabsatzes Text des Listenabsatzes Text des Listenabsatzes Text des Listenabsatzes Text des Listenabsatzes Text des Listenabsatzes
Man kann mit dem SEQ-Feld jede beliebige Nummerierungsart erzeugen; auch die Kombination mehrerer Nummern (wie im vorstehenden Beispiel Kapitelnummer und Absatznummer) ist möglich.
Auch Aufzählungen können auf diese Weise nummeriert werden. Es ist also kein Problem, so etwas wie
4.8 * Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext 4.9 * Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext Aufzählungstext
zu erzeugen!
Dieses Verfahren ist die Voraussetzung dafür, in einem Register die Seitenzahlen durch andere Nummern zu ersetzen. Mehr dazu unter Schalter des XE-Feldes
{ LISTNUM [„Name“] [Schalter] }
„Name“ ist der Name des Nummerierungslaufs, für den die Schalter gelten sollen; „Name“ muss identisch mit dem Inhalt des Punktes „ListeNr-Feldliste“ in der Definition einer Listenformatvorlage sein, wenn mit dem ListNum-Feld der Neustart der Nummerierung gesteuert werden soll.
Schalter:
Wichtig: das ListNum-Feld reagiert nur auf Listenformatvorlagen, die mit Absatzformatzvorlagen unterschiedlicher Gliederungsebenen verknüpft sind, wie z.B. Überschriftformatvorlagen oder speziellen Absatzformatvorlagen im Fließtext; standardmäßig stehen Absatzformatvorlagen auf Gliederungsebene „Textkörper“.
{ StyleRef [„Name“] [Schalter] } „Name“ ist der Name einer Formatvorlage. Dabei kann es sich um eine Absatz- oder Zeichenformatvorlage handeln.
Schalter:
Mit Textmarken sind hier ausschließlich die verborgenen, von Word in Zusammenhang mit integrierten Formatvorlagen vergebenen Textmarken gemeint, nicht benutzerdefinierte Textmarken! Während der Schalter \p unkritisch ist, bewirken die Schalter \r und \w nur dann etwas Sinnvolles, wenn im Dokument mit integrierten Absatzformatzvorlagen gearbeitet wurde. Hat man eigene Absatzformatvorlagen definiert, führen diese Schalter zur Anzeige 0 (oder zu Fehlermeldungen).
Üblicherweise wird auf Absatzzeichenformatvorlagen verweisen. Das geht bzgl. der Anzeige in den meisten Fällen auch gut. Ein Problem entsteht, wenn im Absatz, der mit der Formatvorlage formatiert wurde, a) ein Carriage Return oder b) ein so langer Text enthalten ist, dass er nicht in die Kopfzeile passt. Lösen lässt sich das Problem, wenn ausschließlich auf Zeichenformatvorlagen verwiesen wird. D.h. zusätzlich zu Überschrift-Absatzformatvorlagen sollten immer passende Überschrift-Zeichenformatvorlagen definiert und in jeder Überschrift eingesetzt werden. Das ist zwar zusätzlicher Aufwand beim Formatieren von Überschriften, aber wesentlich weniger Aufwand als nötig wäre, wenn man die Kolumnentitel auf andere Weise (nämlich manuell) anpassen müsste.
Grundsätzlich kann die StyleRef-Funktion überall im Text positioniert werden. Manche Schalter wirken aber nur sinnvoll an bestimmten Stellen:
Schalter | sinnvoller Einsatz |
---|---|
\l | Kopf- oder Fußzeile |
\n | überall |
\s | überall |
\t | überall |
\p | Dokumenttext |
\r | Dokumenttext |
\w | Dokumenttext |
In vielen Feldern taucht der Schalter
*\ MERGEFORMAT
auf.
Er bewirkt, dass das Resultat des Feldes (z. B ein lebender Kolumnentitel, der mit dem StyleRef-Feld erzeugt wurde) formatiert werden kann. Ist der Schalter nicht im Feld vorhanden, kann das Resultat nicht formatiert werden! Mit anderen Worten: Möchte man z.B. in einem Kolumnentitel bestimmte Stellen formatieren (fett, kursiv, hoch, tief) und hat damit keinen Erfolg, weil die Formatierung immer sofort wieder verschwindet, so lohnt es sich zu schauen, ob im Feld der Schalter *\ MERGEFORMAT vorhanden ist, Falls nicht: einfach eintippen. Danach sollte die Formatierung klappen.
Wichtig zu wissen: Die Option „ausgeblendeten Text drucken“ (unter Optionen - Anzeige) bewirkt, dass ausgeblendeter Text (wie die Indexmarken) mitgezählt wird. Also Häkchen wegnehmen, wenn z. B. die XE-Felder nicht mitgezählt werden sollen. Achtung: Wirksam wird die Optionsumstellung erst nach Schließen und Wiederöffnen der Datei!
Makros zum Wörterzählen:
Sub woerterzaehlen1() ' ' Wörterzählen inkl. Satzzeichen und nichtdruckbaren Zeichen (wie Return) ' ' MsgBox ActiveDocument.Words.Count End Sub
Sub woerterzaehlen2() ' ' Wörterzählen ohne Satzzeichen und nichtdruckbare Zeichen ' ' MsgBox ActiveDocument.Range.ComputeStatistics(wdStatisticWords) End Sub
Alternatives Vorgehen nach Christian Fahn „Auf richtiger Höhe“ (’technische kommunikation’, 34.Jahrgang(1)2012, Seite 24):
Es wird eine Leerzeile eingefügt und deren Zeilenabnstand wird wie benötigt eingestellt.
>>
„Abstand nach Leerzeile berechnen“
Setzt der Autor die Einfügemarke in die erste Zeile des Fließtextes nach der Leerzeile – siehe Kreis in Abbildung 1 –, so kann die Position der Zeile ermittelt werden. In der Statusleiste zeigt Word leider nur die Position in Zentimetern an. Dieser Wert lässt sich natürlich umrechnen: 1 cm entspricht 28,35pt. Es geht aber auch einfacher, und zwar mit dem „Direktbereich“ im Visual Basic Editor – [Alt] [F11] drücken, anschließend [Strg] [G]. Dort trägt der Autor folgende Zeile inklusive Leerzeichen ein und bestätigt mit [Enter]:
? selection.Information(wdVerticalPositionRelativeToTextBoundary)
Der angezeigte Wert zeigt die aktuelle Position in „pt“ an. Die Abweichung vom Vielfachen des festgelegten kleinsten Zeilenabstands ergibt den „Abstand nach“ für die Leerzeile. Ein weiteres Beispiel liefert Abbildung 2: 615 pt – 607,9 pt = 7,1 pt
<<
Hilfreich ist es, das Grundlinienraster anzuzeigen:
Sollte es nicht zu sehen sein, so müssen die Optionen zu den Gitternetzlinien eingestellt werden. Sie sind nicht bei den anderen Word-Optionen zu finden, auch nicht beim Seitenlayout! Microsoft hat sie den Grafiken zugeordnet, wahrscheinlich weil man nur bei Grafiken angeben kann, dass sie sich an Hilfslinien (wie einem Grundlinienraster) ausrichten sollen. D.h., die Gitternetzlinien-Einstellungen gehören zu den Ausrichtungsoptionen:
Um Registerhaltigkeit (s. o.) zu erreichen, besteht die Aufgabe besteht darin, an allen kritischen Stellen (z.B. nach einer Überschrift oder einer Bildunterschrift) den Absatzabstand davor oder dahinter so zu verändern, dass der nachfolgende Text in das Grundlinienraster rückt. Das Grundlinienraster erlaubt die optische Kontrolle.
Damit ein Bild einerseits in der Textebene (und nicht vor dem Text), andrerseits mitten in einem Absatz platziert werden kann, muss der Absatz mit einem harten Carriage Return geteilt werden. Es kann auch nötig sein, mehrere harte Zeilenschaltungen hintereinander einzugeben, also nichts anderes als mehrere Leerzeilen zu erzeugen. Das Bild wird in der letzten Leerzeile positioniert, sodass es auf der folgenden Seite genau an der oberen Satzspiegelkante angeordnet ist. Auf diese Weise schafft man es, den Text am Bild „vorbeilaufen“ (davor enden und danach weiterlaufen) zu lassen.
Damit bei Blocksatz die letzte Zeile des oberen Absatzteilstücks rechtsbündig ausläuft, muss der Blocksatz hier erzwungen werden. Darüber hinaus muss ein evtl. vorhandener Trennstrich hart eingetastet werden.
Nach dem Bild kann ganz normal die Bildunterschrift kommen.
Diese können in der Kopfzeile eingebaut werden und gelten dann immer für den jeweiligen Abschnitt und hier jeweils für die rechte oder linke Seite.
Um den Satzspiegel und die Randspalte sichtbar zu machen, ist es am einfachsten, in der Kopfzeile Gradfikrahmen aufzuziehen und sie hinter den Text zu legen; außerdem sollte der Rahmenkante als Farbe ein zartes grau zugewiesen werden.
Benötigt werden Rahmen oder Linien nur in der Umbruchphase. Steht der Umbruch, werden Rahmen und Linien einfach aus der Kopfzeile entfernt. Der gesamte Abschnitt ist damit sofort bereinigt.
Mit dem Advance-Feld ist es möglich, den Text, der direkt hinter dem Feld steht, in seiner Position zu verschieben. Eine waagerechte Verschiebung betrifft grundsätzlich den Text in der Zeile, in der das Feld angeordnet wird, wirkt sich aber natürlich auch auf die nachfolgenden Zeilen desselben Absatzes aus, weil sich der Zeilenfall ändert. Eine senkrechte Verschiebung wirkt sich auf den kompletten nachfolgenden Text aus, weil damit der Seitenumbruch verändert wird. Die Wirkung ist erst zu sehen, wenn von der Feldsyntax-Ansicht auf die normale Ansicht umgeschaltet wird.
Syntax: { ADVANCE [Schalter] [Verschiebung um pt] }
Beispiele:
Das Feld lässt sich mitten in einer Zeile einbauen, sodass der links davon stehende Text unverrückt bleibt und nur der Text rechts vom Feld von der Verschiebung betroffen ist. Dadurch können beliebige Texte übereinander geschoben werden, was sonst nur mit der EQ-Funktion möglich ist.
Achtung |
---|
Die Verschiebung in senkrechter Richtung funktioniert in neueren Word-Versionen (365, 2019 und jünger) nicht! |
Daher kann die Advanced-Funktion nicht verwendet werden, um Registerhaltigkeit zu erreichen! |
Es gibt zwei Stellen, über die die Silbentrennung grundsätzlich ein-und ausgeschaltet werden kann:
Nur wenn die absatzweise Silbentrennung eingeschaltet ist, kommt beim Aufruf der manuellen Silbentrennung das Fenster zur manuellen Silbentrennung zum Vorschein! |
Folgende Möglichkeiten stehen zur Verfügung:
Zusätzlich lässt sich der Zeilenumbruch beeinflussen, indem übliche Leerzeichen in geschützte Leerzeichen umgewandelt werden: Leerzeichzen markieren und <Strg-Umsch-Leertaste> eingeben (wichtig z.B. bei Zahlen und nachfolgenden Einheiten,die nicht getrennt werden sollen).
Bedingte Trennstriche und Trennstriche, die von der Silbenstrenung ausgeschlossenn sind (sog. geschützte Trennstriche), lassen sich am schnellsten per Suchen-Ersetzen entfernen (^- bzw. ^~).
ganz besondere Zeichen:
Beide sind unter <Einfügen–Symbol–Sonderzeichen> zu finden. Der Null-breite Nicht-Wechsel ist z.B. gut, wenn man verhindern möchte, dass ein längerer Strich (etwa m-Strich) in der ersten Zeile bleibt, während der zugehörige Text in die nächste Zeile rutscht. Mit dem Null-breiten Nicht-Wechsel bleiben beide einheiten zusammen.
In Word gibt es leider keine Verbindung zwischen beiden. D.h. im Benutzerwörterbuch können keine bedingten Trennstriche eingegeben werden! Die Silbentrennung ist somit nicht lernfähig (anders als in OpenOffice, wo die Verbindung zum Benutzerwörterbuch existiert).
Konsequenz: Will man ein bestimmtes Word überall im Text auf eine bestimmte Weise trennen, ohne manuell vorzugehen, so muss man zur Suchen-Ersetzen-Funktion greifen. Im Suchen-Bereich das ursprüngliche Wort eingeben, im Ersetzen-Bereich das Wort mit bedingten (oder auch geschützten) Trennstrichen. Sonderzeichen für bedingten Trennstrich: Dach-Bindestrich (also ^-), Sonderzeichen für geschützten Trennstrich: Dach-Tilde (also ^~).
Die so vorgenommene Trennung wirkt nur, wenn zwei Dinge beachtet werden:
Wichtig beim Aufzeichnen: Es muss der Menüpunkt „Silbentrennungsoptionen“ aufgerufen werden. Nur wenn das geschieht, wird während der Aufzeichnung Code erzeugt; werden dagegen einfach nur die Häkchen bei „keine“, „automatisch“ oder „manuell“ gesetzt, entsteht kein Code.
Sub silbtrenn_ein() ' ' silbtrenn_ein Makro ' ' With ActiveDocument .AutoHyphenation = True .HyphenateCaps = True .ConsecutiveHyphensLimit = 0 End With End Sub
Das Problem bei VBA-Makros zu Suchen/Ersetzen ist, dass bestimmte Aktionen vom Makrorekorder nicht aufgezeichnet werden. Dazu gehören sämtliche Schriftformatierungen.
Beispiel: Suchen von tiefgestellten Zeichen, ersetzen mit Formatvorlage „tief“. Obwohl im Suchen/Ersetzen-Fenster bei der Makroaufzeichnung eingegeben wurde, dass nach tiefgestellten Zeichen gesucht werden soll, findet sich dazu im aufgezeichneten Makrolisting keine einzige Zeile. Cindy Meister spricht von einem echten Fehlverhalten von Word (S. 255)!
Aufgezeichnete Aktion:
Sub prueftief() ' ' prueftief Makro ' Makro aufgezeichnet am 20.01.2011 von walter ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Style = ActiveDocument.Styles("tief") With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub
D.h., man muss selbst die Anweisungen .Font, .Bold , .Subscript usw. eingeben. Kleine Hilfe: Im Dialogfeld des VB-Editors <Extras-Optionen-Editor> sollte das Kästchen „Elemente automatisch auflisten“ aktiviert sein. Dann schlägt Word eine Liste möglicher Befehle/Eigenschaften vor. Man muss lediglich den Punkt eingeben, und schon geht die Vorschlagsliste auf.
Auf diese Weise wurde im obigen Code die Zeile zum Suchen von tiefgestellten Zeichen (.Font.Subscript = True) ergänzt:
Sub prueftief2() ' ' prueftief2 Makro ' Makro aufgezeichnet am 20.01.2011 von walter ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Style = ActiveDocument.Styles("tief") With Selection.Find .Text = "" .Font.Subscript = True .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub
Wichtig: das „= True“ wird nicht vorgeschlagen, aber anscheinend gibt es nur die „Attribute“ „True“ und „False“.
Dieses Makro läuft ganz prima.
Achtung: Wenn nicht ersetzt, sondern einfach nur gesucht werden soll, muss anscheinend anders vorgegangen werden:
Sub suchenachkursiv() ' ' suchenachkursiv Makro ' ' Selection.Find.ClearFormatting Selection.Find.Font.Italic = True With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindAsk .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute End Sub
Diese Kursiv-Finden-Makro ließ sich (in Word 2016) sogar aufzeichnen!
Es fällt auf, dass der Kursiv-Suchen-Befehl vor
With Selection.Find
steht.
Gesucht wird nach der Farbe der markierten Textstelle:
Sub nach_nächster_hervorhebung_gleicher_farbe_suchen() Dim highl_col highl_col = Selection.Range.HighlightColorIndex 'MsgBox highl_col Selection.Find.ClearFormatting Selection.Find.Highlight = True Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False Do Selection.Find.Execute Loop Until Selection.Range.HighlightColorIndex = highl_col Selection.Range.Select 'Selection.Range.HighlightColorIndex = wdNoHighlight End With End Sub
Es könnte auch ein ColorIndex eingegeben werden (entweder die Indexnummer der Farbe oder der Word-interne Name der Farbe).
Sub hervor_farb_such() ' ' Makro zum Suchen einer bestimmten Hervorhebungsfarbe ' ' Dim kennungstext kennungstext = InputBox("Welcher Text soll als Kennung verwendet werden?", "Kennungstext") Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .text = "" .Replacement.text = "" .Forward = True .Wrap = wdFindAsk .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Highlight = True End With Selection.Find.Execute Do While Selection.Find.Found If Selection.Range.HighlightColorIndex = wdYellow Then Selection.Range.Select Selection.Range.HighlightColorIndex = wdNoHighlight Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.TypeText text:=kennungstext Else Selection.Find.Execute End If Loop MsgBox "Fertig" End Sub
Der entscheidende Punkt ist, dass Word die Farbe eines Textstücks nur „auslesen“ kann, wenn das Textstück markiert („gehighlighted“) ist: HighlightColorIndex = wdYellow (für die Farbe Gelb)
Zunächst muss überhaupt nach Hervorhebungen (Highlights) gesucht werden:
.Highlight = True ((innerhalb der With-Schleife))
und Selection.Find.Execute nach der With-Schleife findet genau diese Stellen. Sie können aber irgendeine Farbe haben. Wie lässt sich eine bestimmte Farbe finden?
Dazu dient die Do-Schleife:
Do While Selection.Find.Found If Selection.Range.HighlightColorIndex = wdYellow Then Selection.Range.Select Selection.Range.HighlightColorIndex = wdNoHighlight Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.TypeText text:=kennungstext Else Selection.Find.Execute End If Loop
Wenn eine beliebige Hervorhebung gefunden wurde (While Selection.Find.Found), kann Word deren Farbe auslesen. Nun wird geschaut, ob die Hervorhebung die Farbe wdYellow hat:
If Selection.Range.HighlightColorIndex = wdYellow Then
Falls ja, markiere das Textstück als „gefunden“:
Selection.Range.Select
Dem markierten Textstück kann dann eine andere Farbe zugewiesen werden:
Selection.Range.HighlightColorIndex = wdNoHighlight
In diesem Fall ist es „NoHighlight“, also keine Farbe. Hier könnte aber auch eine andere Farbe stehen, z. B wdBlue für Blau.
Das heißt mit diesem Makro ist das erreicht, was sein sollte: Suche nach bestimmter Hervorhebung, ersetze sie durch eine andere.
Das Makro springt von einer gelben Hervorhebung zur nächsten. Alle andersfabigen werden übersprungen.
Soll bewusst nach einer anderen Farbe gesucht werden, braucht einfach nur an der Stelle Selection.Range.HighlightColorIndex = wdYellow der Name der Farbe geändert zu werden.
Ebenso ist es möglich, die Ersetzen-Farbe zu ändern (evtl. sogar dieselbe Farbe einzubauen wie die, nach der gescuth wurde).
In der Microsoft-Hilfe gibt es eine Tabelle mit allen Farbnamen:
https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa172829(v=office.11)
wdByAuthor; wdAuto; wdNoHighlight; wdBlack; wdBlue; wdBrightGreen; wdDarkBlue; wdDarkRed; wdDarkYellow; wdGray25; wdGray50; wdGreen; wdPink; wdRed; wdTeal; wdTurquoise; wdViolet; wdWhite; wdYellow
Das Makro enthält noch eine Besonderheit: Damit später auch unabhängig von einer Hervorhebungsfarbe nach den zuvor hervorgehobenen Stellen gesucht werden kann, wird die gefundene hervorgehobene Textstelle am Ende mit einer Kennung versehen, die außerhalb des Farbbereichs liegt:
Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.TypeText text:=kennungstext
Als „kennungstext“ wird das verwendet, was ganz am Anfang des Makros abgefragt wird:
kennungstext = InputBox("Welcher Text soll als Kennung verwendet werden?", "Kennungstext")
Geeignet als Kennunsgstext ist z. B. “###„ oder “@@@„. Man könnte auch für jede Hervorhebungsfarbe einen anderen Kennungstext wählen.
Das einmal angelegte Makro kann kopiert und mehrfach in den VBA-Editor (wird mit Alt-F11 geöffnet) eingefügt werden. Bei jeder Instanz können der Makroname und die Namen der Suche-Farbe und der Ersetzen-Farbe geändert werden. Wegen des einfachen Zugriffs sollten sie auf das Menüband gelegt werden.
Man unterliegt zunächst der Versuchung, den Text zu suchen und durch sich selbst zu ersetzen, wobei beim Ersetzen die Formatvorlage zugewiesen wird. Doch das funktioniert nicht, weil manche Parameter nicht aufgezeichnet werden.
Prinzip:
Sub bildverw() ' ' bild wird gesucht, um anschließend Formatvorlage zuzuweisen ' ' Selection.Find.ClearFormatting With Selection.Find .Text = "(Bild [0-9]{1;2})" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Selection.Find.Execute End Sub
Selection.Style = ActiveDocument.Styles("Verweis") Selection.MoveRight Unit:=wdCharacter, Count:=1
Mit der letzten Zeile wird die markierte (und formatierte) Textstelle verlassen, sodass das Makro anschließend erneut ausgeführt werden kann.
Gesamtmakro:
Sub bildverw() ' ' bild wird gesucht, um anschließend Formatvorlage zuzuweisen ' ' Selection.Find.ClearFormatting With Selection.Find .Text = "(Bild [0-9]{1;2})" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Selection.Find.Execute Selection.Style = ActiveDocument.Styles("Verweis") Selection.MoveRight Unit:=wdCharacter, Count:=1 End Sub
Aufgepasst: Das vorstehende Beispiel gilt für das Zuweisen einer Zeichenformatvorlage. Soll eine Absatzformatvorlage zugewiesen werden, muss zunächst die Markierung, die durch das Finden entsteht, aufgehoben werden. Erst danach wird die Formatvorlage zugewiesen. Das heißt, im vorstehenden Beispiel sind die betreffenden Zeilen in ihrer Reihenfolge umzudrehen:
Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.Style = ActiveDocument.Styles("Name der AFV")
Problem: Wenn man Text (z.B. „die“) markiert und dann ein Makro aufzeichnet, in dem nach dem markierten Text gesucht wird, dann steht in dem aufgezeichneten Makro genau dieser Text drin:
Sub suchenachmarkiertemtext() ' ' suchenachmarkiertemtext Makro ' Selection.Copy Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting With Selection.Find .Text = "die" .Replacement.Text = "" .Forward = True .Wrap = wdFindAsk .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute End Sub
Der Suche-String ist eine Konstante. Was man möchte, ist ein Makro, mit dem nach dem jeweils markierten Text gesucht werden kann, d.h., der Suche-String muss eine Variable sein. Dazu muss mit der Funktion „Selection.Text“ gearbeitet werden, mit der sich eine Variable (z.B. „a“) deklarieren lässt:
Sub suchenachmarkiertemtext() ' ' suchenachmarkiertemtext Makro ' a = Selection.Text 'variable Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting With Selection.Find .Text = a 'variable wird hier eingesetzt .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute End Sub
Zu beachten: Mit diesem Makro wird lediglich das erste Auftreten des Text-Strings im Dokument gefunden. Will man weitersuchen, dann ganz normal per Strg-f das Suchenfenster geöffnet werden. Hier steht der Text-String bereits als Suchbegriff drin, sodass nur auf „Weitersuchen“ geklickt werden muss.
Die Information, welches das aktuelle Arbeitsdokument ist (kompletter Pfadname), kann abgefragt werden (ActiveDocument.FullName). Sie wird in einer Variablen festgehalten. Als Quelldatei für die FV dient hier beispielhaft die Dokumentvorlage dokuform.dotm. Das Makro wurde aufgezeichnet und dann an der Stelle „Destination:=“ geändert. Wesentliches Element dabei ist das „Organisieren“-Fenster, das während der Aufzeichnung über die Registerkarte „Entwicklertools“ und das Dialogfenster „Dokumentvorlagen und Add-Ins“ aufgerufen wurde. Dann wurde im rechten Teilfenster die Dokuvorlage dokuform geöffnet. Die gewünschten FV wurden markiert und per Kopieren in die Datei im linken Teilfenster (also das aktuelle Arbeitsdokument) übertragen. Es wurden nur einige FV ausgewählt. In der Praxis muss man schauen, welche FV wirklich gebraucht werden. Natürlich können auch sämtliche FV der Quelldatei übertragen werden.
Für jede Dokumentvorlage, die als Quelldatei infrage kommt, kann ein entsprechendes Makro angelegt werden. Interessant wären z. B. „indexing.dotm“ und „vfll.dotm“.
Damit können „auf Knopfdruck“ die Fv unterschiedlicher Dokuvorlagen in das jeweilige Arbeitsdokument übertragen werden.
Sub fv_aus_dokuform() ' ' fv aus Dokumentvorlage dokuform in aktuelle Datei kopieren ' ' Dim aktDat aktDat = ActiveDocument.FullName Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_fliess", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_aufzaehlung", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_aufzaehlung_manuell", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_ausblend1", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_ausblend2", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_bild", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_bu", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_bu_beginn", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_code_text", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\dokuform.dotm", Destination:= _ aktDat _ , Name:="df_code_text_zeichen", Object:=wdOrganizerObjectStyles End Sub
Zum Beobachten des Kopiervorgangs am besten den FV-Aufgabenbereich öffnen und die Optionen auf „FV im aktuellen Dokument“ einstellen.
Gezeigt am Beispiel des Kopierens von FV aus einer anderen Datei („Quell-Datei“). Als Variable muss der Dateiname eingegeben werden.
In die aktuelle Datei („Arbeitsdokument“) sollen alle oder einige FV der Quell-Datei über das Organisieren-Fenster hereinkopiert werden. Als Quell-Datei soll beispielhaft die dokuform-Dokumentvorlage dienen. Das Kopieren der FV wird komplett aufgezeichnet. Dabei landet der Quell-Dateiname (in diesem Fall: „dokuform.dotm“) im Makrocode. Damit das Makro für beliebige Quell-Dateien eingesetzt werden kann, muss der jeweils aktuelle Quell-Dateiname eingegeben werden. Die Code-Zeilen für die Input-Box, über die die Namenseingabe erfolgt, müssen von Hand dem aufgezeichneten Code hinzugefügt werden. Außerdem ist die Variable manuell in die Kopierzeilen einzubauen.
Das Makro funktioniert nur für Quell-Dateien, die im selben Verzeichnis liegen.
Als Arbeitsdokument kann jede beliebige Word-Datei dienen. Das heißt, die FV werden immer aus der angegeben Quell-Datei in das jeweilige Arbeitsdokument hineinkopiert.
Das Makro kann so aussehen:
Sub fv_aus_beliebiger_dokuvorlage() ' ' FV werden aus Dokuvorlage geholt, deren Name eingegebn werden muss ' Voraussetzung: Quelldatei befindet immer im Standardverzeichnis der Dokuvorlagen (hier: C:\vorlagen_arbeitsgruppe\) ' Dim quelldatei Dim aktDat quelldatei = InputBox("Bitte Namen der Quelldatei (ohne Dateinamenerweiterung) eingeben.") 'Variable für Quell-Dateinamen aktDat = ActiveDocument.FullName Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_fliess", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_aufzaehlung", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_aufzaehlung_manuell", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_ausblend1", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_ausblend2", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_bild", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_bu", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_bu_beginn", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_code_text", Object:=wdOrganizerObjectStyles Application.OrganizerCopy Source:= _ "C:\vorlagen_arbeitsgruppe\" & quelldatei & ".dotm", Destination:= _ aktDat _ , Name:="df_code_text_zeichen", Object:=wdOrganizerObjectStyles End Sub
Zum Beobachten des Kopiervorgangs am besten den FV-Aufgabenbereich öffnen und die Optionen auf „FV im aktuellen Dokument“ einstellen.
Wenn markierter Text (siehe vorstehend) in eine Variable a gepackt wurde, können Funktionen darauf angewandt werden. Typische Textfunktionen sind
Man sollte meinen, dass auch der Rechtsanteil mit einer Funktion wie right(a, [Zahl der Zeichen]) herausgezogen werden kann. Doch das funktioniert aus irgendeinem Grund nicht. Die right-Funktion wird von VBA für Word nicht erkannt! In Excel dagegen scheint sie zu funktionieren.
Experimente zeigen, dass man mit der mid-Funktion weiterkommt:
Wie sich zeigt, liefert z. B.
die letzten beiden Zeichen des Strings a.
Man könnte dann Kombinationen a aus dem Anfang und dem Ende von a bilden:
Wenn im Text z. B das Wort „Schlüsselkomponenten“ markiert wurde, ergibt sich
Sub anfang_ende() Dim a, b, c, d, e a = selection.text b = Len(a) c = left(a, 2) 'erste beide Zeichen von a, also 2 Zeichen von links d = Mid(a, b - 1) 'letzte beide Zeichen von a, also 2 Zeichen von rechts e = c & d 'Ergebnis MsgBox e End Sub
In der MsgBox wird dann angezeigt: „Scen“
Nutzen lässt sich das, um in Kombination mit dem nachfolgenden Gehezu-Makro von einem XE-Feld zum nächsten zu gehen, den jeweiligen Inhalt in die Variable a zu packen und dann mit dem Anfang-Ende-Makro automatisch vor dem XE-Feld eine Textmarke zu setzen, deren Name systematisch aufgebaut wird aus
Wenn also das XE-Feld „Schlüsselkomponenten“ auf S. 24 erzeugt wurde, wäre der Name der Textmarke:
Siehe weiter unten: „Textmarke erzeugen…“.
von: https://wordmvp.com/FAQs/MacrosVBA/ManipulateClipboard.htm
Manipulating the clipboard using VBA
Article contributed by Jonathan West
Although VB6 has a Clipboard object which you can manipulate, Word VBA doesn't. This is how to clear the clipboard in VBA:
Dim MyData As DataObject
Set MyData = New DataObject MyData.SetText ““ MyData.PutInClipboard
This is how to get the text on the clipboard into a string variable:
Dim MyData As DataObject Dim strClip As String
Set MyData = New DataObject MyData.GetFromClipboard strClip = MyData.GetText
This is how to get the text from a string variable into the clipboard:
Dim MyData As DataObject Dim strClip As String strClip = „Hi there“
Set MyData = New DataObject
MyData.SetText strClip MyData.PutInClipboard
The DataObject object is a part of the Forms library in VBA. In order to make this code work, you must do one of two things.
Wichtig ist der letzte Punkt: Microsoft Forms! Im VBA-Fenster muss unter Extras der Punkt Verweise aufgerufen und dann das Häkchen bei Microsoft Forms gesetzt werden:
Eigenes Makro zum Holen aus Zwischenablage:
Sub aus_zwischenablage() ' Voraussetzung: vorher wurde Text per Copy in Zwischenablage gebracht Dim myDO As DataObject Set myDO = New DataObject myDO.GetFromClipboard MsgBox myDO.GetText End Sub
Anstatt nach bestimmten Objekten (oder Elementen) zu suchen, kann man auch die GoTo-Funktion verwenden. Sie wird per Tastatur mit <Strg-g> oder F5 aufgerufen. Es geht ein Dialogfenster auf, in dem das gewünschte Element gewählt werden kann:
Um z.B. nach einem XE-Feld zu suchen, kann man das Gehezu-Fenster aufrufen, das Element „Feld“ wählen und den Feldnamen XE eintippen (oder aus einem Pulldown-Menü auswählen):
Bestätigen von „Weiter“ führt zum nächsten Vorkommen des XE-Feldes.
Diese Aktionen lassen sich genauso als Makro aufzeichnen. Heraus kommt folgender Code:
Sub xefeldsuchen() ' ' Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:="XE" Selection.Find.ClearFormatting With Selection.Find .Text = "und" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With End Sub
Es fällt auf, dass nicht nur die Gehezu-Aktion aufgezeichnet wurde, sondern auch eine Suchen-Aktion. Weshalb das so ist, konnte ich bisher nicht herausfinden.
Im Suchen-Code steht, und das ist besonders bedenklich, der Suchentext drin, der bei der letzten Suche - die mit dem Gehezu überhaupt nichts zu tun hat - eingegeben wurde. Die Frage ist, ob der gesamte Suchen-Code nicht einfach gelöscht werden kann. Genau das geht. Das heißt, der Gehezu-Code reduziert sich zu:
Sub xefeldsuchen() ' ' Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:="XE" End Sub
Das sieht natürlich viel besser aus.
Das Hingehen zu einem Feld (wie hier dem XE-Feld) lässt sich noch verbinden mit weiteren Aktionen, etwa einer Formatierung. Wenn z.B. XE-Felder aus Cindex in Word eingebaut werden, können sie eine falsche Schriftgröße haben. Die Standardschriftgröße eines Absatzes kann z.B. 10 pt sein, während die Schriftgröße aus Cindex 12 pt ist. Um das zu bereinigen, kann mit einem Makro von einem XE-Feld zum nächsten gesprungen und per <Strg-Leertaste> die Standardschrift zugewiesen werden; vor dem Zuweisen muss das Feld noch per <Strg-Umsch-Pfeil nach rechts> markiert werden.
Der zur Formatierung gehörende Code (der ebenfalls einfach aufgezeichnet werden kann), lautet:
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Font.Reset Selection.MoveRight Unit:=wdCharacter, Count:=1
Das Gesamtmakro zum Suchen des nächsten XE-Feldes und Zuweisen der korrekten Schriftgröße wäre somit:
Sub xefeld_in_normalschrift() ' ' Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:="XE" Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Font.Reset Selection.MoveRight Unit:=wdCharacter, Count:=1 End Sub
Nach der Aktion steht der Cursor rechts vom XE-Feld und die Markierung ist aufgehoben, sodass nach dem nächsten XE-Feld gesprungen werden kann.
Damit könnte man per Mausklick auf das Makro (Button im Menüband oder auf Schnellzugriffsleiste) das gesamt Dokument durchsteppen.
Sub SearchTextBox() ' Makro von Allen Wyatt 2018 Dim shp As Shape Dim sTemp As String Dim iAnswer As Integer For Each shp In ActiveDocument.Shapes If shp.Type = msoTextBox Then shp.Select Selection.ShapeRange.TextFrame.TextRange.Select sTemp = Selection.Text sTemp = Left(sTemp, 1000) iAnswer = MsgBox("Box contains text beginning with:" & vbCrLf _ & sTemp & vbCrLf & "Stop here?", vbYesNo, "Located Text Box") If iAnswer = vbYes Then Exit For End If Next End Sub
Hier ist der zu markierende Bereich auf 1000 Buchstaben eingestellt. Das ist aber nicht als einzig gültige Zahl gemeint, sondern als Obergrenze. Das heißt, auch wenn nur drei Buchstaben enthalten sind, stürzt das Makro nicht ab. Falls es Textrahmen mit mehr Buchstaben gibt, müsste die Obergrenze angepasst werden.
Sub ConvertTextboxText() ' Makro von Allen Wyatt 2018 Dim shp As Shape Dim oRngAnchor As Range Dim sTemp As String Dim J As Long For J = ActiveDocument.Shapes.Count To 1 Step -1 Set shp = ActiveDocument.Shapes(J) If shp.Type = msoTextBox Then sTemp = shp.TextFrame.TextRange.Text If Len(sTemp) > 1 Then Set oRngAnchor = shp.Anchor.Paragraphs(1).Range sTemp = Left(sTemp, Len(sTemp) - 1) oRngAnchor.InsertBefore "[[ " & sTemp & " ]]" End If shp.Delete End If Next J End Sub
Damit werden sämtliche Textrahmen in einem Dokument der Reihe nach gesucht, ihr Textinhalt wird herauskopiert und vor dem Textrahmen in das Dokument eingefügt (dabei mit doppelten eckigen Klammern umgeben), und anschließend wird der Textrahmen gelöscht.
a) gesamtes Dokument:
b) markierter Bereich:
Alles mit Selection.Range anstelle von ActiveDocument, wenn in markiertem Bereich gezählt werden soll, also z.B.
Selection.Range.Paragraphs.Count
von WordTipsNet:
zwei Möglichkeiten:
CurPage = Selection.Information(wdActiveEndAdjustedPageNumber)
oder
CurPage = Selection.Information(wdActiveEndPageNumber)
Die erste Variante holt die „logisch“ richtige Seitenzahl, wenn also die erste Seite auf einen Wert größer als 1 gesetzt wurde, die zweite liefert die „physikalisch“ richtige.
Es können Variablen definiert werden, mit denen sich dann einfach weitermachen lässt, z.B.:
a = Selection.Range.Paragraphs.Count
Dann könnte es im Makrocode weiter heißen:
MsgBox a
Damit würde die Zahl der Absätze in der Selektion angezeigt werden.
Möchte man die jeweilige Zahl in das Dokument an der Stelle einfügen, an der der Cursor blinkt oder die markiert ist:
Selection.TypeText Text:= a
Der Text im Dokument könnte dann lauten:
„Der markierte Bereich enthält 5 Absätze“
falls der Cursor zwischen „enthält“ und „Absätze“ stand und die Variable a im vorhergehenden Makro den Wert 5 erhalten hatte.
mit
wird Word in einen anderen Modus umgeschaltet, in dem der Cursor wie ein Schmetterling aussieht.
Klickt man nun auf einen Menübefehl, geht das Fenster „Tastatur anpassen“ auf und der Name des Befehls wird markiert. Leider kann er nicht einfach kopiert werden, aber er lässt sich abschreiben und anschließend in einem Makro verwenden.
Sub nichtdr_aus() ' ' nichtdruckbare Zeichen ausschalten ' ' Dim a As Long ActiveWindow.ActivePane.View.ShowAll = Not ActiveWindow.ActivePane.View. _ ShowAll a = MsgBox("Sind die Absatzmarken zu sehen?", vbYesNo) 'wenn die Antwort "nein" lautet, ergibt sich der Wert 7; bei "ja" ergibt sich 6 If a = "6" Then ActiveWindow.ActivePane.View.ShowAll = Not ActiveWindow.ActivePane.View. _ ShowAll End If End Sub
Sub nichtdr_ein() ' ' nichtdruckbare Zeichen einschalten ' ' Dim a As Long ActiveWindow.ActivePane.View.ShowAll = Not ActiveWindow.ActivePane.View. _ ShowAll a = MsgBox("Sind die Absatzmarken zu sehen?", vbYesNo) 'wenn die Antwort "nein" lautet, ergibt sich der Wert 7; bei "ja" ergibt sich 6 If a = "7" Then ActiveWindow.ActivePane.View.ShowAll = Not ActiveWindow.ActivePane.View. _ ShowAll End If End Sub
Die Befehle für ein- und ausschalten sind identisch, daher muss abgefragt werden, ob die Absatzmarken zu sehen sind. Die Msg-Box erhält zwei Schalter: „ja“ und „nein“ (vbYesNo). Was angeklickt wurde, kann über die Variable a festgehalten werden. Es scheint so zu sein, dass die Antwort „ja“ dem, Wert 6, die Antwort „nein“ dem Wert 7 entspricht.
Sub feldsyntax_aus() ' ' feldsyntax ausschalten ' ' Dim a As Long ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes a = MsgBox("Ist die Feldsyntax zu sehen?", vbYesNo) 'wenn die Antwort "nein" lautet, ergibt sich der Wert 7; bei "ja" ergibt sich 6 If a = "6" Then ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes End If End Sub
Sub feldsyntax_ein() ' ' feldsyntax einschalten ' ' Dim a As Long ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes a = MsgBox("Ist die Feldsyntax zu sehen?", vbYesNo) 'wenn die Antwort "nein" lautet, ergibt sich der Wert 7; bei "ja" ergibt sich 6 If a = "7" Then ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes End If End Sub
Das Öffnen von Dialogfenstern kann nicht aufgezeichnet werden.
Syntax zum Öffnen:
Die runden Klammern müssen hingeschrieben werden.
Beispiel:
Sub suchenfenster_oeffnen() ' ' Suchenfenster aufrufen ' ' Dialogs(wdDialogEditFind).Display End Sub
Weitere interessante Dialogfelder, zu deren Öffnen es kein Standard-Tastenkürzel gibt:
Bezeichnung des Fensters | Word-interner Dialogfenster-Name |
---|---|
Absatzformat-Fenster | wdDialogFormatParagraph |
Einfügen - Text aus Datei | wdDialogInsertFile |
Einfügen - Bild einfügen aus - Dieses Gerät | wdDialogInsertPicture |
Einfügen - Tabelle einfügen | wdDialogTableInsertTable |
Layout - Seite einrichten | wdDialogFilePageSetup |
Layout - Silbentrennung | wdDialogToolsHyphenation |
Situation: Cursor befindet sich gerade an einer bestimmten Stelle und man möchte ein paar Seiten weiter etwas nachschauen und anschließend wieder zur Ausgangsposition zurückgehen.
Problem: Zumindest bei den neueren Word-Versionen (2016 und neuer) wird der Cursor beim Blättern durch das Dokument mitgenommen. Selbst, wenn die Option „Einfügemarke mit Bildlauf verschieben“ nicht gesetzt ist, wird der Cursor mitgenommen. Das Problem lässt sich nur mit Makros lösen:
Gut ist, dass ein und derselbe Textmarkenname überall eingesetzt werden kann. Denn sobald eine Textmarke mit demselben Namen an einer Stelle eingefügt wird, wird sie an anderer Stelle gelöscht. Der Name der Textmarke könnte z. B. „sprung“ lauten.
Makro1:
Sub sprungmarke() ' ' sprungmarke setzen an cursorposition ' ' With ActiveDocument.Bookmarks .Add Range:=Selection.Range, Name:="sprung" .DefaultSorting = wdSortByName .ShowHidden = True End With End Sub
Makro 2:
Sub sprung_zurueck() ' ' sprung_zurueck Makro ' ' Selection.GoTo What:=wdGoToBookmark, Name:="sprung" With ActiveDocument.Bookmarks .DefaultSorting = wdSortByName .ShowHidden = True End With End Sub
Den Makros sollten Tastenkürzel zugewiesen oder sie sollten als Schaltflächen auf dem Menüband platziert werden.
Sub gehezu_dokumentanfang() Selection.HomeKey Unit:=wdStory End Sub
Sub eine_seite_weiter() Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Count:=1, Name:="" End Sub
Es gibt kein Tastenkürzel für „eine Seite weiter“, daher muss die Gehe-zu-Funktion genommen werden.
Sub seitenende_mark() ' ' seitenende_mark. Geht ans Seitenende und fügt den Text <END> ein. Vor dem Start des Makros muss die Anzeige der nichtdruckbaren Zeichen ausgeschaltet sein. ' Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Count:=1, Name:="" 'Jetzt muss die Anzeige der nichtdruckbaren Zeichen eingeschaltet werden, damit der Cursor nach dem Zurückgehen um einen Buchstaben //hinter// evtl. vorhandenem ausgeblendet formatiertem Text steht. ActiveWindow.ActivePane.View.ShowAll = Not ActiveWindow.ActivePane.View. _ ShowAll Selection.MoveLeft Unit:=wdCharacter, Count:=1 Selection.TypeText Text:="<END>" Selection.MoveLeft Unit:=wdCharacter, Count:=5, Extend:=wdExtend With Selection.Font .Hidden = True .Color = wdColorRed End With 'Jetzt muss die Anzeige der nichtdruckbaren Zeichen wieder ausgeschaltet werden, damit der Cursor am Ende der tatsächlichen Seite steht. ActiveWindow.ActivePane.View.ShowAll = Not ActiveWindow.ActivePane.View. _ ShowAll Selection.MoveDown Unit:=wdLine, Count:=1 End Sub
Schleife:
Sub seitenende_mark_schleife() Dim a Selection.EndKey Unit:=wdStory Selection.MoveLeft Unit:=wdCharacter, Count:=1 a = Selection.Information(wdActiveEndPageNumber) 'jetzt ist die Zahl der Seiten bekannt 'die Schleife soll bis a - 1 laufen, und zwar vom Anfang des Dokumentes an Selection.HomeKey Unit:=wdStory For i = 1 To a - 1 Application.Run MacroName:="seitenende_mark" Next i 'Jetzt wird noch auf der letzten Seite die Seitenmarkierung gesetzt ActiveWindow.ActivePane.View.ShowAll = Not ActiveWindow.ActivePane.View. _ ShowAll Selection.EndKey Unit:=wdStory Selection.MoveLeft Unit:=wdCharacter, Count:=1 Selection.TypeText Text:="<END>" Selection.MoveLeft Unit:=wdCharacter, Count:=5, Extend:=wdExtend With Selection.Font .Hidden = True .Color = wdColorRed End With ActiveWindow.ActivePane.View.ShowAll = Not ActiveWindow.ActivePane.View. _ ShowAll Selection.HomeKey Unit:=wdStory End Sub
Diese Kennung kann z. B. verwendet werden, um manuelle Seitenumbrüche einzubauen. Das könnte einfach per Suchen/Ersetzen geschehen: Suche nach <END>, ersetze durch manuellen Seitenumbruch. Eine andere Verwendung findet die Markierung im Manipulieren der XML-Daten einer Word-Datei. in der Datei word.xml sin d z.B. bei Tabellen keine Seiteninformationen zu finden. Das heißt, wenn eine Tabelle von einer Seite zur anderen geht, ist nicht klar, welcher Teil auf Seite a, welcher auf Seite b ist. Die <END>-Markierung wird mit dem obigen Makro aber überall eingebaut, auch in Tabellen. Das heißt, nun liegt die benötigte Information auch in word.xml vor. Das ist z. B. nützlich, um die XE-Felder mit zugeordneten Seitenzahlen aus der word.xml herauszuholen.
Achtung: in Tabellen lassen sich manuelle Seitenumbrüche nicht an beliebigen Stellen einbauen. Das gezielte Einbau eines manuellen Seitenumbruchs mitten in einer Zelle funktioniert nicht wie gedacht: Es wird immer die komplette Zelle verschoben. Auch die Methode „Seitenumbruch oberhalb“ in den Absatzeinstellungen funktioniert nicht. Das heißt, Tabellenumbrüche sind immer von Hand anzupassen. Der Einbau der <END>-Markierung klappt aber, sodass eine Verarbeitung der xml-Daten möglich ist.
Das geht mit Application.Run MacroName:=„<Name des anderen Makros>“
Beispiel:
Sub seitenzahl_nach_vorn_schleife() ' ' seitenzahl_nach_vorn_schleife ' ' Dim absatz As Paragraph Selection.HomeKey Unit:=wdStory Selection.MoveDown Unit:=wdLine, Count:=1 For Each absatz In ActiveDocument.Paragraphs Application.Run MacroName:="seitenzahl_nach_vorn" Next absatz 'hier erscheint am ende eine Fehlermeldung, die einfach durch "Beenden" weggeklickt werden kann ' danach kann sortiert werden End Sub
Hier wird das Makro seitenzahl_nach_vorn
aufgerufen.
demonstriert am Beispiel eines Suchen-Makros, das nach dem Finden eines Textstrings bestimmte Aktionen vornehmen soll (Markierung erweitern und den markierten Text löschen), hier mit einer While … Wend-Schleife:
Sub textaufbereiten01() ' ' textaufbereiten Makro ' ' Selection.Find.ClearFormatting With Selection.Find .Text = "<" .Replacement.Text = "" .Forward = True .Wrap = wdFindAsk .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With While Selection.Find.Execute Selection.Extend Selection.Extend Character:=">" Selection.EscapeKey Selection.TypeBackspace Wend MsgBox "Alle Tags entfernt", vbOKOnly End Sub
Wichtig ist hier, dass die Suche zunächst als Makro aufgezeichnet werden kann. Anschließend braucht man nur die Execute-Methode sowie die nachfolgenden Textänderungsbefehle mit einer While-Schleife zu umgeben (Beginn: While, Ende: Wend). Die Message-Box kann auch weggelassen werden.
Zeichnet man einen Suchen-Vorgang auf, so steht der Suchbereich standardmäßig auf „Gesamt“. Der zugehörige Makrocode besteht aus zwei Zeilen, er lautet:
.Forward = True .Wrap= wdFindContinue
Stellt man den Bereich auf „Nach unten“ ein, so heißt der Code
.Forward = True .Wrap = wdFindAsk
und entsprechend bei „Nach oben“:
.Forward = False .Wrap = wdFindAsk
Die Gesamt-Suche zeichnet sich dadurch aus, dass sowohl .Forward auf „True“ steht als auch .Wrap auf „wdFindContinue“, während bei Suche „Nach unten“ aus „.Wrap = wdFindContinue“ ein „.Wrap = wdFindAsk“ wird. Bei Suche „Nach oben“ wird zusätzlich aus „.Forward = True“ ein „.Forward = False“.
„.Wrap = wdFindAsk“ bedeutet, dass Word fragt, ob es weitermachen soll, wenn es das Ende bzw. den Anfang des Dokuments erreicht hat. Wenn man dann einfach mit „Nein“ antwortet, wird das Makro beendet.
Um ein Beenden des Makros zu erreichen, ohne gefragt zu werden, muss der Makrocode in
.Wrap = wdFindStop
geändert werden. Dieses Beenden kann nicht aufgezeichnet werden, sondern man muss den Code manuell eingeben.
Für das Ende der Schleife müssen nur dann keine besonderen Parameter vorgegeben werden, wenn klar ist, dass nach einem einmaligem Durchlauf keine Fundstellen mehr vorhanden sind. Lautet der Code
.Forward = True .Wrap= wdFindContinue
läuft Word grundsätzlich so lange weiter, bis das Suchmuster nicht mehr auftritt. Das heißt, die Schleife wird so oft durchlaufen, bis es nichts mehr zu tun gibt.
Weitere mögliche Schleifentypen sind:
Beispiel:
For Each absatz in ActiveDocument.Paragraphs <mache dies oder jenes> Next absatz Dabei ist "absatz" eine Variable, die vor der Schleife deklariert werden muss. ActiveDocument.Paragraphs ist die Ansammlung aller Absätze im Dokument. Die Deklaration lautet wie folgt:
Dim absatz As Paragraph
For-Each…Next-Schleifen hören von selbst auf, wenn das letzte Element der Sammlung bearbeitet worden ist.
Näheres z. B. bei https://www.youtube.com/watch?v=db0MVX-GUg4
a) In einer Zeile, in der eine Nummer am Ende steht, die Nummer an den Anfang der Zeile verschieben:
Sub seitenzahl_nach_vorn() ' ' seitenzahl_nach_vorn Makro ' ' Selection.EndKey Unit:=wdLine Selection.Find.ClearFormatting With Selection.Find .Text = ", " .Replacement.Text = "" .Forward = False .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.Extend Selection.Extend Character:=Chr(13) Selection.EscapeKey Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend Selection.Cut Selection.HomeKey Unit:=wdLine Selection.PasteAndFormat (wdFormatOriginalFormatting) Selection.TypeText Text:="| " Selection.MoveDown Unit:=wdLine, Count:=1 End Sub
zugehörige Schleife (For Each … Next) für gesamtes Dokument (wenn das Dokument z.B. ein Register enthält), wobei das vorstehende Makro innerhalb der Schleife aufgerufen wird (Application.Run MacroName):
Sub seitenzahl_nach_vorn_schleife() ' ' seitenzahl_nach_vorn_schleife ' ' Dim absatz As Paragraph Selection.HomeKey Unit:=wdStory Selection.MoveDown Unit:=wdLine, Count:=1 For Each absatz In ActiveDocument.Paragraphs Application.Run MacroName:="seitenzahl_nach_vorn" Next absatz 'hier erscheint am ende eine Fehlermeldung, die einfach durch "Beenden" weggeklickt werden kann ' danach kann sortiert werden End Sub
Die nächste Schleife macht dasselbe, aber mit For…Next und Zähler:
Sub seitenzahl_nach_vorn_schleife_02() ' ' seitenzahl_nach_vorn_schleife mit For...Next und Zähler ' ' Dim i totParas = ActiveDocument.Paragraphs.Count Selection.HomeKey Unit:=wdStory Selection.MoveDown Unit:=wdLine, Count:=1 For i = 2 To (totParas - 1) Application.Run MacroName:="seitenzahl_nach_vorn" Next i End Sub
b) Mit der Gehezu-Funktion zum nächsten XE-Feld springen und Schriftgröße zuweisen:
Das einzelne Makro wird oben beschrieben. Eine Schleife auf der Basis von For Each … Next bietet sich an, weil man sich keine Gedanken machen muss, wie viele Felder im Dokument vorkommen; vielmehr hört die Schleife nach dem letzten Vorkommnis einfach auf.
Sub xefeld_normalschrift_schleife() ' ' Dim feld As Field For Each feld In ActiveDocument.Fields Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:="xe" Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Font.Reset Selection.MoveRight Unit:=wdCharacter, Count:=1 Next feld End Sub
Hier ist ActiveDocument.Fields die Menge aller Felder im Dokument.
geht mit <Strg-Pause>; muss evtl. etwas länger gehalten werden
Sub textmarke_aus_markierung_variabel() ' ' Aufpassen: Markierung darf nur Zeichen enthalten, die in Textmarkennamen erlaubt sind! ' Textmarke wird vor dem Text erzeugt ' a = Selection.Text Selection.MoveLeft Unit:=wdCharacter, Count:=1 With ActiveDocument.Bookmarks .Add Range:=Selection.Range, Name:=a .DefaultSorting = wdSortByName .ShowHidden = False End With End Sub
Weiter oben unter „Berechnungen mit variablem Text“ wird gezeigt, wie auf markierten Text Textfunktionen angewandt werden können. Das kann man nutzen, um Textmarkennamen systematisch zu vergeben.
Der Name soll z. B. aufgebaut sein aus:
Wenn also das XE-Feld „Schlüsselkomponenten“ auf S. 24 erzeugt wurde, wäre der Name der Textmarke:
Das Makro muss zum XE-Feld gehen (siehe dazu nächsten Abschnitt), den Inhalt des Feldes markieren und auf Basis der Markierung und der Anwendung von Textfunktionen die Textmarke vor dem XE-Feld erzeugen.
Die Seitenzahl wird mit
s = Selection.Information(wdActiveEndAdjustedPageNumber)
geholt.
Sub textmarke_aus_markierung_systematisch() ' ' Aufpassen: Markierung darf nur Zeichen enthalten, die in Textmarkennamen erlaubt sind! ' Textmarke wird vor dem Text erzeugt ' Dim a, b, c, d, e, f, s a = Selection.Text b = Len(a) c = left(a, 2) 'erste beide Zeichen von a, also 2 Zeichen von links d = Mid(a, b - 1) 'letzte beide Zeichen von a, also 2 Zeichen von rechts e = c & d s = Selection.Information(wdActiveEndAdjustedPageNumber) f = "i_" & s & e Selection.MoveLeft Unit:=wdCharacter, Count:=7 'bei einem XE-Feld sind es 7 Zeichen, die nach links gegangen werden müssen, wenn der Textinhalt markiert ist With ActiveDocument.Bookmarks .Add Range:=Selection.Range, Name:=f .DefaultSorting = wdSortByName .ShowHidden = False End With End Sub
Für diesen Fall ist es gut, mit Textmarkennamen zu arbeiten, die aus einem Buchstaben gefolgt von einer Zahl bestehen, und zwar werden die Textmarken auf jeder Seite des Dokuments eingebaut: z.B. auf Seite 52 die Textmarke „t52“, auf Seite 117 die Textmarke „t117“ usw. Vorgehen bei Verlinkung:
Sub link01() ' ' link01 Makro ' ' r = "t" + Selection.Text Selection.InsertCrossReference ReferenceType:="Textmarke", ReferenceKind:= _ wdContentText, ReferenceItem:=r, InsertAsHyperlink:=True, _ IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" " End Sub
Liegt unter der Textmarkierung der Text „52“, dann würde also die Variable r besetzt mit „t52“; und bei
ReferenceItem:=r,
würde somit „t52“ als Name der Textmarke eingefügt.
Innerhalb des Word-Dokuments wäre das OK, die Querverweise werden auch in ein PDF übertragen. Für ein E-Book reicht es allerdings nicht, denn in E-Books funktionieren die aus Word kommenden Querverweise nicht. Man muss zu Hyperlinks greifen.
Da es in E-Books keine Seiten gibt und die Seitenzahlen der Printversion keinen Sinn mehr haben, muss mit Absatznummern gearbeitet werden. Das heißt, jeder Absatz des Dokuments, der einen „Informationsbereich“ eröffnet (vgl. Chicago Manual of Style), wird mit einer Nummer versehen. Aus der Nummer (die auch publiziert wird) muss (am besten per Makro) eine Textmarke erzeugt werden, die am besten direkt vor der Nummer am blinkenden Cursor eingebaut wird (sie umfasst also keinen Text). Der Textmarkenname darf wieder nur aus erlaubten Zeichen bestehen, d.h. insbesondere, dass er nicht mit einer Zahl beginnen darf. Die Erzeugung der Textmarke ist ein Thema für sich (vgl. Evernote). Angenommen, ein solcher Name lautet a1_5z, und im Index möchte man vom Locator a1_5z auf diese Textmarke verlinken. Vorgehen:
Damit ist der Link erzeugt.
Das vostehend beschriebene Vorgehen funktioniert manuell. Zeichnet man die Schritte als Makro auf, hat man Problem, dass im Makro genau der erste kopierte Text als konstanter Wert im Makro steht. Was benötigt wird, ist aber ein variabler Textwert, nämlich immer der Textinhalt, der gerade markiert ist. Tests haben ergeben, dass man nicht mit dem Hyperlink-Feld arbeiten darf, sondern die Hyperlinkfunktion nehmen muss. Bei der kann man beim Aufzeichnen zwar nur manuell eine ganz bestimmte Textmarke auswählen, aber im Makrocode lässt sich der Textmarkenwert flexibel einstellen. Der Makrocode lautet dann:
Sub hyperlink_variabel_erzeugen() a = Selection.Text ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:="", _ SubAddress:=a, ScreenTip:="", TextToDisplay:=a End Sub
Die Verlinkung geschieht dann, indem man im Index den Locator markiert und das Makro auslöst. Das war's auch schon!
Die zu publizierenden Absatznummern könnten übrigens, fall erwünscht, per Suchen/Ersetzen noch in eine andere Form gebracht werden, z.B. könnte aus a1_5z der Ausdruck [1.5] oder einfach 1.5 werden und entsprechend bei den anderen Nummern. Am besten erledigt man das über die gesamte Datei (einschließlich Index) hinweg per Mustersuche. Die Links werden dadurch nicht verändert!
<hi>Das Gute: Hyperlinks werden von Word an HTML weitergereicht und von dort an EPUB!</hi>
D.h. aber: Per Verlinkung ist ein EPUB-Index erzeugbar, der vom äußeren Format genauso aussieht wie ein Print-Index (was Einzüge angeht und vor allem das Vorhandensein von Locators). Die ansonsten üblichen EPUB-Indexe, die mit den in den EPUB-Programmen (z.B. Jutoh und Sigil) vorhandenen Index-Funktionen erzeugt werden, besitzen keine Locators!
Näheres zur Übergabe von Indexmarken und Indexen aus Word an EPUB ist hier zu erfahren: Index mit Hyperlinks
Will man HTML für die Weiterverarbeitung Richtung E-Book erzeugen, empfiehlt es sich, die versteckten Textmarken, die Word während der IHV-Erzeugung automatisch bei Überschriften einbaut, rauszuwerfen. Dazu kann das folgende Makro dienen, das aus dem Forum „https://windowssecrets.com/“ stammt:
Sub DeleteHiddenBookmarks() Dim i As Long ActiveDocument.Bookmarks.ShowHidden = True For i = ActiveDocument.Bookmarks.Count To 1 Step -1 If Left$(ActiveDocument.Bookmarks(i).Name, 4) = "_Toc" Then ActiveDocument.Bookmarks(i).Delete End If Application.ActiveDocument.UndoClear Next i ActiveDocument.Bookmarks.ShowHidden = False End Sub
Manchmal möchte man einen Text durchgehen um bestimmte Wörter oder einfach nur Textstrings der Reihe nach markieren und sammeln, um die gesammelte Liste an anderer Stelle verwenden zu können.
Dazu sind zwei Methoden einsetzbar:
Die Spike-Funktion wird per <Strg-F3> aufgerufen. Das heißt: Begriff markieren, dann <Strg-F3> betätigen. Man geht den Text von vorn bis hinten durch und jedes Mal, wenn man auf eine zu sammelnde Textstelle trifft, wird diese markiert und aufgespießt (und automatisch in die Autotextsammlung eingefügt). Im Vergleich zum obigen Markierungsverfahren hat die Spike-Funktion den Vorteil, dass das Sammeln jederzeit unterbrochen und später fortgesetzt werden kann. Solange man eine Sammlung (also den Autotext) nicht verwendet, bleibt sie erhalten und kann „aufgestockt“ werden.
Die Spike-Funktion in ihrer Originalversion hat allerdings einen Haken: Der markierte Text wird ausgeschnitten. Das soll meistens aber nicht sein. Möchte man nur kopieren und sammeln, nicht aber ausschneiden und sammeln, muss ein Makro verwendet werden, mit dessen Hilfe ein reiner Kopiervorgang ausgelöst wird. Das Makro lässt sich nur teilweise aufzeichnen, weswegen ich auf eine Idee von Paul Beverley zurückgreife (zu finden auf seiner Website: http://www.archivepub.co.uk/book.html). Er schlägt folgenden Code für SpikeCopy vor:
Sub SpikeCopy() 'Paul Beverley Version 26.02.11 'Copy to spike NormalTemplate.AutoTextEntries.AppendToSpike Range:=Selection.Range WordBasic.EditUnDo End Sub
Das Besondere an diesem Code ist der UnDo-Befehl. Damit wird das Ausschneiden des markierten Textes rückgängig gemacht. Der Code funktioniert auch 2021, allerdings gefällt mit nicht, dass mit einem WordBasic-Befehl gearbeitet wird, der aus der Zeit von Word 97 stammt. Tatsächlich enthält auch das moderne VBA einen UnDo-Befehl:
ActiveDocument.Undo
Die moderne Version des Codes lautet also:
Sub SpikeCopy() 'Paul Beverley Version 26.02.11; Walter Greulich 2021 'Copy to spike NormalTemplate.AutoTextEntries.AppendToSpike Range:=Selection.Range ActiveDocument.Undo End Sub
Dem Makro wird ein Tastenkürzel zugewiesen (z. B. <Strg-F3>, womit das Kürzel für die Urversion der Spike-Funktion überschrieben würde) oder es wird auf das Menüband oder die Schnellzugriffsleiste gelegt, wo es per Maus aufgerufen werden kann.
Nachdem die letzte Textstelle aufgespießt wurde, kann der Inhalt der Autotextsammlung an beliebiger Stelle im gleichen Dokument oder auch in einem anderen Dokument eingefügt werden. Das geht am einfachsten per <Strg-Umsch-F3>. Eine andere Möglichkeit bestünde darin, die AutoText-Funktion von Word aufzurufen, die Sammlung anzuklicken und Einfügen zu wählen. Im Augenblick des Einfügens wird die Sammlung geleert. Das Leeren lässt sich nicht verhindern. Soll sichergestellt werden, dass die Liste für eine spätere Einfüge-Aktion erneut zur Verfügung steht, muss sie nach dem ersten Einfügen markiert und bewusst als Autotext abgelegt werden: Liste markieren, dann AutoText-Funktion aufrufen, dann Auswahl im AutoText-Katalog speichern, dann Namen vergeben und OK. Dieser Autotext bleibt erhalten. Danach kann die Liste jederzeit in ein Dokument eingefügt werden, indem der Name des Autotextes direkt in das Dokument eingetastet und dann die Taste F3 gedrückt wird.
siehe E-Book-Indexing und Index mit Hyperlinks
Ziel: Textstücke (Wörter, Absätze) sollen an zentraler Stelle verwaltet, aber beliebig oft im Dokument eingesetzt werden können. Wenn der Inhalt des Textstücks dann an der zentralen Stelle geändert wird, sollen sich alle Stellen im Dokument, an denen darauf verwiesen wird, automatisch mitändern.
Suchen/Ersetzen ist keine Alternative, weil es evtl. andere Stellen im Dokument gibt, die genauso lauten, aber nicht verändert werden sollen. Ein Beispiel wäre ein Name, der mehrmals im Dokument vorkommt, aber nur an bestimmten Stellen automatisch verändert werden soll. Umsetzen lässt sich das mit
Man könnte daran denken, dass Autokorrektur oder AutoText bei der Erzeugung eines Textes eingesetzt werden könnten (Eintippen eines Kürzels, das automatisch in den eigentlichen Text umgewandelt wird). Das ist zwar grundsätzlich richtig, aber solche Textstellen würden sich in keiner Weise von anderen unterscheiden, könnten also nur manuell oder per Suchen/Ersetzen verändert werden. Eine Variabilität der oben beschriebenen Art wäre nicht gegeben.
Textmarken kommen immer dann zum Einsatz, wenn Querverweise benötigt werden. Querverweise zeichnen sich dadurch aus, dass sie genau den Text wiedergeben, der sich „in der Textmarke befindet“.
Um eine Textmarke zu erzeugen, wird üblicherweise ein Textstück (etwa der Name Müller) markiert und dann per Menü [Einfügen - Textmarke
] das Textmarken-Fenster aufgerufen. Nun wird ein Name vergeben (z. B. muel) und mit OK bestätigt.
Anschließend kann im Dokument an beliebigen Stellen ein Querverweis auf diese Textmarke eingebaut werden, indem die Querverweis-Funktion betätigt wird. Da diese Funktion letztlich nichts anders macht, als ein REF-Feld einzufügen, kann auch gleich (also unter Umgehung der Querverweisfunktion) dieses Feld eingebaut werden. Dazu Strg-F9
betätigen und dann zwischen den Feldklammern eintippen: REF „Name der Textmarke“. Im genannten Beispiel würde das Feld so aussehen: { REF „muel“ }
. Mit Alt-F9 kann von der Feldsyntax-Ansicht in die Feldergebnisansicht umgeschaltet werden und an der Stelle des REF-Feldes würde „Müller“ angezeigt werden.
Das Feld { REF „muel“ }
kann an beliebigen Stellen und beliebig oft im Dokument eingebaut werden. Um an allen diese Stellen nicht Müller, sondern „Schmidt“ anzuzeigen, bräuchte jetzt nur der Inhalt der Textmarke geändert, das gesamte Dokument markiert und die Feldaktualisierung per F9
ausgelöst zu werden. Wichtig dabei ist, dass tatsächlich nur der Inhalt der Textmarke, nicht aber der Name der Textmarke geändert wird. Sonst ginge der Bezug verloren.
Das Textmarken-Verfahren hat den großen Vorteil, ohne großen Aufwand umgesetzt werden zu können. Man könnte z. B. eine Liste von Begriffen in einer Tabelle am Anfang oder Ende des Dokuments vorhalten und jeden der Begriffe mit einer Textmarke versehen. Die Tabelle wäre dann die zentrale Stelle der Verwaltung der „Variablen“.
Ein kleiner Nachteil des Verfahrens besteht darin, dass die Textmarken (also die Tabelle, die sie enthält) Teil des Dokumenttextes sind, also genauso gesehen werden und Platz benötigen wie der eigentliche Dokumenttext. Gebraucht werden sie aber eigentlich nur temporär. Sie müssten zum Abschluss des Projekts aus dem Dokumenttext entfernt werden. Das grundsätzlich kein Problem, aber die REF-Felder dürfen danach nicht mehr aktualisiert werden. Um einer versehentlichen Aktualisierung vorzubeugen, sollten alle REF-Felder in normalen Text umgewandelt werden: Strg-a
, dann Strg-6
oder Strg-Umsch-F9
.
Als weiteren Nachteil könnte man sehen, dass Textmarken nicht von anderen Dokumenten aus aufgerufen werden können. Sie gehören immer genau zu einem Dokument, und nur innerhalb dieses Dokuments können Bezüge zu ihnen hergestellt werden (per REF-Feld). Doch auch das lässt sich einfach lösen: Die Tabelle mit den Textmarken braucht nur kopiert und in ein anderes Dokument eingefügt zu werden, und schon stehen die Textmarken auch hier zur Verfügung.
Zentral und Filialdokumente
können Textmarken auch über mehrere Dokumente hinweg aufgerufen werden.Weiterhin wichtig zu wissen: Als zentrale Stelle lässt sich eine Dokumentvorlage anlegen, die die Tabelle mit den Textmarken enthält. Die Pflege der Textmarken würde dann immer in der Dokumentvorlage geschehen. Braucht man die Textmarken in einem neuen Dokument, so könnte dieses Dokument einfach auf Basis der Dokumentvorlage erzeugt werden. Bei einem bereits existierenden Arbeitsdokument müsste ein kleiner Umweg gegangen werden: Erst neues Dokument auf Basis der besagten Dokumentvorlage erzeugen, dann die hier vorhandene Tabelle mit den Textmarken kopieren und in das Arbeitsdokument einfügen. Das neue Dokument könnte dann - ohne speichern - geschlossen werden, weil es seinen temporären Zweck erfüllt hat.
Die zentrale Stelle, an der variable Texte verwaltet werden, kann aus dem Dokumenttext herausverlagert werden, und zwar hin zum Dokumenteigenschaftsfenster. Jedes Dokument besitzt Eigenschaften wie die Dateigröße, die Zahl der Buchstaben und Wörter usw. Neben den sich automatisch ergebenden Eigenschaften können auch benutzerdefinierte „Eigenschaften“ eingegeben werden. Dabei handelt es sich aber nicht um wirkliche Eigenschaften, sondern um Textvariablen.
Vorgehen:
Menü [Datei - Informationen
], dann die Schaltfläche Erweiterte Eigenschaften
betätigen:
Es geht ein Fenster mit mehreren Reitern auf, hinter denen sich Informationen zu Eigenschaften des Dokuments verbergen. Wichtig für Textvariablen ist der Reiter Anpassen
:
Es gibt etliche Standard-Variablen wie Abschlussdatum, Projekt usw. Klickt man auf eine der Variablen, kann bei Typ ausgewählt werden, ob es sich um Text, Zahl oder Datum handelt, und bei Wert wird der eigentliche Inhalt der Variablen eingegeben. Mit Hinzufügen
wird der Wert festgehalten und mit OK
wird bestätigt, und schon steht die Variable mit dem ihr zugeordneten Wert im Dokument zur Verfügung.
Um den Variablenwert im Text anzuzeigen, wird das Feld DocProperty benötigt. Hat man zum Beispiel die Variable Projekt mit dem Wert 567 belegt, so sieht die Syntax des DocProperty-Feldes wie folgt aus:
{ DOCPROPERTY Projekt \* MERGEFORMAT }
und in der Feldergebnisansicht (Umschalten mit Alt-F9
) zeigt sich der Wert, also 567. Alle Stellen im Text, an denen das Feld eingebaut wird, zeigen dasselbe Ergebnis an.
Soll nun überall eine andere Projektnummer angezeigt werden, geht man in das Fenster der Dokumenteigenschaften und ändert auf dem Reiter Anpassen
die Nummer und bestätigt mit OK. Anschließend ist über Strg-a
der gesamte Dokumenttext zu markieren und F9
zur Feldaktualisierung zu betätigen.
Wie im Beispiel der Projektnummer kann auch mit benutzerdefinierten Variablen verfahren werden:
Hinzufügen
betätigen und alles mit OK
abschließen.{ DOCPROPERTY abc \* MERGEFORMAT }
Alt-F9
) , zeigt sich: Dies ist ein Test.
Die Variabilität zeigt sich wieder daran, dass nur der Wert der Variablen abc im Dokumenteigenschaftsfenster, also an einer zentralen Stelle, geändert werden muss und schon sind alle zugehörigen DocProperty-Stellen im Dokumenttext auf dem aktuellen Stand (vorher noch Strg-a
und F9
).
Nachteil des DocProperty-Verfahrens:
Copy and Paste
oder per Menü [Einfügen - Objekt - Text aus Datei
]Als zentrale Stelle zur Verwaltung dient bei Dokumentvariablen das Visual-Basic-Fenster. Mit anderen Worten: Jede Variable wird als Makro angelegt!
Vorgehen:
Entwicklertools - Makro
- Makronamen eingeben - Erstellen
]; der Makroname könnte z. B. lauten: test01 ActiveDocument.Variables.Add Name:=„Name der Dokumentvariable“, Value:=„Wert der Dokumentvariable“
ActiveDocument.Variables.Add Name:=„abc“, Value:=„Dies ist ein Docvariablentest“
Entwicklertools - Makro
- Makronamen auswählen - Ausführen
]; im Beispiel wird als Makroname test01 ausgewählt. Erst das Ausführen des Makros stellt den Variableninhalt nachfolgenden Aktionen (wie dem Einsatz des DocVariable-Feldes) zur Verfügung.F9
) angezeigt: Dies ist ein DocvariablentestVorteile des Dokumentvariable-Verfahrens:
Nachteile des Dokumentvariable-Verfahrens:
Damit wird aus dem Absatz (den Absätzen) ein Steuerelement, dessen Eigenschaften - ebenfalls auf der Gruppe „Steuerelemente“ - eingestellt werden können. U. a. kann gewählt werden:
dann
Danach führt der normale Speichern-Befehl zum Datenexport, nicht mehr zum Speichern der Gesamtdatei. Um also wieder normal speichern zu können, muss die Option wieder umgestellt werden.
Das Dateiformat von Office 2007 ist XML. Das hat zur Konsequenz, dass jede Word-Datei, die sich einem als .docx- oder .docm-Datei präsentiert, in Wirklichkeit ein Dateipaket ist, dass sich aus vielen XML-Dateien zusammensetzt!
Um das sehen zu können,braucht man einfach nur die Endung .zip an den Dateinamen dranzuhängen, sodass das Paket als Zip-Archiv (was es letzten Endes ist) behandelt und somit auch geöffnet werden kann. Also:
Nach dem Ansehen/Ändern einfach .zip wieder wegnehmen, und die Datei ist wie zuvor als Word-Datei nutzbar.
Eine weitere wichtige Konsequenz: Im darin enthaltenen Ordner „media“ sind sämtliche Bilder und Grafiken, die im Word-Dokument eingebettet sind, als einzelne Dateien enthalten! D.h., wenn es darum geht, diese Elemente zu vereinzeln, damit ein Grafiker/Layouter sie weiterverarbeiten kann, muss man sie einfach nur aus diesem Ordner herauskopieren! D.h. aber auch, dass zur Vereinzelung von Bildern in einem älteren Word-Dokument dieses nur mit Word 2007 geöffnet und im neuen Format abgespeichert werden muss!
Der Clou ist das XML-Format.
Könnte dann evtl. auch mit OpenOffice ähnlich verfahren werden? Ja, in der Tat,das geht dort genauso! Ebenfalls an .odt einfach nur .zip dranhängen und schon hat man Zugriff auf sämtliche Elemente!
In Word 2010 gibt es auf dem Reiter „Entwickertools“ unter „Vorlagen“ einen äußerst interessanten Befehl: Dokumentbereich. Wenn man den aufruft, erscheint ein Fenster, in dem zwei Dinge eingestellt werden können: a) Zuweisen einer benutzerdefinierten Vorlage für den Dokumentinformationsbereich, b) Einstellungen für den Dokumentinformationsbereich.
a) hab ich noch nicht ausprobiert, bei b) am besten das Häkchen setzen und sehen, was passiert.
Nach dem Häkchensetzen bei b) erscheint am oberen Dokumentrand ein „Datensatz“ mit einigen Feldern, in die Metadaten zum Dokument (wie Autor, Schlüsselwörter usw.) eingetragen bzw. in denen vorhandene Daten geändert werden können. Interessant ist, dass auch der Speicherort der Datei angezeigt wird.
Tipp: Der Dokumentinformationsbereich lässt einfacher aufrufen, wenn man den Befehl „Eigenschaften“ (unter „Alle Befehle“ zu finden) auf die Schnellzugriffsleiste legt.
Links oben im Dokumentinformationsbereich können unter der Schaltfläche „Dokumenteigenschaften“ die „Erweiterten Dokumenteigenschaften“ aufgerufen und angezeigt werden. Das ist nichts anderes als das, was bis Word 2003 unter Menü <Datei - Eigenschaften> direkt zugänglich war. Das heißt, es geht ein Fenster mit mehreren Reitern auf:
Während die ersten vier Reiter die üblichen Informationen bieten, lassen sich über den Reiter Anpassen die Werte von Dokumenteigenschaftsvariablen festlegen und sogar neue Variablen deklarieren. Die Variablenwerte können mit dem Feld DocProperty in ein Dokument eingefügt werden.
Anmerkung: Weitere Textvariablen erhält man mit Textmarken und speziellen Makros, die mit dem DocVariable-Feld ausgelesen werden können (siehe oben: „Variabler Text“).
Ich bin nicht sicher, ob es den nicht auch bereits in Word 2003 gab. In Word 2007 konnte er aufgerufen werden, indem man den runden Button links oben anklickte; daraufhin ging ein Menü auf, in dem der Inspektor direkt gewählt werden konnte.
In Word 2010 ist er etwas indirekter aufrufbar: Menüband <Datei - Informationen - Auf Probleme überprüfen (Für die Freigabe vorbereiten)>.
Wird der Befehl aufgerufen, erscheint ein Fenster, in dem eingestellt werden kann, auf welche Eigenschaften und Elemente hin das Dokument geprüft werden soll:
Nach der Prüfung werden die Ergebnisse in einem neuen Fenster gezeigt, und man kann angeben, was damit passieren soll. Beipielsweise können auf einen Schlag alle Kommentare und Überarbeitungen oder alle gefundenen persönlichen Daten gelöscht werden. Nicht schlecht!
Der Befehl kann auch auf das Menüband oder die Schnellzugriffsleiste gelegt werden: Er ist eines der vielen Makros, die ganz im Hintergrund liegen. Am besten mit der rechten Maustaste auf eine freie Stelle im Menüband klicken und dann „Menüband anpassen“ wählen. Links bei „Befehle auswählen“ auf „Alle Befehle“ gehen. In der Liste, die sich zeigt, den Befehl „Dokument prüfen“ wählen und rechts an passender Stelle hinzufügen. OK.
Damit liegt er aufrufbar im Menüband.
Entsprechend bei der Schnellzugriffsleiste verfahren.
Dieser sehr irritierende Effekt tritt auf, wenn in den Datenschutzoptionen im TrustCenter ein bestimmtes Häkchen gesetzt ist:
Dieses Häkchen wegnehmen, dann verhält sich die Datei wie gewohnt.
Das Häkchen ist Teil der sog. dokumentspezifischen Einstellungen.
Ein weiteres Häkchen in diesem Zusammenhang ist
Auch das kann weggenommen werden, damit man nicht jedes Mal darauf reagieren muss.
Auf das TA-Feld und das TAO-Feld kann nur zugegriffen werden, wenn in Word die Bearbeitungssprache Englisch zusätzlich zu Deutsch eingestellt ist!
Dazu in Windows die Office-Tools zum Office-Paket aufrufen und dann in die Spracheinstellungen gehen; dort unter [Weitere Bearbeitungssprachen hinzufügen] Englisch wählen.
Wird Word anschließend neu gestartet steht im Menüband unter „Verweise“ die Gruppe „Rechtsgrundlagenverzeichnis“ zur Verfügung.
In der c't vom 6.7.2009 war ein äußerst interessanter Artikel über die Möglichkeiten zur Anpassung der Multifunktionsleiste („Ribbon“) von MS Office 2007.
Links zu/aus diesem Artikel:
Wichtig: zum Ändern des Ribbons muss eine customUI-Datei im ZIP-Verzeichnis der jeweiligen Word-Datei abgelegt werden (vergl. vorstehenden Punkt: Dateiformat)
Empfehlenswertes Buch: Minhorst/Breden „Ribbon-Programmierung für Office 2007“. Addison Wesley 2009
siehe Acrobat/PDF
Solange alle an einem Projekt Beteiligten die gleichen Schriften auf ihren Rechnern haben, sollte es bei der Darstellung und beim Drucken von Dokumenten keine Schriftenprobleme geben.
Fehlt bei einem Beteiligten eine Schrift, so kann es ausreichen, sie im Dokument einzubetten:
Menü <Datei - Optionen - Speichern - Schriftarten in der Datei einbetten>:
Falls es nicht möglich, eine Schrift einzubetten (dafür kann es unterschiedliche Gründe geben, etwa rechtliche), muss die Schrift durch eine andere ersetzt werden. Das könnte mittels Suchen/Ersetzen geschehen oder aber mit meinem speziellen Befehl, der unter
Menü <Datei - Optionen - Erweitert - Bereich „Dokumentinhalt anzeigen“ - Schriftarten ersetzen… >
zu finden ist:
siehe auch MathType
siehe spezifische Layoutprogramme
siehe Indexing
Dort u.a. auch:
Die Word-Datei wird geschlossen und dann an die Dateinamenerweiterung .docx drangesetzt: .zip. Die Datei xyz.docx hieße dann xyz.docx.zip. Damit wird aus dem Word-Dokument ein ZIP-Archiv oder genauer: die Archiv-Eigenschaften des Word-Dokuments kommen zum Vorschein. Denn jedes Word-Dokument im Format .docx ist ein solches Archiv. Es ist aus vielen verschiedenen „Elementen“, also kleinen xml-Dateien aufgebaut. Und an die kommt man mit dem gerade beschriebenen Verfahren heran.
Im geöffneten ZIP-Archiv ist unter anderem der Unterordner „word“ zu sehen. Darin befinden sich die xml-Dateien „document.xml“ und „comments.xml“. Beide werden kopiert und an einer Stelle der Wahl auf der Festplatte abgelegt. Nun können sie mit einem ASCII-Editor (z. B. Wordpad oder Notepad) geöffnet und bearbeitet werden. Gesucht werden Textstrings, die mit „w:date“ anfangen. In diesen „Konstrukten“ sind die Datums- und Uhrzeitangaben enthalten. Dort können sie gelöscht oder verändert werden. Zum Schluss speichern und schließen. Danach werden die so veränderten xml-Dateien wieder in das ZIP-Archiv hineinkopiert und überschreiben dabei die ursprünglichen xml-Dateien. Und ganz zum Schluss wird die Endung .zip weggenommen und man hat wieder eine normale Word-Datei, in der nun aber alle Zeitangaben verändert sind oder ganz fehlen.
Der Vorteil des ZIP-Verfahrens besteht vor allem darin, dass sich die Kommentare und Textänderungen hinsichtlich des Zeitstempels unterschiedlich behandeln und Zeitangaben sogar komplett löschen lassen.
Bei neu erstellten Dateien scheint es ein Problem zu geben:
Einen einfachen Schalter zum Weglassen des Zeitstemples gibt es in Word leider nicht.
Im Prinzip gleiches Vorgehen wie bei Datumsangaben.
In der comments.xml könnten zusätzlich noch die Initialen verändert werden:
Anschließend werden die beiden Dateien wieder in das ZIP-Archiv kopiert und ersetzen hier die alten Versionen. Danach wird die Dateinamenerweiterung .zip weggenommen, und die Word-Datei liegt in veränderter Form vor.
Word 2011 kann Dokumentvorlagen nur dann richtig verarbeiten, wenn sie an einem Standardspeicherort liegen:
Da es auf dem Mac keinen „kleinen Finder“ entsprechend dem „kleinen Explorer“ unter Windows gibt, ist es nicht möglich, eine Dokuvorlage einfach im (innerhalb von Word) geöffneten Vorlagenfenster abzulegen. Vielmehr muss man dazu vom Finder aus den Befehl „Gehezu“ im Finder-Menü aufrufen, um zum Ordner „Library“ zu kommen. Da dies ein ausgeblendeter System-Ordner ist, muss vor der Auswahl des Befehls „Gehezu“ die Wahltaste gedrückt werden!
Damit sie zu sehen sind, müssen zwei Dinge stimmen:
Einige Unterschiede zur Windows-Version:
Absatzmarke als regularär Ausdruck: ^13
Dazu sind mehrere Schritte nötig.
Regulärer Ausdruck für Suchen-Ergänzen, also suche und ersetze durch „Suche-nach-Text“: ohne Platzhalter wird nach einem Textstring gesucht; der Suche-nach-Text wird durch ^& im Ersetzen-Feld gekennzeichnet; mit Platzhaltern geht es z.B. folgendermaßen:
Beim Suchen/Ersetzen von Fußnoten kann es passieren, dass die Fußnote „zerschossen“ wird: Möglicherweise ist das
Dieser Effekt trat in einem Dokument auf, in dem die Änderungen-verfolgen-Funktion eingeschaltet war. Wahrscheinlich war bei der Bearbeitung die Ansicht „Markup: alle“ gewählt gewesen, sodass am Bildschirm vor lauter Änderungsmarkierungen nicht mehr klar erkannt werden konnte, welche Änderung sinnvoll war, welche nicht. Zusätzlich war sehr wahrscheinlich beim Suchen/Ersetzen „Alles ersetzen“ gewählt worden, was verhinderte, dass der besondere Effekt an der Stelle gleich zu erkennen war. Korrigeren ließ sich der Fehler durch Rücknahme der Änderungen an der betreffenden Fußnote (im Dokumenttext und im Fußnotenbereich) und Eingabe der gewünschten Änderungen von Hand.
(WG 28.01.13 Antwort auf Frage in Word Tips Net):
„I have a document in which footnote references are in the wrong place relative to the period at the end of a sentence. I want to search for all instances where the footnote reference is before the period and move it to after the period. In some instances the period may be followed by a quote mark, in which case I would want the footnote reference after the quote mark.“
Anwort:
A multistep search/replace is needed. Let's do the case ((footnote sign)).„ first. The steps are:
All other cases, e.g., ((footnote sign))., are managed analogously.
Gruppen von Ausdrücken können nicht nur gebildet werden (durch Setzen von runden Klammern), sondern die so gebildeten Gruppen können im selben Suchenlauf eingesetzt werden.
So hat man bei SmartIndex-Registern z.B. das Problem zu bereinigen, dass zwei identische Seitenverweise hintereinander kommen (durch Komma getrennt). Diese Stelle werden gefunden mit dem Muster
([0-9][0-9][0-9]), \1
wobei dies das Muster für dreistellige Zahlen ist; entsprechend müsste bei zwei- und einstelligen Zahlen verfahren werden.
Erläuterung des Musters: durch das Setzen der runden Klammern wird das Muster [0-9][0-9][0-9] als zusammengehöriger Ausdruck gekennzeichnet; nach der gesuchten Zahl kommen ein Komma und ein Blank, danach wird der Ausdruck mit \1 wiederholt. Man könnte auch mit mehreren Ausdrücken arbeiten, dann kämen \2 usw. zum Einsatz.
Generelle Punkte:
In Word nennt sich die Funktion „Absatz anordnen“ oder auch „Anordnen Absatz“. Sie ist keine offizielle Funktion und taucht daher nicht unter „Alle Befehle“ im Menüband-Anpassungsfenster auf! Zu finden ist sie nur auf zwei Wegen:
Ohne zu wissen, dass der Befehl den Namen „Absatz anordnen“ bzw. „Anordnen Absatz“ hat, kommt man nicht an die Tastenkombination heran! Man würde nicht vermuten, dass sich hinter diesem Namen der erzwungene Blocksatz verbirgt.
Eine andere Möglichkeit, den erzwungenen Blocksatz in letzter Zeile herbeizuführen, besteht darin, am Ende der letzten Zeile die weiche Zeilenschaltung (<Umsch-CarriageReturn>) zu betätigen. Falls die neue Zeile den Umbruch stört: Absatzmarke (die am Ende des gesamten Absatzes) markieren und
Dazu sind zwei Tipps in Word-Tipsnet zu finden:
erster Tipp: stammt von https://wordribbon.tips.net/T013580_Replacing_without_Automatically_Finding.html:
Es bietet sich an, die Punkte 2 bis 4 in ein Makro zu packen. Allerdings geht das meiner Einschätzung nach nicht in VBA, sondern man muss ein separates Makroprogamm wie MacroExpress nehmen.
zweiter Tipp: stammt aus dem Find&Replace-Handbuch von A. Wyatt (Seite 12):
Da die einzelnen Schritte bereits per Tastenkombi ausgeführt werden und voneinander unabhängig sein müssen, kann ein Makro hier nicht zum Einsatz kommen.
Wurde eine Suche unterbrochen, kann sie auch ohne das erneute Aufrufen des Suchen-Ersetzen-Fensters fortgesetzt werden, und zwar mit folgenden Tastenkürzeln:
Geht nicht mehr wie in 2003 und älter durch Aufrufen des Sortierbefehls im Menüpunkt „Tabelle“, denn an sämtliche Tabellenbefehle kommt man vom normalen Text aus nicht mehr heran. Dafür steht der Befehl jetzt direkt für den Text zur Verfügung, und zwar auf dem Reiter „Start“, dort in der Gruppe der Absatzbefehle.
Aus meiner Sicht hat Word bei der Suche nach FV per Makro einen echten Bug. Beim Aufzeichnen der Suche nach FV wird nämlich - ohne dass man es merkt - eine FV-unabhängige Absatzformatierung, die die Rahmen betrifft, mit aufgezeichnet! Diese eine Zeile (oder bei Word 2007 auch mehrere Zeilen) muss aus dem VBA-Code entfernt (oder herauskommentiert) werden, dann funktioniert es … fast. Zusätzlich muss man bei Absatz-FV bedenken, dass die gesamte Absatzformatierung und damit auch die Info über die vergebene FV in der Absatzmarke steckt. Zumindest braucht das Makro die Absatzmarke als „Anker“. D.h., beim Suchen immer ^p für die Suche nach der Absatzmarke mit eingeben. Das Ersetzen der gefundenen FV durch eine andere darf außerdem nicht im Suchen/Ersetzen-Fenster passieren, sondern muss durch direktes Zuweisen erfolgen. Dieses Zuweisen wird im Makro mit aufgezeichnet. Darüber hinaus muss mit aufgezeichnet werden, dass der Cursor nach dem Finden der Absatzmarke um eine Einheit nach links in den zu formatierenden Absatz hinein versetzt wird!
Kollege M. Kanthak beschrieb den Fall, dass bei einem von einem Autor angelegten Dokument die Suche Text findet, der angeblich in der Kopfzeile der ersten Seite eines Abschnitts vorhanden ist, aber in der Seitenlayoutansicht nicht angezeigt wird.
Lösung: Der Text ist tatsächlich vorhanden, aber aufgrund der Wegnahme des Häkchens „erste Seite anders“ nicht zu sehen. Sobald das Häkchen gesetzt wird, kommt die Kopfzeile zum Vorschein.
Hintergrund:
Fazit:
Von jedem Zeichen lässt sich der Unicode ermitteln, indem man rechts neben das Zeichen klickt und dann Alt-c drückt. Erneutes Drücken von Alt-c führt wieder zur üblichen Darstellung des Zeichens. Folgerung: Kennt man den Unicode eines Zeichens, so kann man ihn einfach eintippen, dann Maus rechts daneben und Alt-c drücken! Will man den zugehörigen ANSI-Code ermitteln (falls er existiert): Unicode kopieren, dann Programm „Zeichentabelle“ öffnen und hier in das kleine Fenster „Unicode“ einfügen; anschließend wird das Zeichen oben in der Tabelle markiert und rechts unten wird der ANSI-Code angezeigt.
Wichtig zu wissen: Alt-c führt zur Anzeige des Hexadezimalcodes, nicht des Dezimalcodes.
Um nach Unicodezeichen suchen zu können, braucht man den Dezimalcode des Zeichens. Aus irgendeinem Grund wird in der Windows-Zeichentabelle, in der in Word integrierten Zeichentabelle (unter Einfügen - Symbol) und auch im Word-Dokument selbst (wenn man Alt-c hinter einem Buxhstaben drückt) nur der Hexadezimalcode angezeigt, nicht aber der Dezimalcode. D.h., man muss erst eine Umrechnung vornehmen, um nach Unicodezeichen suchen zu können!
Es gibt im Internet zahlreiche Umrechner von Hexadezimal- in Dezimalcode. Am besten schaut man die Codes jedoch in fertigen Tabellen nach. Eine gute Quelle ist http://www.alanwood.net.
Falls man doch mal selbst umrechnen möchte, ist zu beachten, dass folgende Ziffern in Unicode verwendet werden:
Unicode-Ziffer | Ziffernwert dezimal ausgedrückt |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
A | 10 |
B | 11 |
C | 12 |
D | 13 |
E | 14 |
F | 15 |
Die dezimalen Ziffernwerte sind mit dem Stellenwert des Unicodes zu multiplizieren, wenn man in Dezimalcode umrechnen möchte. Die ersten 6 Stellenwerte sind:
5 | 4 | 3 | 2 | 1 | 0 |
165 | 164 | 163 | 162 | 161 | 160 |
Beim Umrechnen wird der jeweilige Ziffernwert mit dem Stellenwert multipliziert, anschließend wird summiert.
Beispiele:
Hexadzimalcode | Umrechnung | Dezimalcode | Zeichen |
---|---|---|---|
00A0 | 0 · 160 + 10 · 161 + 0 · 162 + 0 · 163 = 0 + 160 + 0 + 0 | 160 | NO-BREAK SPACE |
00E4 | 4 · 160 + 14 · 161 + 0 · 162 + 0 · 163 = 4 + 224 + 0 + 0 | 228 | ä |
00F6 | 6 · 160 + 15 · 161 + 0 · 162 + 0 · 163 = 6 + 240 + 0 + 0 | 246 | ö |
00FC | 12 · 160 + 15 · 161 + 0 · 162 + 0 · 163 = 12 + 240 + 0 + 0 | 252 | ü |
2248 | 8 · 160 + 4 · 161 + 2 · 162 + 2 · 163 = 8 + 64 + 512 + 8192 | 8776 | ≈ |
Beispiele für weitere Zeichen:
Character | Name | Decimal | Hex |
---|---|---|---|
SPACE | 32 | 0020 | |
NO-BREAK SPACE | 160 | 00A0 | |
EN QUAD | 8192 | 2000 | |
EM QUAD | 8193 | 2001 | |
EN SPACE | 8194 | 2002 | |
EM SPACE | 8195 | 2003 | |
THREE-PER-EM SPACE | 8196 | 2004 | |
FOUR-PER-EM SPACE | 8197 | 2005 | |
SIX-PER-EM SPACE | 8198 | 2006 | |
FIGURE SPACE | 8199 | 2007 | |
PUNCTUATION SPACE | 8200 | 2008 | |
THIN SPACE | 8201 | 2009 | |
HAIR SPACE | 8202 | 200A | |
ZERO WIDTH SPACE | 8203 | 200B | |
ZERO WIDTH NON-JOINER | 8204 | 200C | |
ZERO WIDTH JOINER | 8205 | 200D | |
| LEFT-TO-RIGHT MARK | 8206 | 200E |
| RIGHT-TO-LEFT MARK | 8207 | 200F |
‐ | HYPHEN | 8208 | 2010 |
‐ | NON-BREAKING HYPHEN | 8209 | 2011 |
‒ | FIGURE DASH | 8210 | 2012 |
– | EN DASH (present in WGL4, ANSI and MacRoman) | 8211 | 2013 |
— | EM DASH (present in WGL4, ANSI and MacRoman) | 8212 | 2014 |
― | HORIZONTAL BAR (present in WGL4) | 8213 | 2015 |
WGL4: Windows Glyph List 4 (von Microsoft)
Um nun nach einem Unicodezeichen zu suchen, muss im Suchen-Fenster zunächst ^u und dann der Dezimalcode eingeben werden. Also z. B.
^u8194 für die Suche nach dem en space und
^u8201 für die Suche nach dem thin space
Ein gefundenes Unicodezeichen lässt sich wie üblich durch ein Nicht-Unicodezeichen ersetzen: einfach das Nicht-Unicodezeichen in das Ersetzen-Fenster eingeben und „Ersetzen“ wählen.
Wie aber geht das Ersetzen eines beliebigen Zeichens durch ein Unicodezeichen?
Das Problem: Im Ersetzen-Fenster lässt sich weder Dezimal- noch Hexadezimalcode eingeben.
Es bleibt nur die Zwischenablage. Das bedeutet: Das Unicodezeichen muss kopiert und in das Ersetzen-Fenster eingefügt werden. Um ein Unicodezeichen kopieren zu können, muss es entweder bereits irgendwo im Text vorkommen und man muss diese Stelle finden oder man ruft die Windows-Zeichentabelle auf, gibt im „Unicode-Kästchen“ den Hexadezimalcode (nicht den Dezimalcode) des Zeichens ein und wird sofort innerhalb der Zeichentabelle zum Zeichen geführt. Nun einfach die Buttons „Auswählen“ und „Kopieren“ drücken. Damit befindet sich das Zeichen in der Zwischenablage und kann im Ersetzen-Fenster in Word eingefügt werden.
Solche Zeichen (wohl meist irgendwelche Unicode-Zeichen) können „zugänglich“ gemacht werden, indem die Datei zunächst als RTF-Datei abgespeichert und anschließend wieder geöffnet wird. Dabei werden anscheinend alle nicht dem ANSI-Code entsprechenden Zeichen durch Zeichen aus diesem Code ersetzt und können dann auch gesucht und ersetzt werden.
Wenn in einem Dokument Aufzählungen oder Nummerierungen manuell (also über die entsprechenden Schaltflächen) vergeben wurden, sind alle so formatierten Absätze mit der Formatvorlage „Listenabsatz“ belegt, falls das Ausgangsformat „Standard“ war. War das Ausgangsformat ein anderes (etwa „fliess“), so liegt nach dem manuellen Zuweisen einer Aufzählung oder Nummerierung zwar ein Listenabsatz dahinter, aber im Formatvorlagen-Aufgabenbereich oder im Formatinspektor wird die Listeneigenschaft nicht angezeigt, sondern man sieht nur den Namen der verwendeten Formatvorlage (also in diesem Fall „fliess“); die Listeneigeneschaft wird dem Absatzformat lediglich „übergestülpt“. Das gilt nicht nur einfache Listen, sondern auch für mehrstufig gegliederte.
In allen Fällen ist es nicht möglich, gezielt nach den Listen zu suchen, um sie beispielsweise durch ein anderes Fromat zu ersetzen. Auch „alle Instanzen markieren“ funktioniert nicht oder nur „halb“, da die Funktion z. B. nicht zwischen Aufzählungen und Nummerierungen unterscheidet.
In einem Dokument mit zahlreichen Listen, die umformatiert werden sollen, ist es dann natürlich sehr mühsam, jeden Listenpunkt einzeln anfahren zu müssen.
Die einzige mögliche Lösung, die mir einfällt, besteht darin, das Dokument in RTF umzuwandeln, dann die RTF-Datei als Nur-Text-Datei zu öffnen und innerhalb der Datei nach Nummerierungen zu suchen. Hat man eine solche Stelle gefunden, schreibt man am besten einen kurzen Dummy-Text (etwa „xyz“) an den Anfang des Absatzes mit dem Ziel, nach diesem eindeutigen Dummy-Text nach der anschließenden Zurückumwandlung in das normale docx-Format suchen zu können.
Eine Nummerierung in RTF ist gekennzeichnet durch die Nummer, gefolgt vom Tag \tab. Man kann also per Mustersuche nach
[0-9].\\tab
suchen (falls nach der Nummer ein Punkt kommt) oder nach
[0-9]\\tab
(falls nach der Nummer kein Punkt kommt). Bei der Fundstelle muss man anhalten und den Text (z.B. „xyz“) eingeben. Dann geht die Suche weiter.
Insbesondere bei gegliederten Listen kann das von großem Vorteil ein, weil man jede Ebene mit einem anderen Dummy-Text versehen kann.
Zu beachten: Der Dummytext sollte vor dem ersten Wort des Absatzes eingegeben werden. Im RTF ist allerdings der eigentliche Text nicht unbedingt gleich hinter dem \tab-Tag zu sehen. Um nicht mühselig mit den Augen nach dem Textanfang zu suchen, kann der Dummy-Text auch nach der schließenden geschweiften Klammer (die üblicherweise auf den \tab-Tag folgt) eingegeben werden, also etwa so:
1.2.\tab} xyz
ANSI-173 und Symbol-Zeichensatz (strg-shift b)
Die Quellendaten (Source.xml) werden von Word unter C:\Users\<benutzername>\AppData\Roaming\Microsoft\Bibliography\Sources.xml abgelegt.
Könnte man eine eigene quell.xml erzeugen, so könnte diese in Word importiert werden und es entfiele das mühselige Eingeben der einzelnen Daten in der Quellenverwaltung von Word. Eine Möglichkeit besteht darin, die Daten in einer Excel-Tabelle zu erfassen und dann von dort als xml zu exportieren. Worauf beim Export von Excel-Daten alös XML-Daten zu achten ist, kann z.B. im folgenden Youtube-Video angeschgaut werden:
https://www.youtube.com/watch?v=9bat12gH3Qs
Die Erfassungsarbeit in Excel kann man sich sogar noch ersparen, wenn mit das Literaturverzeichnis am Ende eines von einem Autor abgelieferten Dokuments in eine Excel-Tabelle umwandelt.
Der Weg wäre also:
Literaturverzeichnis in Word-Dokument -> Excel -> xml -> Quellenverwaltung in Word
Es kann zu der Situation kommen, dass Word beim Beenden die Meldung bringt, es habe Änderungen an der Normal.dot(m) gegeben, obwohl keine Änderungen vorgenommen wurden.
Damit die Meldung überhaupt erscheinen kann, muss in den Word-Optionen (Gruppe „Erweitert“) das Häkchen im Kästchen „Bestätigung vor dem Speichern von Normaldot“ gewählt sein, was standardmäßig der Fall ist. Die Checkmarke sollte keinesfalls weggenommen werden, denn dann hätte man keine Kontrolle mehr über die bewusst oder versehentlich vorgenommenen Änderungen an der Normal.dot(m). Wäre die Checkmarke nicht gesetzt, würde man das oben beschriebene Problem nicht mehr sehen, der eigentliche Grund für das Auftreten der Meldung wäre aber trotzdem noch vorhanden.
Was könnte der Grund für die Meldung sein?
Der Microsoft-Support (Microsoft-Support-Meldung zur Normal.dot(m)) führt folgende Möglichkeiten an:
Falls ein Add-in, ein Com-Add-In oder ein Automakro schon längere Zeit verwendet wurde, ohne dass es Probleme gab, kann eine zwischenzeitliche Aktualisierung von Windows oder Office der Grund sein, dass plötzlich eine Fehlfunktion auftritt. Dann könnte eine ebenfalls aktualisierte Version des Add-ins, Com-Add-Ins oder Automakros bewirken, das die Meldung beim nächsten Word-Start nicht mehr erscheint.
Erstaunlicherweise können nichtkompatible Add-Ins oder Com-Add-Ins nicht nur zu der falschen Meldung bzgl. der Normal.dot(m) führen, sondern noch Fehler ganz anderer Art verursachen.
So kam es z.B. beim Übertrag von Daten aus einer Excel-Datei in Word (eingefügt als Nur-Text) zur Erzeugung nicht sichtbarer Unicode-Zeichen, und zwar wurden einige CR-Zeichen (also Absatzmarken) nicht als übliche Absatzmarkenzeichen sondern als undefinierbare Unicode-Zeichen eingebaut; deren Unicode konnte nicht sichtbar gemacht werden (per Alt-c) und nach ihnen konnte nicht gesucht werden (auch nicht per Copy im Text und Paste im Suchen-Fenster). Was die Verteilung dieser Stellen im Dokument angeht, war kein System zu erkennen. Der Fehler trat zutage, als manchen Absätzen eine FV zugewiesen werden sollte. Der Effekt war, dass auch der Absatz darüber das neue Format erhielt. Der Verdacht lage nahe, das mit dem Zeichen für die Absatzmarke etwas nicht stimmte.
Die Lösung bestand darin, die Datei im RTF-Format zu speichern, dann zu öffnen und gleich wieder im docx-Format zu speichern. Bekanntermaßen werden Unicode-Zeichen beim Speichern als RTF in ASCII/ANSI-Zeichen umgewandelt (vgl. oben) oder ganz aus dem Dokument entfernt. Beim betrachteten Dokument waren an den betroffenen Stellen keine CR-Zeichen mehr vorhanden. Nur per Dokument-Vergleich konnten die Stellen ausfindig gemacht werden und so die richtigen Absatzmarken eingebaut werden.
Wenn Word gar nicht hochfährt, kann das Programm ohne Add-Ins gestartet werden:
<Win + R> drücken, dadurch geht das Fenster „Ausführen“ auf. Hier den Programmaufruf für Word, gefolgt vom Parameter /a, eingeben, also
Dazu wird beim Starten anstelle von /a der Parameter /safe benötigt.
Danach können z. B. COM-AddIns entfernt werden.