Makros für Unicode in Word
Transcription
Makros für Unicode in Word
Hanna-Chris Gast Word-Makros fürUnicode, Analyse von Schrift- und Sonderzeichen, Ersatz von Symbol- und Wingdingszeichen durch Unicode sowie ein verbessertes Inhalt-Einfügen Inhalt Seite Vorwort................................................................................................................................. 4 1 Die Dokumentvorlage mit Makros................................................................................ 6 1.1 Die Titelseite der Dokumentvorlage für die Makros ...........................................................6 Bild 1.1: Screenshot der Dokumentvorlage mit dem Analysemakro ........................................6 1.2 Die Symbolleiste mit den Icons für die Makros ..................................................................7 Bild 1.2: Symbolleiste mit Icons für die Makros der Dokumentvorlage "UnicodeMakros-kompakt.dot" .....................................................................................................7 1.3 Infotext in der Zip-Datei (Erklaerung_und_Installation.txt) ...............................................7 2 Grundlagen der Codierung von Schriftzeichen im Computer.................................. 10 2.1 Ältere Zeichencodierungen ................................................................................................ 10 2.2 Das Unicode-System .......................................................................................................... 10 Tabelle 2.1: Übersicht der Unicode-Ebenen 0 und 1 mit einer Auswahl an Blöcken ............ 12 2.3 Zum Prinzip der Surrogate ................................................................................................. 13 Tabelle 2.2: Die Unicode-Blöcke der Surrogate .................................................................... 13 2.4 Probleme bei Word 2000 mit Zeichen höherer Unicode-Ebenen ................................... 14 2.5 UTF-Codierung .................................................................................................................... 14 2.6 Abkürzungen (UCS und UTF) ............................................................................................ 14 3 UTF8 im Internet .......................................................................................................... 15 3.1 3.2 3.3 3.4 Codierung UTF-8 ................................................................................................................. 15 Häufigkeit der verschiedenen Codierungen bei Griechischen Seiten .......................... 15 Codierung von Nicht-ASCII-Zeichen in Domain-Namen mittels Punycode .................. 16 Codierung von griechischen Buchstaben usw. in Unterseiten einer Domain mittels UTF-8 ....................................................................................................................... 17 Bild 3.1: Screenshot einer Adresszeile (Browser = Firefox) .................................................. 17 3.5 Probleme durch die Einführung von IDN-Domains ......................................................... 18 Bild 3.2: Screenshot der Analyse der Epsilons mit dem Analysemakro ............................... 19 3.6 Einige UTF-8-Codes und deren Berechnung ................................................................... 19 Tabelle 3.1: Konvertierung von Unicode (UCS-4) in UTF-8 .................................................. 19 Tabelle 3.2: Deutsche und französische "Sonderzeichen" ................................................... 20 4 5 Schriftarten (Fonts) für Unicode-Zeichen .................................................................. 21 Makro zum Erzeugen von Schriftzeichen aus dem hexadezimalen Unicode, auch für höhere Unicode-Ebenen (UCS > FFFFhex) ................................................... 23 5.1 Aufgabenstellung ................................................................................................................ 23 Tabelle 5.1: Codierung nach ISO/IEC 10646:2003, Anhang C ............................................ 23 Tabelle 5.2: Für das Makro wichtige Unicode-Werte, umgerechnet in Dezimalwerte .......... 23 5.2 Makro zur Erzeugung eines Schriftzeichens aus dem hexadezimalen Code (nur für Word 2000 nötig) ................................................................................................... 24 Sub Hexcode_in_Schriftzeichen_umwandeln() .................................................................... 24 5.3 Makro zur Erzeugung eines Zeichens aus dem dezimalen Code .................................. 27 Sub Dezimalcode_in_Schriftzeichen_umwandeln() .............................................................. 27 6 Makro zur Analyse von Schriftzeichen, auch von Zeichen höherer UnicodeEbenen und Sonderzeichen ....................................................................................... 30 6.1 Die einzelnen Probleme und Lösungen ............................................................................ 30 6.1.1 Unicode-Zeichen höherer Ebenen .............................................................................. 30 6.1.2 Probleme mit hohen Zahlen beim VBA-Datentyp "Integer" ........................................ 31 6.1.3 Erkennen von kombinierenden diakritischen Zeichen ................................................ 31 6.1.4 Sonderzeichen in der Messagebox ............................................................................. 32 Seite Bild 6.1: Screenshot des Ergebnisses des Analyse-Makros in einer erweiterten Messagebox und in einer "separate Datei" ................................................................. 32 6.1.5 Probleme mit den Windows-Sonderschriftarten .......................................................... 33 6.1.6 Probleme mit Steuerzeichen für Feldfunktionen und für Tabellen .............................. 33 Tabelle 6.1: Beispiele für Feldfunktionen .............................................................................. 34 6.1.7 Ermittlung der (englischen) Namen der Unicode-Schriftzeichen ................................ 35 6.1.8 Weitere Steuerzeichen von Word ............................................................................... 36 6.1.9 Grafiken, Textfelder, Zeichnungen und ähnliches im Tex .......................................... 36 6.1.10 Problem des Öffnens einer Datei mit Makros per Makro (letzte Änderung des Makros im Mai 2015) ................................................................................................... 37 6.2 Funktionsablauf des Analyse-Makro ................................................................................ 38 6.3 Das fertige Makro zur Analyse von Schrift- und Sonderzeichen, auch von Windows-Sonderzeichen, von höheren Unicode-Ebenen und von Schriftzeichen mit kombinierenden diakritischen Zeichen ............................................ 39 Sub Hexcode_und_Name_ermitteln() ................................................................................... 39 Private Sub Ueberschriften_fett() .......................................................................................... 58 Private Function EnglischName(Z1 As String) As String ...................................................... 58 Private Function Symbolname(Z1 As String) As String ........................................................ 60 Private Function Wingdingsname(Z1 As String) As String.................................................... 66 Private Function Fkt_OMML_zählen() As Integer ................................................................. 74 Private Function Fkt_Kompatibitaet() .................................................................................... 74 Private Sub SpeichernX(xxx As String, i As Integer) ............................................................ 74 6.4 Zusatzfunktion: Ausgabe der Zeichenformatierung bei Einzelzeichen ........................ 75 Private Function Fkt_Schriftattribute_ausgeben() As String ................................................. 76 Private Function Fkt_FarbIndex_Farbe() .............................................................................. 77 7 Ersatz der Schriftarten Symbol und Wingdings durch Cambria.............................. 79 7.1 Problemstellung und Kurzbeschreibung .......................................................................... 79 7.2 Ersatz ("Mapping") von Symbol-Zeichen durch Unicode-Zeichen ................................ 79 Tabelle 7.1: Alle Zeichen der Schriftart Symbol mit Unicode-Entsprechungen .................... 80 7.2.1 Auswertung der geeigneten Ersatz-Schriftarten für "Symbol" .................................... 89 7.2.2 Unicode-Ersatzschriftarten ohne Cambria (Stand 2011) ............................................ 89 7.3 Ersatz ("Mapping") für die Wingdings-Zeichen durch Cambria ..................................... 90 Tabelle 7.2: Alle Zeichen der Schriftart Wingdings mit Unicode-Entsprechungen ............... 90 7.3.1 Auswertung der geeigneten Ersatz-Schriftarten für "Wingdings" ............................... 99 7.4 Einige gelöste Probleme .................................................................................................. 100 7.4.1 Erzeugung von Zeichen einer höherer Unicode-Ebene ............................................ 100 Tabelle 7.3: Einige Unicode-Bereiche ................................................................................. 100 7.4.2 Fehlende Freiheit zur Wahl der Schriftart bei einigen Zeichen seit der Installation des Kompatibilitäts-Pack......................................................................... 100 Bild 7.1: Auszug aus Tabellen 7.2: "NEGATIVE CIRCLED DIGIT ZERO" ......................... 101 Bild 7.2: Screenshot von Buchstaben, die mit Feldfunktion geschützt sind ........................ 101 7.4.3 Dokumentvorlage mit fertigen Makros und Buttons .................................................. 102 Bild 7.3: Screenshot der Dokumentvorlage "Unicode-Makros-kompakt.dot" ...................... 102 7.5 Problem bei fehlender Schriftart "Symbola" .................................................................. 102 7.6 Das fertige Makro zum Ersatz der Windows-Sonderschriftarten "Symbol" und "Wingdings" durch Unicode-Zeichen ............................................................................. 103 Sub Symbol_Wingdings_in_Unicode_im_gesamten_Dokument() ..................................... 103 Sub Symbol_Wingdings_in_Unicode_nur_Markierten_Text() ............................................ 105 Private Sub Symbol_Wingdings_in_Cambria(Rng1) .......................................................... 105 Private Sub Symbol_U(ys) .................................................................................................. 107 Private Sub Wingdings_U(ys) ............................................................................................. 124 Private Sub Wingdings_Segoe(ys) ...................................................................................... 134 Private Sub Wingdings_Symbola(ys) .................................................................................. 137 Private Function ChrXXL(Code2) As String ........................................................................ 144 Private Sub Markiertes_mit_Feldfunktion_schuetzen() ....................................................... 144 Private Function Fkt_FontIsInstalled(FontName As String) As Boolean ............................ 144 8 Makro zum verbesserten Einfügen von "Nur Text" ................................................ 146 8.1 Kurzbeschreibung für den Anwender von "Inhalt_einfügen" ...................................... 146 8.2 Makros "Inhalt_einfügen_korrigiert" mit Tastenkürzel Strg + i .............................. 147 Sub Inhalt_einfügen_korrigiert() .......................................................................................... 147 2 Seite 8.3 Makro "Inhalt_einfügen_erweitert" mit Strg + Shift + i ...................................... 153 Sub Inhalt_einfügen_erweitert() .......................................................................................... 153 Private Sub c0_hoeher_tiefer_3_Punkt_ersetzen() ............................................................ 164 Private Sub c1_hoeher_tiefer_in_hochtief_Animation() ...................................................... 165 Private Function Fkt_UTF8_decodieren() As String ........................................................... 168 Private Function Fkt_zweiByte_Sequenz(strCode As String) As Integer ........................... 170 Private Function Fkt_dreiByte_Sequenz(strCode As String) As Integer ............................. 170 Private Function Fkt_vierByte_Sequenz(strCode As String) As Long ................................ 171 Private Function ChrXXL(Code2) As String ........................................................................ 171 Private Sub Shapes_beseitigen() ........................................................................................ 172 8.4 Makro "Bereinigt_Einfügen" mit AltGr + j ................................................................... 173 Sub Bereinigt_einfügen() ..................................................................................................... 173 Private Sub c25_höher_tiefer_Animation_für_Word_2000() .............................................. 181 Private Sub Shapes_beseitigen() ........................................................................................ 185 Anhang A Weitere Verbesserungen für Word 2000 ...................................................... 186 A.1 Beseitigen der bei Word 2000 lästigen Symbol-Leiste "Web" ..................................... 186 A.2 Tastenkürzel anpassen in Word 2000 ............................................................................. 186 A.3 Tabellen auch in Word 2000 in "Raster 5" formatieren ................................................. 187 Sub Tabelle_formatieren_wie_Raster_5()........................................................................... 187 A.4 Befehl "Edit Field" auch für Word 2000 .......................................................................... 188 Sub Feld_Dialog_halbgefüllt_öffnen_Word_2000() ............................................................ 188 A.5 Lösung zu dem Problem mit "Gehe zu Seite" in Word 2000 ....................................... 190 Sub GoTo_Eingabefeld() ..................................................................................................... 190 A.6 Suche nach Text mit Farbschattierung in Word 2000 ................................................... 191 Sub Farbe_in_Text_suchen() .............................................................................................. 191 Sub hellrosa_Schattierung_suchen() .................................................................................. 191 A.7 Alle Bilder eines Ordners gleichzeitig in eine Datei einfügen ...................................... 192 Sub a1_alle_Bilder_eines_Dateityps_einfügen_aus_wählbarem_Verzeichnis() ................ 192 Anhang B Die Rechenformel zum Umrechnen von UTF8-Code in normale Zeichen.. 194 B.1 Auszug aus: ISO/IEC 10646:2003, D.5 " Mapping from UTF-8 form to UCS-4 form" ................................................................................................................................... 194 B.2 Zwei fertige Makros für die Umwandlung von Internet-Adressen mit UTF8 in normalen Text .................................................................................................................... 195 Sub UTF8_im_Text_decodieren() ....................................................................................... 195 Sub UTF8_Decodierung_nur_als_MsgBox_ausgeben() .................................................... 197 Private Function Fkt_zweiByte_Sequenz(strCode As String) As Integer ........................... 200 Private Function Fkt_dreiByte_Sequenz(strCode As String) As Integer ............................. 200 Private Function Fkt_vierByte_Sequenz(strCode As String) As Long ................................ 200 Private Function ChrXXL(Code2) As String ........................................................................ 201 Anhang C Abstract in English ........................................................................................ 202 Fig. C.1 Screenshot of the analysis ..................................................................................... 202 Fig. C.2: Screenshots for the analysis of unknown characters ........................................... 203 Fig. C.3: Screenshot of the analysis of a small letter Alpha with acute .............................. 203 Fig. C.4: Two Hieroglyphs as a sample for a higher Unicode plane ................................... 204 Fig. C.5: A Hebrew letter with Latin letters in the same line................................................ 204 Fig. C.6: Special marks ....................................................................................................... 205 Literaturhinweise............................................................................................................. 206 Impressum ....................................................................................................................... 208 3 Vorwort Dieser Aufsatz ist eine Zusammenfassung der Aufsätze: "Erweiterung von Word 2000 zur Erzeugung von Schriftzeichen höherer Unicode-Ebenen sowie Erstellung eines Makros für Word 2000 bis Word 2010 zur Analyse von Schrift- und Sonderzeichen mit Ausgabe des Schriftzeichen-Namens nach ISO/IEC 10646", siehe [26]. sowie: "Word-Makro zur Umcodierung von Symbol- und Wingdingszeichen in Unicode Zeichen", siehe [27]. Neu gegenüber den beiden ursprünglichen Aufsätzen sind die Makros in Abschnitt 8. In den beiden Makros "Inhalt_einfügen_erweitert" und "Bereinigt_einfügen" bleiben Exponenten und Indizes als solche erhalten. Dieses Dokument enthält auch alles über UTF8 aus dem Aufsatz über Griechische Schrift, siehe [4], mit einem neu-ergänzten Makro zur Decodierung von UTF8, siehe 8.3. Die Makros aus diesem Aufsatz biete ich in einer fertigen (verzippten) Dokumentvorlage an, in der die Makros der Abschnitte 5, 6, 7 und 8 mit Tastenkürzeln bereits fertig installiert sind, sowie die Liste der Namen sämtlicher Unicode-Zeichen (Stand 2015). Download siehe [2] und Impressum. Vorwort zur Synthese und Analyse von Unicode-Zeichen Ursprünglich sollte diese Arbeit nur ein Kapitel für mein Buch über die Griechische Schrift [4] werden, weil ich dazu per Makros mein Word 2000 für Unicode tauglich machen musste. Da diese Arbeit aber zu umfangreich geworden ist und die Makros außerdem auch für andere Schriften wie kyrillische, hebräische, arabische bis hin zu chinesischen Schriftzeichen anwendbar sind, veröffentlichte ich sie im Sommer 2010 als separaten Aufsatz. Die beiden hier beschriebenen Word-Makros für die Synthese von Schriftzeichen aus einem eingegebenen Code (siehe Abschnitte 5.2 und 5.3) können sämtliche zulässigen Schrift- und Sonderzeichen erzeugen, aber auch Steuerzeichen. Die beiden Synthese-Makros erweitern die Funktionen von Word 2000, entsprechen ansonsten der Funktion in Word 2003 bis Word 2010. Seit der Einführung von Cambria und Cambria Math ist die Suche nach einer geeigneten Schriftart (Font) nicht mehr so schwierig wie früher. Einige Fonts liste ich in Abschnitt 4 auf. Bei der Analyse von vorhandenen Schriftzeichen in einem Word-Text kann das in dieser Arbeit entwickelte Analyse-Makro (siehe Abschnitt 6.3) sämtliche normgerechten Schriftzeichen (Unicode) analysieren und (außer bei chinesischen, japanischen und koreanischen Silbenzeichen) deren englischen Namen nach ISO/IEC 10646 ausgeben, einschließlich von Schriftzeichen höherer UnicodeEbenen. Daneben kann das Analyse-Makro aber auch die Codes von nicht-normgerechten Sonderschriftarten ermitteln sowie bei den Schriftarten "Symbol" und "Wingdings" die Bedeutungen und, soweit vorhanden, die entsprechenden Unicode-Schriftzeichen angeben. Das Analyse-Makro bietet die Möglichkeit, über 100 Zeichen einer Zeichenkette gleichzeitig zu analysieren. Damit können auch Schriftzeichen mit mehreren diakritischen Zeichen gut analysiert werden, die sonst nur umständlich zu analysieren sind, oder etwa eine Kombination von Schriftzeichen aus Schriftsystemen, die von rechts nach links geschrieben werden, mit Schriftzeichen, die von links nach rechts geschrieben werden. Dies würde sich mit dem Befehl "Alt + C" in Word (ab Word 2003) nicht analysieren lassen. Das Analyse-Makro funktioniert auch dann, wenn im Text mangels Fonts nur Platzhalter ("leere Kästchen") zu sehen sind. Das Analyse-Makro erweitert nicht nur die vorhandenen Funktionen von Word 2000, sondern bietet auch Vorteile für Word 2003 bis Word 2010! Inzwischen funktioniert das Analysemakro auch bei komplizierteren Feldfunktionen, Tabellenfeldern, Shapes und OMML-Formeln. Es werden die vorhandenen Textmarken aufgelistet (seit 2012). 4 In Anhang A ergänzte ich weitere für Word 2000 nützliche Makros. Vorwort zum Ersatz von Symbol- und Wingdingszeichen Im Zeitalter von Unicode sind Sonderschriftarten wie "Symbol" und "Wingdings" veraltet. Zwar ist "Symbol" in jedem Postscriptdrucker als eine der Adobeschriften enthalten und wird fehlerfrei gedruckt, aber im Internet besteht die Gefahr, dass der Leser/Internetnutzer statt eines griechischen Alpha ein lateinisches "a", statt Beta ein "b" usw. zu sehen bekommt, da die Sonderschriftarten nicht nach den für das Internet üblichen Normen codiert sind (für Unicode siehe die Internationale Norm ISO/IEC 10646 oder unter [1]). Mit dem hier entwickelten Makro werden die Zeichen dieser beiden Sonderschriftarten weitgehend durch Unicode-Zeichen ersetzt. Das fertige Makro funktioniert von Word 2000 bis Word 2010. Es gibt in Abschnitt 7.6 zwei Rahmenmakros, eines für den Ersatz der Symbol- und Wingdingszeichen im gesamten Dokument, und eines für den Ersatz nur an der markierten Stelle. Zur Installation von Makros in der Normal.dot bzw. in der Normal.dotm siehe [6]. Wird einem Zeichen die Schriftart "Symbol" zugeordnet, werden nur die letzten zwei Hexzeichen des Codes berücksichtig. Aus dem Ohmzeichen "Ω" (Unicode hex.2126) wird dann fälschlich "&". Ob der hexadezimale Code nun "0026", "26", "1026", "1226," "EE26" oder (richtig) "F026" lautet, das Zeichen wird bei Schriftart "Symbol" optisch immer zum "Ampersand"! Das Symbol-Zeichen, das korrekt über Einfügen → Symbole → Schriftart 'Symbol' erzeugt wird, hat den Hexcode "F026." Das Makro in diesem Aufsatz berücksichtigt nur die richtigen Codes. Vielleicht sollte hier noch eine Fehlermeldung eingebaut werden. Mit den neuen Fonts "Cambria" und "Cambria Math" entfällt weitgehend die Suche nach passenden Fonts. Aufgrund der Erweiterung von Unicode ("Unicode 7") im Frühjahr 2014 [1] und der ent-sprechenden Erweiterung der Schriftart "Symbola" [10] lassen sich jetzt alle oder zumindest fast alle Wingdingszeichen durch Unicode-Zeichen ersetzen. Über passende Ergänzungs-Hinweise für die noch fehlenden 22 Wingdingszeichen wäre ich sehr dankbar. Die Schriftart "Cambria" war mir zu Beginn noch unbekannt bzw. existierte noch nicht, als ich 2009 das Makro zuerst entwickelte. Ich ordnete jetzt soweit möglich den Unicode-Zeichen die Schriftart Cambria bzw. Cambria Math zu. Ich habe in Tabelle 3.2 alle Zeichen in roter Farbe dargestellt, für die eine zusätzliche Schriftart (Font) aus dem Internet downgeloaded werden muss (ich empfehle "Symbola"). Da seit Installation des Kompatibilitäts-Packs für einige Zeichen die Schriftart nicht mehr frei wählbar ist, musste ich sie durch Feldfunktion schützen, siehe Abschnitt 7.4.2. Hanna-Chris Gast, Oktober 2015 5 1 Die Dokumentvorlage mit Makros Bezugsquelle und Download-Adresse siehe Impressum. 1.1 Die Titelseite der Dokumentvorlage für die Makros Bild 1.1: Screenshot der Dokumentvorlage mit dem Analysemakro 6 1.2 Die Symbolleiste mit den Icons für die Makros Die Icons der Symbolleisten für Word bis Word 2003 sind auch in Word 2010 benutzbar, und zwar im Menüband (Ribbon) unter "Add-Ins", siehe folgenden Screenshot. Bild 1.2: Symbolleiste mit Icons für die Makros der Dokumentvorlage "Unicode-Makros-kompakt.dot" 1.3 Infotext in der Zip-Datei (Erklaerung_und_Installation.txt) Dipl.-Ing. Hanna-Chris Gast; Berlin, Stand 9. November 2016 -----------------------------* Erklärung und Installation * -----------------------------Diese Dokumentvorlage mit den Makros ist am besten im "Word\STARTUP-Order" für Word unterzubringen, damit die darin enthaltenen Makros automatisch genutzt werden können (dabei Dateiname nicht ändern!). Pfad zum StartUp-Order unter Windows XP: C:\Dokumente und Einstellungen\...\Anwendungsdaten\Microsoft\Word\StartUp Pfad zum StartUp-Order unter Windows 7: C:\users\...\appdata\roaming\microsoft\word\STARTUP *** Den wichtigsten Makros sind bereits Tastenkürzel zugeordnet: Sub Hexcode_und_Name_ermitteln() AltGr + C Sub Inhalt_einfügen_korrigiert() Sub Inhalt_einfügen_verbessert() Sub Bereinigt_einfügen() Strg + i Strg + Shift + i AltGr + j Sub Dezimalcode_in_Schriftzeichen_umwandeln() Alt + K Sub Hexcode_in_Schriftzeichen_umwandeln() ' <!nur für das alte Word 2000 nötig> Sub Symbol_Wingdings_in_Unicode_im_gesamten_Dokument() Sub Symbol_Wingdings_in_Unicode_nur_Markierten_Text() Das Makro "Sub Hexcode_in_Schriftzeichen_umwandeln()" ist nur für Word 2000 nötig und entspricht dem Befehl "Alt + C" ab Word 2003. *** Die Makros für die Umwandlung von Symbol- und Wingdingszeichen in Unicodekompatible Zeichen wandelt alle Zeichen 7 um, soweit sie mit Cambria darstellbar sind, und weitere Zeichen nur, wenn die Schriftart "Symbola" vorhanden ist. Nicht umwandelbare Zeichen werden rosa markiert. *** Die Makros für "Inhalt_einfügen" korrigieren den Fehler in Word, dass Feste Leerzeichen beim "Einfügen-nur Text" verschwinden und dass in Word 2010 Bedingte Trennstriche teilweise in Sonderzeichen "¬" umgewandelt werden. Es werden von den beiden Makros für "Inhalt_einfügen" die Festen Bindestriche in normale Bindestriche umgewandelt und Bedingte Trennstriche ersatzlos gelöscht. Das Makro "Sub Inhalt_einfügen_erweitert()" ruft zusätzlich das Makro zur Umwandlung von Symbol- und Wingdingszeichen in Unicode-Zeichen auf. Symbol- und Wingdings-Zeichen werden weitgehend in Unicodezeichen umgewandelt (der Rest wird rosa markiert). Ferner bleiben hier Exponenten und Indizes erhalten, damit aus "10 hoch 3" nicht "103" wird. Bei diesem Makro werden auch UTF8-codes von Internet-Adressen decodiert und es wird als Kommentar angezeigt, wo im Text Fußnoten, Bilder oder Shapes gewesen waren. Bei dem Makro "Bereinigt_einfügen" bleiben neben "fett", "kursiv" und "unterstrichen" auch einige Absatz-Formatvorlagen erhalten. Ebenso bleiben Bilder, Felder und Fußnoten erhalten. Es werden auch hier Symbol- und Wingdings-Zeichen in Unicode-Zeichen konvertiert. Textfelder ("Textbox") werden in normalen Text konvertiert, frei positionierte Bilder in normal positionierte Bilder umgewandelt. Bei den übrigen Shapes wird in grüner Farbe auf das Löschen hingewiesen. *** Das Analyse-Makro "Sub Hexcode_und_Name_ermitteln()" kann sämtliche normgerechten Schriftzeichen (Unicode) analysieren und (außer bei chinesischen, japanischen und koreanischen Silbenzeichen) deren englischen Namen nach ISO/IEC 10646 ausgeben. Daneben kann das Analyse-Makro aber auch die Codes von nicht-normgerechten Sonderschriftarten ermitteln sowie bei den Schriftarten "Symbol" und "Wingdings" die Bedeutungen der Zeichen angeben. Das Analyse-Makro bietet die Möglichkeit, mehrere Zeichen einer Zeichenkette gleichzeitig zu analysieren. Damit können auch Schriftzeichen mit (diakritischen) Akzentzeichen gut analysiert werden, die sonst nur umständlich zu analysieren sind, oder etwa einen Text mit einer Kombination von Schriftzeichen aus Schriftsystemen, die von rechts nach links geschrieben werden, mit Schriftzeichen, die von links nach rechts geschrieben werden. Das Analyse-Makro funktioniert auch dann, wenn im Text nur "leere Kästchen" zu sehen sind, weil die nötige Sonderschriftart (Font) fehlt. Solange im Namen der Dokumentvorlage mit dem Analyse-Makro das Wort "kompakt" enthalten ist, wird für die (englischen) Namen der Zeichen die Unicode-Liste in dieser Dokumentvorlage (ab Seite 2) verwendet, ansonsten wird nach der Datei "UnicodeData.txt" gesucht, notfalls sogar im Internet. Das Analyse-Makro kann in Word 2010 die Zeichen aus Formeln mit dem neuen Formeleditor "OMML" analysieren, jedoch nicht gleichzeitig mit Verknüpfungspfaden von Bildverknüpfungen. Im Kompatibilitätsmodus werden diese OMML-Formeln jedoch zu Grafiken. --------------------------------------------------------© Dipl.-Ing. Hanna-Chris Gast, 2010, 2011, 2014, 2015, 2016. E-Mail: hcgast "ät" siebener-kurier.de (dabei "ät" durch "@" ersetzen). Beschreibungen im Internet: 8 http://www.siebener-kurier.de/chris-aufsaetze --------------------------------------------------------Download der Makros: http://www.siebener-kurier.de/chris-aufsaetze/Unicode-Makros.zip. Die zur Analyse verwendete Unicodeliste findet sich unter: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt Die hier enthaltenen Makros wurden weitgehend veröffentlicht als Beilagen zum Siebener-Kurier, ISSN 0948-6089. Abdruck und Zitate nur mit Quellenangabe! --------------------------------------------------------- 9 2 Grundlagen der Codierung von Schriftzeichen im Computer Die verbreiteteste Codierung für Schriftzeichen ist heutzutage neben den Normen der Reihe ISO/IEC 8859 bzw. den davon abgeleiteten Windows-Codes das Unicode-System (UCS) nach ISO/IEC 10646. Alle anderen Systeme, wie etwa spezielle Schriftfonts, sind heutzutage veraltet. 2.1 Ältere Zeichencodierungen ASCII 1 ist ein inzwischen veralteter 7-Bit-Zeichensatz (128 Codes), die ersten 32 Zeichen sind (heute noch) Steuerzeichen. Das reichte für amerikanische Fernschreiber völlig aus. Durch Einführung der Personal Computer (PC) wurde der ASCII-Zeichensatz um 1 Bit auf 8 Bit erweitert (8 Bit = 1 Byte = 256 Codes = zwei Hex-Zahlen). Während ASCII weltweit einheitlich benutzt wurde, gab es je nach Land oder Ländergruppe unterschiedliche Varianten mit 256 Codes (DOS-Codepages und später die Normen der Reihe ISO/IEC 8859). Auch bei den jetzigen Windows-Codes gibt es immer noch Unterschiede. Der bekannteste ist das in Westeuropa und in den USA verwendete Windows 1252 (CP1252, "Westeuropäisch"). Letzteres wird fälschlich auch "ANSI"-Code genannt. Windows 1252 unterscheidet sich von ISO/IEC 8859-1 2 durch zusätzliche Buchstaben im Bereich dez. 128 bis dez. 159 (hex.80 bis hex. 9F), wo die ISO/IEC-Norm zusätzliche unter Windows nicht verwendete Steuerzeichen hat. 2.2 Das Unicode-System Die verbreitetste Schriftzeichen-Codierung für Computer ist heutzutage Unicode (UCS 3). Diese ist in ISO/IEC 10646 und beim Unicode-Consortium [1] festgelegt. In Unicode sind heutzutage die Schriftzeichen oder Textelemente aller bekannten Schriftkulturen und Zeichensysteme in Form eines digitalen Codes enthalten, der hexadezimal oder dezimal angegeben werden kann (zum Beispiel beim Eingeben mit der Alt -Taste in Word). In Unicode wird nur der jeweilige Buchstabe (oder Sonderzeichen) festgelegt, nicht aber seine konkrete Gestalt auf dem Papier. Dafür sind die Schriftarten (Fonts) zuständig. Die Bedeutung und Aussprache eines Buchstaben hängt von der jeweiligen Sprache ab. Das Unicode-System benennt Buchstaben deshalb möglichst Anwendungs-unabhängig. Unicode ist untergliedert in Ebenen (englisch "planes"). Am wichtigsten ist die unterste Ebene, die Ebene 0 mit dem grundlegenden mehrsprachigen Codebereich (BMP, englisch: "Basic Multilingual Plane"). In dieser Ebene liegen die Zeichen mit den Unicodes (engl. "Codepoints") von hexadezimal 0000 bis FFFF bzw. dezimal von 0 bis 65535 4. Dies reicht für alle heutigen europäischen Sprachen aus, aber auch für Altgriechisch und Altkirchenslawisch . Darauf folgt die Ebene 1 mit dem ergänzenden mehrsprachigen Bereich, (SMP, englisch: "Supplementary Multilingual Plane", SMP, auch als Plane 1 bezeichnet). Sie enthält vor 1 2 3 4 10 ASCII = American Standard Code for Information Interchange. In ISO 8859-1 fehlt noch das Eurozeichen. Dieses befindet sich in ISO 8859-15. englisch: Universal Character Set. 0 bis 65 535 ergeben (inklusive der Null) zwei hoch sechzehn theoretisch mögliche Zeichen. allem historische Schriftsysteme bis hin zu Hieroglyphen und weitere chinesisch/ japanisch/koreanische Zeichen, aber auch größere Ansammlungen an Zeichen, die selten in Gebrauch sind, zum Beispiel Musiknotenzeichen. Weitere Ebenen sind für Europäische Sprachen noch nicht relevant. Die Unicode-Ebenen werden ihrerseits in Blöcke (englisch "blocks") unterteilt, die jeweils einzelne Schriftsysteme wie Lateinisch, Griechisch usw. enthalten. Die ersten beiden Blöcke von hexadezimal 0000 bis 00FF (dezimal 0 bis 255) enthalten lateinische Schriftzeichen und entsprechen der ISO/IEC 8859-1. Ist ein Block voll, müssen spätere Ergänzungen in anderen Blocks untergebracht werden, da kein festgelegtes Unicode-Zeichen wieder gestrichen werden darf. Dies führt teilweise zu einer gewissen Zerstückelung des Systems. Die folgende Tabelle 2.1 gibt eine kurze Übersicht über die Unicode-Ebenen 0 (BMP) und 1 (SMP) mit einer Auswahl an Blöcken. Neben den wichtigsten Blöcken mit lateinischen Buchstaben, den Surrogaten und der Private-Use-Area (PUA) enthält sie zum Beispiel die Unicode-Blöcke für Griechisch. "Kombinierende diakritische Zeichen" ("Combining Diacritical Marks") überlagern sich dem Zeichen davor, sie kombinieren sich mit dem jeweiligen zugehörigen Buchstaben. 11 Tabelle 2.1: Übersicht der Unicode-Ebenen 0 und 1 mit einer Auswahl an Blöcken (1 von 2) Unicode-Blöcke EbeEnglische ne Deutsche Bezeichnung 5 Bezeichnung 6 Unicodes (Codepoints) Französische 6 Bezeichnung (hexadezimal) (dezimal) Unicode-Ebene 0 Basic Multilingual Plane (BMP) Plan multilingue de base (PMB) 00 00 bis FF FF 0 bis 65 535 Basis-Lateinisch Basic Latin (ASCII) Latin de base 0000 bis 007F 0 bis 0127 Lateinisch-1, Ergänzung Latin-1 supplement Supplément latin-1 0080 bis 00FF 0128 bis 0255 Kombinierende diakritische Zeichen Combining Diacritical Marks Diacritiques 03 00 bis 03 6F 768 bis 879 Griechisch und Koptisch Greek and Coptic Grec et copte 03 70 bis 03 FF 880 bis 1023 Kyrillisch Cyrillic Cyrillique 0400 - 04FF 1024 1279 bis Kyrillisch, Ergänzung Cyrillic Supplement Supplément cyrillique 0500 - 052F 1280 1327 bis Griechisch, Zusatz Greek Extended Grec étendu 1F 00 bis 1F FF 7 936 8 191 bis Kyrillisch, erweitert A Cyrillic Extended A Cyrillique étendu A 2DE0 - 2DFF Kyrillisch, erweitert B Cyrillic Extended B Cyrillique étendu-B A640 - A69F Surrogat 1 (high surrogates) High Surrogates Demi-zone haute D8 00 bis DB FF 55 296 bis 56 319 Surrogat 2 (low surrogates) Low Surrogates Demi-zone basse DC 00 bis DF FF 56 320 bis 57 343 Private Use Area; PUA Private Use Area (PUA) Zone à usage privé E000 bis F8FF 0 5 6 12 11 744 11 775 42 560 42 655 bis bis 57344 bis 63743 Weitgehend nach Wikipedia [8]. ISO/IEC 10646:2003 und ISO/IEC 10646/A2:2006, die späteren Ausgaben sind leider nur noch auf Englisch. Tabelle 2.1: Übersicht der Unicode-Ebenen 0 und 1 mit einer Auswahl an Blöcken (2 von 2) Unicode-Blöcke EbeEnglische ne Deutsche Bezeichnung 7 Bezeichnung 8 Französische 6 Bezeichnung (hexadezimal) (dezimal) Unicode-Ebene 1: SMP (Supplementary Multilingual Plane) Supplementary Multilingual Plane (SMP) Plan multilingue complémentaire (PMC) 1 00 00 bis 1 FF FF 65 536 bis 131 071 Ägäische Zahlzeichen Aegean Numbers Nombres égéens 1 01 00 bis 1 01 3F 65 792 bis 65 855 Altgriechische Notenschriftzeichen Ancient Greek Numbers Nombres grecs anciens 1 01 40 bis 1 01 8A 65 856 bis 65 930 Ägyptische Hieroglyphen Egyptian Hieroglyphs (Hiéroglyphes égyptiens) 9 1 30 00 bis 1 34 2F 77 824 bis 78 895 Byzantinische Notenschriftzeichen Byzantine Musical Symbols Symboles 1 D0 00 bis musicaux byzantins 1 D0 F5 118 784 bis 119 029 Altgriechische Zahlzeichen Ancient Greek Musical Notation Musique grecque ancienne 119 296 bis 119 365 1 Unicodes (Codepoints) 1D2 00 bis 1 D2 45 2.3 Zum Prinzip der Surrogate Die Hohen und Niedrigen Surrogate sind in speziell dafür reservierten Unicode-Blöcken untergebracht, siehe folgende Tabelle 2.2. Zusätzlich sind in dieser Tabelle die Bereiche der Ebenen 0 und 1 aufgeführt. Eine gute Übersicht über weitere Blöcke und weitere Ebenen gibt es in Wikipedia [8]. Tabelle 2.2: Die Unicode-Blöcke der Surrogate Ebene Unicode Blöcke 0 1 7 8 9 Unicode (hexadezimal) Unicode (dezimal) Ebene 0: BMP (Basic Multilingual Plane) 00 00 bis FF FF 0 bis 65535 ... Surrogat 1 (High Surrogates ) D8 00 bis DB FF 55 296 bis 56 319 DC 00 bis DF FF 56 320 bis 57 343 1 00 00 bis 1 FF FF 65 536 bis 131 071 Surrogat 2 (Low Surrogates ) ... Ebene 1: SMP (Supplementary Multilingual Plane) Weitgehend nach Wikipedia [8]. ISO/IEC 10646:2003 und ISO/IEC 10646/A2:2006, die späteren Ausgaben sind leider nur noch auf Englisch. ISO IEC 10646/Amd5:2008, wo die Hieroglyphen genormt sind, existiert leider nur auf Englisch. 13 2.4 Probleme bei Word 2000 mit Zeichen höherer Unicode-Ebenen Word 2000 kann Schriftzeichen der Unicode-Ebene 1 darstellen, wenn Windows entsprechend eingestellt ist und die entsprechende Schriftart installiert ist. Ich habe für Word inzwischen mittels Makros passend erweitert, so dass nun damit auch Schriftzeichen der höheren Unicode-Schriftarten eingefügt und analysiert werden können, siehe [26]. 2.5 UTF-Codierung Unicode kann für den Computer und für die Datenübertragung auf verschiedene Arten codiert werden. Üblich sind: a) UTF-16 bei Computern mit Windows-Betriebssystem. Dieses ist in der für europäischen Sprachen relevanten Unicode-Ebene 0 mit dem einfachen Unicode identisch. Bei Schriftzeichen mit Codes größer hex. FFFF wird der Code in sogenannte Surrogate nach ISO/IEC 10646:2003, Anhang C zerlegt 10. Siehe hierzu Abschnitte 2.3. b) UTF-8 bei der (seriellen) Übertragung im Internet. Die Berechnung von UTF-8 aus den Unicode-Werten ist in ISO/IEC 10646:2003, Anhang D, genormt 11. Hier erfolgt die Umcodierung derart, dass erstens die Codes bei den lateinischen Grundbuchstaben (ASCII-Bereich) kleiner werden als bei der einfachen Unicode-Codierung und dass zweitens bei der Übertragung weniger Fehler entstehen als bei der einfachen UnicodeCodierung. Zu UTF-8 siehe auch Abschnitt 15. 2.6 Abkürzungen (UCS und UTF) "UTF" ist die Abkürzung von "Unicode Transformation Format" "UCS" ist dagegen "Universeller codierter Zeichensatz" nach ISO/IEC 10646 (englisch: "Universal Coded Character Set" or shorter "Universal Character Set"). 10 11 14 Inzwischen neuere Ausgabe der Norm. Dort sind aber keine brauchbaren Formeln für die Umrechnung mehr. Inzwischen neuere Ausgabe der Norm. Dort sind aber keine brauchbaren Formeln für die Umrechnung mehr. 3 UTF8 im Internet 3.1 Codierung UTF-8 UTF-8 bedeutet "8-bit UCS Transformation Format" und ist heute die im Internet am häufigsten angewendete Codierung. Die Berechnung von UTF-8 aus den Unicode-Werten in ISO/IEC 10646:2003, Anhang D, genormt. Bei der Übertragung von Texten mit UTF-8 entstehen weniger Fehler als bei der direkten Unicode-Codierung. Das erste Byte bei einem Mehrbyte-Code beginnt mit soviel Einsen (binär) vor der ersten Null, wie der Code insgesamt Bytes hat 12. Die Folgebytes beginnen mit "10" (binär). Hexadezimal ausgedrückt bedeutet das, dass das erste Byte Werte von (hex.) "C0" bis "FD" enthalten kann und die Folgebytes Werte von (hex) "80" bis "BF". Auf diese Weise ist die UTF-8-Übertragung stabiler gegen verloren gegangene Bytes und erlaubt eine leichtere Synchronisation als die direkte Unicode-Übertragung. Ausnahme sind die Unicode-Zeichen mit Codes von Null bis 7F (hexadezimal). In diesem Bereich ist UTF-8 identisch mit ASCII. Die Bytes (hex.) 00 bis 7F sind bei UTF-8 außerdem reserviert ausschließlich für den ASCII-Bereich, so dass es keine Verwechslung mit höheren Unicode-Werten geben kann, wenn bei der Übertragung mal ein Byte verloren geht. UTF-8 ist bei ASCII-Zeichen (Unicodes bis hexadezimal 007F) kürzer als Unicode, weil die führenden Nullen entfallen. Bei Unicodes von 0080 bis 07FF (lateinische Buchstaben mit diakritischen Zeichen, Kyrillisch, Griechisch usw.) ist UTF-8 genauso lang wie Unicode. Nur bei Unicodes ab hexadezimal 0800 (wie etwa beim Eurozeichen und asiatischen Sprachen) ist UTF-8 aber länger als die normale hexadezimale Unicode-Darstellung. Von daher ist UTF-8 für manche asiatische Sprachen nicht so günstig wie für die europäischen Sprachen. Die UTF-8-Codierungen der wichtigsten griechischen Buchstaben sind in Abschnitt 3.6 in Tabellenform aufgelistet. Eine vollständige Übersicht aller UTF-8-Codes findet sich bei T. Schild [15]. 3.2 Häufigkeit der verschiedenen Codierungen bei Griechischen Seiten Für Griechisch kenne ich leider keine spezielle Untersuchung, welche Codierung für Webseiten mit griechischer Sprache am häufigsten ist. Griechisch sind etwa 0,3 % aller Internetseiten, "ISO-8859-7" (griechisch) gibt es bei ungefähr 0,1 % aller Internetseiten insgesamt und "Windows-1253" (griechisch) bei ungefähr 0,1 % aller Internetseiten insgesamt. UTF-8 wird in 53,2 % aller Internetseiten verwendet und ist damit insgesamt die häufigste Codierung im Internet. Ob nun bei Griechischen Seiten UTF-8 häufiger ist als "ISO-8859-7" 12 1 Byte mit 8 Bit, auch "Oktett" genannt, ist in der hexadezimalen Darstellung eine Kombination aus zwei Zeichen von Null bis F. 15 oder "Windows-1253", lässt sich daraus nicht ableiten, da die Werte für eine statistische Auswertung nicht ausreichen. Eine eigene Suche mit der Google-Spezialsuche nach Texten in griechischer Sprache 13 und der jeweiligen Textzeile im Quelltext ergab: - "Content-Type: text/html; charset=UTF-8": ca. 220 000 mal, - "Content-Type: text/html; charset=iso-8859-7" ca. 51 500 mal, - "Content-Type: text/html; charset=windows-1253" ca. 20 700 mal, Folglich wird auch bei griechischen Internetseiten UTF-8 am häufigsten verwendet. 3.3 Codierung von Nicht-ASCII-Zeichen in Domain-Namen mittels Punycode Ursprünglich waren für Internet-Adressen nur Zahlen und lateinische Buchstaben erlaubt, soweit sie dem ASCII-Code entsprechen. Dies reicht für die englische Sprache vollständig aus. In Deutschland sind seit 2004 Umlaute wie "ä", "ö" "ü" usw. erlaubt ("Umlautdomains"), in Griechenland sind seit 2005 auch griechische Buchstaben zulässig. Seit Ende 2007 lässt auch die ICANN 14 Domainnamen mit Nicht-ASCII-Zeichen zu, das heißt, es sind jetzt international für Domainnamen deutsche Umlaute usw., griechische und kyrillische Buchstaben bis hin zu chinesischen Schriftzeichen zulässig. Diese Art von Domains bezeichnet man als IDN-Domains (englisch: "Internationalized Domain Name"). Allerdings sind diese in Wirklichkeit überhaupt nicht für "internationale", sondern lediglich für Anwendungen innerhalb des jeweiligen Sprachraums geeignet. Namen von IDN-Domains (Domainnamen mit Unicodes) werden im Computer des Anwenders, d. h. im Web-Browser bzw. im E-Mail-Programm automatisch zu ASCIIkompatible Zeichenketten (ACE-Strings, ASCII Compatible Encoding Strings) umgewandelt. Auf diese Weise brauchten die Internet-Server nicht verändert zu werden. Statt dem Domainnamen mit Umlauten oder fremdländischen Sonderzeichen kann der Benutzer an seinem Computer aber auch direkt den ACE-String mit den lateinischen Buchstaben auf seiner (deutschen) Tastatur eingeben. Die Umcodierung von Domainnamen erfolgt im Computer wie folgt: Zunächst wird im jeweiligen Internetbrowser bzw. E-Mail-Programm die eingegebene Internetadresse wie bisher durch das sogenannte "Nameprep" [16] normalisiert, das heißt, Großbuchstaben werden zu Kleinbuchstaben und Zeichen wie das "ß" (Eszett) werden in äquivalente ASCII-Zeichen umgewandelt. Die Unterscheidung zwischen Groß- und Kleinbuchstaben sowie zwischen "ss" und "ß" (Eszett) ist weiterhin nicht möglich. Aus der Eingabe "www.KörperMaße.de" wird "www.körpermasse.de". Im Anschluss daran werden bei Domains mit Unicodes (IDN-Domains) mittels des sogenannten "Punycode"-Verfahren [16] die Nicht-ASCII-Buchstaben (Umlaute, griechische und kyrillische Buchstaben usw.) aus dem Domainnamen entfernt. Stattdessen wird am Ende des Domainnamens eine ASCII-Zeichenkette hinzugefügt, in der die Position und Art des 13 14 16 Google-Abfrage 3. Juli 2010. Die ICANN (Internet Corporation for Assigned Names and Numbers) ist eine privatrechtliche Non-Profit-Organisation US-amerikanischen Rechts mit Sitz im kalifornischen Ort Marina del Rey. Sie entscheidet über die Grundlagen der Verwaltung der Top-Level-Domains. Unicode-Zeichens kodiert ist. Um einen IDN-Domain-Namen von einem ASCIIDomainnamen zu unterscheiden, beginnt der fertig codierte IDN-Domain-Name mit dem Präfix aus vier Schriftzeichen "xn--". Dieses Umcodieren mittels Nameprep und Punycode ist übrigens keine "Transliteration" bzw. "Transkription". Theoretisch sind im Internet jetzt alle Unicode-Zeichen in IDNs zulässig. Die jeweiligen Zulassungsstellen wie die DENIC für Deutschland oder EURic für Europa [17] lassen aber nur begrenzte Mengen an Zeichen zu. Jede Zulassungsstelle für Domains regelt separat, welche Zeichen sie für die von ihr verwalteten Domain-Namen erlaubt. In Europäischen Domains (.eu) sind seit Januar 2010 auch kyrillische und griechische Zeichen zulässig, da in der Europäischen Union Griechenland griechische und Bulgarien kyrillische Zeichen benutzt. Beispiele für Domain-Namen mit Umlauten und anderen Unicodes 15 (Die Markierungen zeigen das Punycode-Präfix des ACE-Strings): aus \www.kühe-mögen-äpfel.de wird \\www.xn--khe-mgen-pfel-jfb9x9c.de (diese Seite gibt es tatsächlich!); — aus \www.äaaa.de wird www.xn--aaa-pla.de — aus \www.aäaa.de wird www.xn--aaa-qla.de — aus \www.aaäa.de wird www.xn--aaa-rla.de — aus \www.aaaä.de wird www.xn--aaa-sla.de Je nach Ländereinstellung des Internetbrowsers wird in der Adresszeile oben auf dem Bildschirm entweder der Domainname mit den Original-Unicodezeichen angegeben oder der ACE-String. 3.4 Codierung von griechischen Buchstaben usw. in Unterseiten einer Domain mittels UTF-8 Für die Unterseiten von Domains (also hinter dem ".eu/", ".ru/", ".com/" usw.) gibt es keine Einschränkungen für die Verwendung von Unicode-Schriftzeichen. Die Unterseiten sind kein Teil des Domain-Namens, sondern nur vom Inhaber einer Domain jeweils vergebene Unterordner-Namen. Hier können auch, anders als beim Domain-Namen selber, Groß- und Kleinbuchstaben unter-schieden werden. Siehe zum Beispiel die folgende Wikipedia-Seite zum "Weihnachtsbaum": https://el.wikipedia.org/wiki/Δένδρο_των_Χριστουγέννων [8]. Die Codierung erfolgt hier nicht mit Punycode, sondern mit UTF-8, siehe Abschnitt 3.6. Zum Beispiel wird bei mir diese griechische Unter-Seite über den Weihnachtsbaum mit UTF-8 codiert angezeigt als (Anfangsbuchstaben von mir markiert), siehe das folgende Bild. Bild 3.1: Screenshot einer Adresszeile (Browser = Firefox) 15 Beispiele aus Wikipedia[8]. 17 Dabei wird zusätzlich noch vor jede zweistellig hexadezimale Codezahl ein Prozentzeichen gesetzt. Wer das decodieren will, lässt die Prozentzeichen weg und kann dann die UTF-8Codes zum Beispiel in der sehr übersichtlichen Internetseite "UTF-8-Codetabelle mit Unicode-Zeichen" [15] nachschlagen. Eine Lösung zur direkten Anzeige der griechischen Buchstaben anstelle von UTF-8-Codes in der Adresszeile des Browsers habe ich leider noch nicht gefunden. Für den ASCII-Bereich ist UTF-8 mit Unicode identisch, allerdings ohne die führenden Nullen. Für das Leerzeichen steht dann "20" bzw. "%20" wie zum Beispiel in der folgenden (veralteten) Unterseite von der Europäischen Normungsorganisation CEN: "www.cen.eu/boss/supporting/Useful%20hyperlinks/Pages…" Nachtrag: Inzwischen ist diese Unterseite durch eine neue Seite ohne Leerzeichen in der Adresse ersetzt worden. 3.5 Probleme durch die Einführung von IDN-Domains Das deutsche Eszett ist weiterhin unmöglich, weil dafür auch die "Nameprep"-Funktion geändert werden müsste. Da hilft auch nicht, dass es in Unicode jetzt sogar das große Eszett gibt (Unicode hexadezimal 1E9E, dezimal 7838). Einige kyrillische und griechische Buchstaben sehen lateinischen Buchstaben zum Verwechseln ähnlich. Deshalb darf zum Beispiel für ".eu"-Domänen keine Schriftzeichen mehrerer Sprachen gleichzeitig verwendet werden [17]. Aber nicht alle Anbieter sind so streng, und in Unterseiten ist sowieso alles erlaubt. Von daher ist es gut, wenn im eigenen Internetbrowser nicht zu viele Länder eingestellt sind, so dass die kyrillischen und griechischen Zeichen nur als Punycode bzw. codiert als UTF-8 erscheinen. Hier wird sich vermutlich bezüglich intelligenter Internet-Browser wohl noch einiges entwickeln, um Betrügereien zu verhindern. Trotzdem bleibt noch das Problem, dass zum Beispiel die fiktiven Seiten "www.söhne.de" und "www.soehne.de" zu verschiedenen Anbietern gehören kann. Bei griechischen Domains können theoretisch Domainnamen mit den alten Akzentzeichen und Domainnamen mit demselben griechischen Wort, aber mit modernem Akzent (Tonos) bei ".eu" nicht zu derselben Webseite gehören. Bei der griechischen Toplevel-Domain ".gr" ist dies durch das sogenannte "Bundling" gelöst, bei dem stets alle Akzentvarianten mitreserviert sind. Ferner werden auch die drei möglichen Zeichen für das Sigma (Σ ς σ) durch das erfasst, [19]. Als Beispiel diene hier das Epsilon mit den verschiedenen Akzenten, hier der Ähnlichkeit nach sortiert: έέ ὲ ἐἑ ἒἓ ἔἕ. Die ersten beiden (Tonos und Akut) lassen sich in vielen Schriftarten nicht unterscheiden. Und Spiritus lenis und Spiritus asper sind meistens auch nur schwer zu unterscheiden. Bei Anwendung des Analyse-Makros nach Abschnitt 6 16 ergibt sich die Analyse nach dem folgenden Bild (das letzte analysierte Zeichen ist der Punkt am Ende des Satzes). 16 18 Analysemakro in einer fertigen Dokumentvorlage zum Download siehe [2]. Bild 3.2: Screenshot der Analyse der Epsilons mit dem Analysemakro 3.6 Einige UTF-8-Codes und deren Berechnung Es erscheint mir vorsintflutlich, von Hand UTF-8 decodieren zu müssen, aber zumindest bei mir zeigen der Internet-Browser im Adressfenster bei den Unterseiten direkte UTF-8Codierung an. Wahrscheinlich dient dies der Sicherheit des Anwenders, damit er (sie) nicht auf gefälschte Seiten hereinfällt (siehe auch Abschnitt 3.5). Die Umrechnung von normalem Unicode in UTF-8-Codes erfolgt nach ISO/IEC 10646:2003, Anhang D, siehe die folgende Tabelle. Tabelle 3.1: Konvertierung von Unicode (UCS-4) in UTF-8 Wertebereich von Unicode (UCS-4) Sequence of octets in UTF-8 x = 0000 0000 .. 0000 007F; x; x = 0000 0080 .. 0000 07FF; C0 + x / 2 ; 6 80 + x % 2 ; 12 E0 + x/2 ; 6 6 80 + x/2 % 2 ; 6 80 + x % 2 ; 18 F0 + x/2 ; 12 6 80 + x/2 % 2 ; 6 6 80 + x/2 % 2 ; 6 80 + x % 2 ; x = 0000 0800 .. 0000 FFFF; x = 0001 0000 .. 001F FFFF; ... 6 ... Das Symbol "%" bedeutet die Modulo-Funktion, zum Beispiel: 7 % 3 = 1 Das Symbol "/" bedeutet hier die Integer-Division, zum Beispiel: 7 / 3 = 2 6 12 18 Hochgesetzte Zahlen sind Exponenten: 2 = 64; 2 = 4096; 2 = 262 144 Manche Browser zeigen nicht nur Umlaute, sondern auch Leerzeichen und Bindestriche codiert an, siehe folgende Tabelle. 19 Tabelle 3.2: Deutsche und französische "Sonderzeichen" Unicode (hex.) Zeichen UTF-8 (hex.) Unicode (hex.) Zeichen UTF-8 (hex.) 00 20 Leerzeichen 20 00 E0 à C3 A0 00 2D - 2D 00 E2 â C3 A2 00 C4 Ä C3 84 00 E7 ç C3 A7 00 D6 Ö C3 96 00 E8 è C3 A8 00 DC Ü C3 9C 00 E9 é C3 A9 00DF ß C3 9F 00 EA ê C3 AA 00 E4 ä C3 A4 00 EB ë C3 AB 00 F6 ö C3 B6 00 FC ü C3 BC Beispiele für Internet-Adressen mit UTF8: Griechenland https://el.wikipedia.org/wiki/%CE%95%CE%BB%CE%BB%CE%AC%CE%B4%CE%B1 Mein Makro macht daraus: https://el.wikipedia.org/wiki/Ελλάδα http://de.wikipedia.org/wiki/%C3%9Cbersetzung_(Technik) http://de.wikipedia.org/wiki/Haust%C3%BCr Das Makro macht daraus: http://de.wikipedia.org/wiki/Übersetzung_(Technik) http://de.wikipedia.org/wiki/Haustür DIN auf chinesischer Seite https://zh.wikipedia.org/wiki/%E5%BE%B7%E5%9B%BD %E6%A0%87%E5%87%86%E5%8C%96%E5%AD%A6%E4%BC%9A Das Makro macht daraus: https://zh.wikipedia.org/wiki/德国 标准化学会 (es bleibt leider der Zeilenumbruch erhalten. Es funktioniert aber im Browser trotzdem) Test eines Codes, der mit "%F" beginnt (Violinschlüssel, Unicode = "U+1D11E", UTF8 = "F0 9D 84 9E") Als fiktive Internet-Seite http:/www.xxx.de/%F0%9D%84%9E/Test1%20Test2 Das Makro macht daraus (Farben von Hand ergänzt): http:/www.xxx.de/�/Test1_Test2 Man muss sich aber noch von Hand eine passende Schriftart suchen, hier etwa Code 2001: http:/www.xxx.de/ /Test1_Test2 20 4 Schriftarten (Fonts) für Unicode-Zeichen Die Unicode-Ebene 0 (Basic Multilingual Plane) enthält im Prinzip alle in europäischen Sprachen nötigen Schriftzeichen. Inzwischen hat man jedoch weitere Schriftzeichen genormt, die in der ursprünglichen Ebene 0 nicht mehr unterzubringen waren, wie etwa zusätzliche antike Zahl- und Notenschriftzeichen 17. In ISO/IEC 10646 oder Unicode.org [1], bzw. einfacher bei Wikipedia [8], findet man alle genormten Schriftzeichen-Codes, aber leider nicht die dafür jeweils nötigen Schriftarten. Während bei der Unicode-Ebene 0 die auf dem Computer vorhandene Schriftarten meistens ausreichen, sind für die höhere Unicode-Ebenen grundsätzlich spezielle Schriftarten nötig, da keine für Windows geeignete Schriftart mehr als 65 536 Zeichen enthalten kann. Mit dem Schriften-Suchprogramm FileFormat.Info [9] fand ich brauchbare im Internet frei downloadbare Schriften wie Code 2001.ttf. Weitere Schriften für den griechischen Sprachraum finden sich auf der Webseite "Unicode Fonts for Ancient Scripts" [10], zum Beispiel für Hieroglyphen die Schriftart "Gardiner" oder "Symbola" für den Ersatz von Wingdings und Symbol. Die für mich wichtigsten Fonts: Cambria Cambria ist eine serifenbehaftete Schrift. Sie ist Teil einer Reihe neuer Schriftarten, die mit Microsoft Windows Vista eingeführt wurden, und ist darüber hinaus auch in Microsoft Office seit der Windows-Version 2007 beziehungsweise der Mac-OS-X-Version 2008 enthalten. [8] Anmerkung: Bei meinen ersten Tests mit Cambria mit Word 2007 im Copyshop (2011) gab es noch nicht soviele Zeichen in Cambria bzw. Cambria Math wie jetzt in Word 2010. Ich habe zurzeit die Cambria-Version 5.96, (Stand Oktober 2015). Cambria Math This is a variant designed for mathematical and scientific texts, as a replacement for Times New Roman. Deutsche Übersetzung: Cambria ist eine Variante, ausgelegt für mathematische und wissenschaftliche Text als Ersatz für Times New Roman. [8] Arial Arial ist charakterisiert durch große Mittellängen und einfache Formen ohne Serifen. Große Verbreitung fand die Schrift, weil sie bei Microsoft Windows seit der Version 3.1 standardmäßig mitgeliefert wird. [8]. Hersteller Monotype. Times New Roman Die Times ist eine Barock-Antiqua-Schrift, die ursprünglich 1931 von Stanley Morison und Victor Lardent entworfen wurde. Mittlerweile existieren zahlreiche Varianten der ursprünglichen Times. Als Computerschrift wurde die Times durch Produkte der Unternehmen Adobe, Microsoft und Apple populär, sodass sie heute zu den bekanntesten und meistverwendeten Schriften gehört. [8] Anmerkung: Times New Roman war bis Word 2003 die Standard-Schriftart. Sie ist aber immer noch meine Lieblingsschriftart für Aufsätze (H. Chris Gast, September 2014). 17 Die heute noch gebräuchlichen griechischen Zahlzeichen nach dem milesischen Prinzip sind im Unicode-Block "Griechisch und Koptisch" in der Unicode-Ebene 0 enthalten, siehe [1]. 21 Arial Unicode Die spezielle Variante "Arial Unicode MS" ist ein relativ weit verbreiteter Font, der den Großteil des Unicode-Zeichensatzes enthält. Zum Textsatz in nicht-asiatischen Sprachen ist sie weniger geeignet, da es zu dieser Schrift weder einen kursiven noch einen fetten Schnitt gibt und die Schriftart auch keine Kerningpaare enthält, die beim Textsatz für ein ruhiges Erscheinungsbild sorgen. [8] Segoe UI Symbol Sego UI ist eine von Microsoft entwickelte Schriftfamilie für die Betriebssysteme Windows Vista und Windows 7, die die Microsoft-Schriftart Tahoma als serifenlose Standardschriftart ablöst. . . [8]. Symbola Font mit der umfangreichsten Sammlung an Symbol-Zeichen, der als kostenloses Download zur Verfügung steht. Mit "Symbola" wird "Segoe UI Symbol" überflüssig. Download-Quelle: Internetseite von George Douros mit einer Menge weiterer interessanter Schriften, [10]. Weitere Schriftarten (Fonts): RomanCyrillic_Std.ttf, [11] Code 2001, [12] wie zum Beispiel . Gardiner (für Hieroglyphen), [13], wie zum Beispiel ). Cardo, (für Griechisch) [14] , wie zum Beispiel bei dem Zeichen 22 . 5 Makro zum Erzeugen von Schriftzeichen aus dem hexadezimalen Unicode, auch für höhere Unicode-Ebenen (UCS > FFFFhex) 5.1 Aufgabenstellung Ich wollte ein Makro schreiben für Word 2000 zur Erzeugung von Schriftzeichen aus dem Unicode . Dabei kann der Unicode in dezimaler oder in hexadezimaler Schreibweise vorliegen, was im Endeffekt zu zwei sehr ähnlichen Makros führte. Diese Makros sollen im Gegensatz zu den Funktionen von Word 2000 ausnahmslos alle Schriftzeichen erzeugen können, für die auf dem Computer eine passende Schriftart (Font) vorhanden ist, auch für für Schriftzeichen mit Unicodes größer als hex. FFFF. Hierbei ist zu berücksichtigen, dass Windows-Computer nicht Unicode direkt verwenden, sondern die (für 16-Bit-Rechner günstigere) Codierung UTF-16. Für Unicode-Werte bis hex. FFFF (das sind 16 Bit) sind Unicode und UTF-16 identisch. Für Werte darüber weicht UTF-16 von Unicode ab. Der Unicode-Wert wird in zwei 16-Bit-Codewerte, sogenannte "Surrogate", zerlegt. Dieses ist in ISO/IEC 10646:2003, Anhang C, festgelegt. Danach gilt für die Umrechnung von UCS in UTF-16 (siehe folgende Tabelle). Tabelle 5.1: Codierung nach ISO/IEC 10646:2003, Anhang C hexadezimaler Unicode (UCS-4 (4-octet)) Codierung nach UTF-16 (UTF-16, 2-octet elements) x = 0000 0000 bis 0000 FFFF x (bis hex. FFFF) x = 0001 0000 bis 0010 FFFF Surrogate y und z; mit y = ((x - 0001 0000) \ 400) + D800 und z = (Mod (x - 0001 0000)/400) + DC00 x = 0011 0000 bis 7FFF FFFF keine UTF-16-Werte definiert In dieser ISO-Tabelle bedeutet "x" der hexadezimale Code, ferner sind "y" und "z" die Surrogate. In meinem Makro dagegen verwende ich andere Formelzeichen. "\" bedeutet eine sogenannte "Ganzzahlige Division", nämlich den Integerwert der Division, und "Mod()" der "Ganzzahlige Rest einer Division", eine Modulo-Funktion. 1. Problem: Einige Rechen-operationen funktionieren bei mir nur mit Dezimalzeichen, nicht mit Hexadezimalzeichen. Deshalb rechnete ich einige wichtige Zahlenwert in Dezimalwerte um, siehe folgende Tabelle. Tabelle 5.2: Für das Makro wichtige Unicode-Werte, umgerechnet in Dezimalwerte Bereich bzw. Grenzwert Hexadezimal Absolute untere Grenze 00 20 Surrogat 1 (High Surrogates) D8 00 bis DB FF 55 296 bis 56 319 Surrogat 2 (Low Surrogates) DC 00 bis DF FF 56 320 bis 57 343 Grenze für Ebene 0 FF FF 65 535 Ab hier UTF-16 ungleich UCS 1 00 00 65 536 Obergrenze für Unicode 10 FF FF Dezimal 32 1 114 111 23 2. Problem: Beim Umwandeln von Hexzahlen in Dezimalzahlen gibt die Val-Funktion "Integer"-Werte aus, die aber bei VBA nur bis (dezimal) "+32 767" erlaubt sind, danach werden die "Ergebnisse" negativ. Aus hex. FFFF wird "-1"! Um höhere Zahlen als (dezimal) 32 767 zu ermöglichen, muss "&" angehängt werden. Dies erzwingt eine Ausgabe der ValFunktion als Zeichen vom Typ "Long" anstelle vom Typ "Integer". Mit dem Typ "Long" sind laut Hilfefunktion dezimale Zahlen bis 2 147 483 647 möglich, ohne das es Vorzeichenprobleme gibt, was für Unicode völlig ausreicht. 3. Problem: Word 2000 sucht nicht automatisch eine passende Schriftart aus, und Word 2003 nicht immer. Je nach Unicode-Bereich muss ich deshalb in meinem Makro eine Schriftart vorschlagen. Eine nachträgliche Zuordnung von Hand funktioniert unzuverlässig. Einige Schriftarten habe ich auch vermieden, weil sie Probleme bei der Konvertierung in eine pdfDatei machten. 5.2 Makro zur Erzeugung eines Schriftzeichens aus dem hexadezimalen Code (nur für Word 2000 nötig) Dieses Makro ist ab Word 2003 überflüssig. Sub Hexcode_in_Schriftzeichen_umwandeln() ' Dipl.-Ing. H. Chris Gast, 2. bis 8. Mai 2010, 25. November 2014. ' Diese Prozedur kann sämtliche Unicode-Schriftzeichen aus dem Hexcode erzeugen, ' auch bei höheren Unicode-Ebenen, was in Word 2000 sonst nicht möglich ist. ' Zu beachten ist, dass Windows UTF-16 nach ISO/IEC 10646 verwendet. ' Als Sollschriftart "Cambria" gewählt, 27. August 2015. ' Empfohlenes Tastenkürzel: Alt + C (nur für Word 2000 nötig!) ' Dim Z1 As String, Z2 As String, y1 As Long, y2 As Long Dim sur1 As String, sur2 As String, Font1 As String Dim Abfrage As Integer Dim Rng1 As Range, Rng2 As Range ' z1 ist der einzugebende hexadezimale Unicodewert, z2 der Kontrollwert für die Eingabe, ' y1 ist der daraus berechnete dezimale Unicodewert, ' y2 ist der um hex. 10000 (dez. 65536) verminderte dez. Unicodewert (= Zwischenschritt), ' sur1 ist der gesuchte hexadezimale Wert des High Surrogate (Surrogat 1), ' sur2 ist der gesuchte hexadezimale Wert des Low Surrogate (Surrogat 2), ' Font 1 ist die zu wählende Schriftart ' ' Wenn nichts markiert ist, links vom Cursor "Wort" markieren: If Selection.Type <> wdSelectionNormal Then Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend ' Markierbereich nach vorne um "U+" verlängern, sofern zutreffend: Set Rng1 = Selection.Range Set Rng2 = Selection.Range Rng2.SetRange Start:=Rng2.Start - 2, End:=Rng2.Start If Rng2.Text = "U+" Then Rng2.SetRange Start:=Rng2.Start, End:=Rng1.End Rng2.Select End If End If ' ' Markierte Textstelle soll der Eingabewert sein: Z1 = Selection ' ' Für Hexcode-Angabe besser Großbuchstaben nehmen: Z1 = UCase(Z1) 24 ' ******************************* ' versehentlich mitkopierte Leerzeichen beseitigen: Z1 = Trim(Z1) ' vorangestelltes "U+" bzw. "0x" löschen: If Left(Z1, 2) = "U+" Or Left(Z1, 2) = "0X" Then Z1 = Right(Z1, Len(Z1) - 2) End If ' ' ********************************* ' Grobe Prüfung des Wertebereichs: If Len(Z1) > 6 Then MsgBox "Es sind nur Unicodes bis hex. 10FFFF zulässig." Exit Sub End If ' y1 = Val("&H" & Z1 & "&") ' Erläuterung: Um höhere Zahlen als (dezimal) 32767 zu ermöglichen, ' muss [ & "&"] angehängt werden. Dies erzwingt eine Ausgabe als Zeichen ' vom Typ "Long" anstelle vom Typ "Integer". Aber auch "Long" lässt nur 7 Stellen zu, ' ohne Vorzeichenfehler zu machen, deshalb obige Prüfung. ' ' ****************** ' Prüfung, ob Eingabe eine Hexzahl ist: Z2 = Z1 ' Führende Nullen beseitigen (auch in der Politik sinnvoll): Do While Left(Z2, 1) = 0 If Left(Z2, 1) = 0 Then Z2 = Right(Z2, Len(Z2) - 1) Else Exit Do End If Loop ' If Z2 <> Hex(y1) Then ' MsgBox ("Eingabe war " & z1 & ", Dezwert ist " & y1 & ", Rückwandlung ist " & Hex(y1)) MsgBox "Eingabe ist keine richtige Hexzahl (nur 0 bis 9 und A bis F)" Exit Sub End If ' ' ******************* ' Fallunterscheidung: If y1 < 30 Then Abfrage = MsgBox("Es handelt sich um ein Steuerzeichen." _ & vbCrLf & vbCrLf & "Wollen Sie dieses trotzdem erzeugen?", _ vbYesNo + vbQuestion + vbDefaultButton2, "Windows-Steuerzeichen") If Abfrage = vbNo Then Exit Sub End If ' If y1 > 1114111 Then MsgBox "Unicodewerte über hex. 10FFFF bzw. dez. 1'114'111 sind nicht zulässig." Exit Sub End If ' ' Fall: Hexcode zwischen D800 und DFFF: If y1 > 55295 And y1 < 57344 Then Abfrage = MsgBox("Es handelt sich um ein Surrogat, kein zulässiges Zeichen!" _ & vbCrLf & vbCrLf & "Wollen Sie dieses trotzdem erzeugen?", _ vbYesNo + vbQuestion + vbDefaultButton2, "Windows-Steuerzeichen") If Abfrage = vbNo Then Exit Sub End If ' ' für Zeichen bis hex. FFFF gilt: Ergebnis ist "ChrW(y1)" 25 ' ******************************************************** ' Abfrage: Ist der Eingabewert eine hexadezimale Zahl kleiner gleich FFFF? ' If Val("&H" & z1) < Val("&H" & "10000") Then If y1 < 65536 Then ' "UTF-16 ist hier mit Unicode identisch" If y1 <= 1103 Then Selection.TypeText Text:=ChrW(y1) Else If y1 > 61471 And y1 < 61696 Then Font1 = InputBox("Bitte passende Schriftart wählen", "Hexcode = " & Z1, "Symbol") Else Font1 = InputBox("Bitte passende Schriftart wählen", "Hexcode = " & Z1, "Cambria") End If Selection.Font.Name = Font1 Selection.TypeText Text:=ChrW(y1) Selection.Font.Name = Font1 End If Exit Sub End If ' ' ***************************************** ' Für Schriftzeichen mit Unicode höherer Ebenen (hex.10000 bis hex.10FFFF) müssen Surrogate ' nach ISO/IEC 10646:2003, Anhang C angewendet werden. ' Für die Surrogate verwende ich die Formelzeichen "sur1" und "sur2". ' und "y2" als Zwischenwert für "Eingabewert minus hex. 00010000": ' y2 = Val("&H" & z1) - Val("&H" & "10000") y2 = y1 - 65536 ' ' Die Umrechnung von hex. D800 mittel "Val(&HD800)" führte bei hohen Werten ' zu negativen Zahlen, deshalb statt "hex.D800" besser dezimal "55296". ' Statt "Val(&HD400)" schreibe ich einfacher direkt dezimal "1024": ' ' Daraus ergeben sich als Surrogate: sur1 = Hex(Int(y2 / 1024) + 55296) sur2 = Hex(y2 - (Int(y2 / 1024) * 1024) + 56320) ' ' Anzeige = MsgBox(" Der Hexcode ist " & z1 & vbCrLf & " Der y1 ist: " _ ' & y1 & vbCrLf & " Das erste Surrogat ist: " & sur1 & vbCrLf & "Das zweite Surrogat ist: " _ ' & sur2, 0, "Zeichen aus Unicode") ' ' ****************************** ' passende Schriftart festlegen (Font): If y1 >= 65792 And y1 <= 65930 Then Font1 = InputBox("Bitte passende Schriftart wählen!", "hex. Unicode = " & Z1, "Aegean") Else If y1 >= 77824 And y1 <= 78894 Then Font1 = InputBox("Bitte passende Schriftart wählen!", "hex. Unicode = " & Z1, "Gardiner") Else ' Besser Font "Symbola" verwenden, 24. November 2014. Font1 = InputBox("Bitte passende Schriftart wählen!", "hex. Unicode = " & Z1, "Symbola") End If End If ' ' ******************************* ' Ergebnis an Stelle des Codes einfügen: Selection.Font.Name = Font1 Selection.Font.Bold = True Selection.Font.Size = 14 Selection.TypeText Text:=ChrW("&H" & sur1) & ChrW("&H" & sur2) End Sub 26 5.3 Makro zur Erzeugung eines Zeichens aus dem dezimalen Code Das folgende Makro wandelt den markierten dezimalen Zahlencode bzw. den dezimalen Zahlencode links vom Cursor in das zugehörige Unicode-Zeichen um. Im Bereich dezimal 129 bis 159 werden die Zeichen des jeweiligen Windows-Code (bei mir Windows 1252) erzeugt. Zeichen aus dem DOS-Code erzeugt das folgende Makro nicht; Eine Unterscheidung zwischen Dezimalcodes mit einer Null davor und ohne Null davor wie bei WindowsComputern wird hier nicht gemacht. 18 Das folgende Makro ist meines Erachtens auch noch in Word 2010 bequemer als das Eintippen des Codes über den Nummernblock. Es wird erst die Zahl in den Text getippt, dann Alt + k gedrückt. Sub Dezimalcode_in_Schriftzeichen_umwandeln() ' Dipl.-Ing. H. Chris Gast, Berlin, Mai 2009 und August 2010, 16. Februar 2011, 22. November 2014. ' Makro zum Erzeugen eines Schriftzeichens aus dem Dezimalcode, ' funktioniert auch im Windows-Sonderbereich dezimal 0128 bis 0159 ' und für höhere Unicode-Ebenen. ' Aufrufen mit Alt + k ' Dim y1 As Variant, y2 As Long Dim sur1 As String, sur2 As String Dim Font1 As String Dim Abfrage As Integer ' ' y1 ist der markierte dezimale Code, ' y2 ist der um hex. 10000 (dez. 65536) verminderte dez. Unicodewert (= Zwischenschritt), ' sur1 ist der gesuchte hexadezimale Wert des High Surrogate (Surrogat 1), ' sur2 ist der gesuchte hexadezimale Wert des Low Surrogate (Surrogat 2), ' Font 1 ist die zu wählende Schriftart ' ' Wenn nichts markiert ist, links vom Cursor "Wort" markieren (dies kann bis zu 6-stellig sein): If Selection.Type <> wdSelectionNormal Then Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend End If y1 = Selection ' ' Prüfung, ob eine Zahl markiert wurde: If IsNumeric(y1) = False Then MsgBox "Markierter Wert muss eine reine dezimale Zahl sein!" Exit Sub End If ' If y1 > 1114111 Then MsgBox "Unicodewerte über hex. 10FFFF bzw. dez. 1'114'111 sind nicht zulässig." Exit Sub End If ' ' ********************* ' Fallunterscheidung: If y1 < 30 Then 18 Auf Computern mit Windows gilt zum Beispiel: Alt + (Ziffer 9) ergibt ○ (weißer Kreis), dagegen Alt + (Ziffern 0, dann 9) ergibt das Steuerzeichen "Tabulator". Meine Makros dagegen erzeugen keine DOS-Zeichen. 27 Abfrage = MsgBox("Wollen Sie ein Steuerzeichen erzeugen?", 292, "Windows-Steuerzeichen") ' Erklärung der Abfragebox: (VbYesNo = 4) + (VbQuestion = 32) + (VbDefaultButton2 = 256) If Abfrage = vbNo Then Exit Sub End If End If ' ' Fall: Hexcode zwischen D800 und DFFF: If y1 > 55295 And y1 < 57344 Then Abfrage = MsgBox("Es handelt sich um ein Surrogat, kein zulässiges Zeichen!" _ & vbCrLf & vbCrLf & "Wollen Sie dieses trotzdem erzeugen?", _ vbYesNo + vbQuestion + vbDefaultButton2, "Windows-Steuerzeichen") If Abfrage = vbNo Then Exit Sub End If ' If y1 < 65536 Then ' (Bis hex. FFFF ist UTF-16 mit dem einfachen Unicode identisch) ' If y1 > 127 And y1 < 160 Then MsgBox "Achtung, Windows-Sonderbereich!" Selection.TypeText Text:=Chr(y1) Else Selection.TypeText Text:=ChrW(y1) End If ' If y1 > 61471 And y1 < 61696 Then Font1 = InputBox("Bitte Sonderschriftart eingeben", "Achtung Sonderschrift!", "Symbol") Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend Selection.Font.Name = Font1 End If Exit Sub End If ' ' ***************************************** ' Für Schriftzeichen mit Unicode höherer Ebenen (hex.10000 bis hex.10FFFF) müssen Surrogate ' nach ISO/IEC 10646:2003, Anhang C angewendet werden. ' Für die Surrogate verwende ich die Formelzeichen "sur1" und "sur2". ' und "y2" als Zwischenwert für "Eingabewert minus hex. 00010000": ' y2 = Val("&H" & z1) - Val("&H" & "10000") y2 = y1 - 65536 ' ' Die Umrechnung von hex. D800 mittel "Val(&HD800)" führte bei hohen Werten ' zu negativen Zahlen, deshalb statt "hex.D800" besser dezimal "55296". ' Statt "Val(&HD400)" schreibe ich einfacher direkt dezimal "1024": ' ' Daraus ergeben sich als Surrogate: sur1 = Hex(Int(y2 / 1024) + 55296) sur2 = Hex(y2 - (Int(y2 / 1024) * 1024) + 56320) ' ' Anzeige = MsgBox(" Der Hexcode ist " & z1 & vbCrLf & " Der Dezimalcode1 ist: " _ ' & y1 & vbCrLf & " Das erste Surrogat ist: " & sur1 & vbCrLf & "Das zweite Surrogat ist: " _ ' & sur2, 0, "Zeichen aus Unicode") ' ' ****************************** ' passende Schriftart festlegen (Font): If y1 >= 65792 And y1 <= 65930 Then Font1 = InputBox("Bitte passende Schriftart wählen!", "Dez. Unicode = " & y1, "Aegean") Else If y1 >= 77824 And y1 <= 78894 Then Font1 = InputBox("Bitte passende Schriftart wählen!", "Dez. Unicode = " & y1, "Gardiner") Else ' besser "Symbola" vorschlagen, 22. November 2014. 28 Font1 = InputBox("Bitte passende Schriftart wählen!", "Dez. Unicode = " & y1, "Symbola") End If End If ' ' ******************************* ' Ergebnis an Stelle des Codes einfügen: Selection.Font.Name = Font1 Selection.Font.Bold = True Selection.Font.Size = 14 Selection.TypeText Text:=ChrW("&H" & sur1) & ChrW("&H" & sur2) End Sub 29 6 Makro zur Analyse von Schriftzeichen, auch von Zeichen höherer Unicode-Ebenen und Sonderzeichen 6.1 Die einzelnen Probleme und Lösungen 6.1.1 Unicode-Zeichen höherer Ebenen Zeichen aus höheren Unicode-Ebenen können im Word 2000 mit den vorhandenen Funktionen nicht analysiert werden. Deshalb wollte ich dafür ein Makro schreiben. Diese Zeichen werden in Word (Windows) mittels zwei Surrogate nach ISO/IEC 10646:2003, Anhang C dargestellt, das Windows mit UTF-16 arbeitet. Dabei sind im Unicode-Bereich hex. D800 bis hex. DBFF das obere Surrogat (in Schreibrichtung gesehen das erste Zeichen) und im Bereich hex. DC00 bis hex. DFFF das untere Surrogat (rechts davon). Nur wenn beide Surrogate vorhanden sind und richtig angeordnet, ergibt sich ein zulässiges Unicode-Zeichen höherer Ebenen. Das folgende Makro (siehe Abschnitt 6.3) erkennt, ob ein zulässiges Surrogatpaar vorliegt und berechnet daraus auch die Unicodes höherer Ebenen 19. Nachdem die zwei UTF-16-Surrogate ermittelt sind, muss daraus der gesuchte Unicode wie folgt nach ISO 10646 berechnet werden: Auszug aus ISO 10646:2003, Anhang C: Ich verwende im Makro statt x und y die Formelzeichen z1 und z2 für die Surrogate. Weil das Rechnen bei meinen Makros meist nur mit dezimalen Zahlen funktioniert, rechnete ich vorher die Konstanten um, siehe die folgende Tabelle: Tabelle 6.1: Hexwerte umgerechnet in Dezimalwerte: Hexadezimal 0020 0400 D8 00 DC 00 1 00 00 Dezimal 32 1024 55 296 56 320 65 536 Die obige Gleichung nach ISO 10646:2003, Anhang C als VBA-Makro: y(1) = Val("&H" & z(1) & "&") y(2) = Val("&H" & z(2) & "&") y(0) = ((y(1) - 55296) * 1024) + (y(2) - 56320) + 65536 z(0) = Hex(y(0)) MsgBox "Der Unicode des Zeichens höherer Ebene ist: " & z(0) &" !" 19 30 seit Sonntag, 13. Juni 2010. Bei Unicodes höherer Ebenen war für mich überraschenderweise nicht die Umrechnung der Surrogate nach der ISO-Norm das Problem, sondern das genaue Auffinden der beiden Surrogate im Text bei Word 2003. Mehrere Makro-Ansätze funktionierten in Word 2000, aber nicht in Word 2003. Ein anderer Ansatz funktionierte in Word 2003, aber nicht in Word 2000 20. Schließlich blieben nur die beiden Analyse-Varianten: a) mit der Mid-Funktion: x(i) = Mid(Selection, i, 1) b) die Zerlegung des markierten Bereichs in einzelne Ranges Set Rg(i) = Selection.Range Rg(i).SetRange Start:=Rg(i).Start + i - 1, End:=Rg(i).Start + i Nur diese erkannten sowohl in Word 2000 als auch in Word 2003 gleicher-maßen die einzelnen Surrogate richtig. Nachdem das Makro schließlich sowohl in Word 2000 als auch in Word 2003 lief, funktionierten die beiden Varianten auch problemlos unter Word 2007 21. Da aber bei der Mid-Funktion die Windows-Sonderschriftarten (siehe 6.1.5) nur sicher erkannt werden, wenn sie an erster Stelle der Zeichenkette (String) stehen, wählte ich die Variante mit der Zerteilung in Ranges, obwohl dieses wiederum Probleme bei Steuerzeichen für Tabellen und Felder macht. 6.1.2 Probleme mit hohen Zahlen beim VBA-Datentyp "Integer" Probleme gab es auch bei der Funktion der Code-Ermittlung mit "AscW(Zeichen)". Da der Code in VBA als Datentyp "Integer" ausgegeben wird, der nur bis 32 767 positive Zahlenwerte ermöglicht, waren einige "Verrenkungen" in der Programmierung nötig. Ich ermittelte zuerst die hexadezimalen Werte mit "Hex(AscW(Zeichen)" und dann mit der ValFunktion wie in 5.1 die dezimalen Werte. Bei der Angabe des Dezimalcodes im Bereich 128 bis 255 fügte ich in der Ergebnis-Anzeige eine voranzustellende Null ein, die man davorsetzen muss, wenn man unter Windows den Dezimalcode mit Alt + Zahlenwert auf der Nummerntastatur eingibt, damit Windows nicht den alten DOS-Code statt des WindowsCodes verwendet. 6.1.3 Erkennen von kombinierenden diakritischen Zeichen Ferner gibt es Kombinierende Zeichen, die mit dem Buchstaben davor optisch verschmelzen, hauptsächlich kombinierende diakritische Zeichen (en: COMBINING DIACRITICAL MARKS) aus dem Unicode-Bereich hex. 0300 bis hex. 036F. Weitere kombinierende Zeichen siehe ISO/IEC 10646:2003, Anhang B 22. Das folgende Makro kann bei der "AutofokusFunktion" bis zu vier diakritische Zeichen feststellen, und auch, wenn diese mit einem Schriftzeichen der Windows-Sonderschriftart Symbol kombiniert sind. So ist sichergestellt, dass von einem Buchstaben mit diakritischen Zeichen letztere vollständig mit-analysiert werden. 20 21 22 Der Trim-Befehl zerstörte mir Surrogate, der Move- und der Next-Befehl übersprangen in Word 2003 die Einzelbytes (die Surrogate), eine anderer Befehl funktionierte dafür zwar in Word 2003, aber nicht in Word 2000, usw., bis ich als Lösung die Mid-Funktion fand, die sich in beiden Word-Versionen auch bei Surrogaten gleichartig verhielt. Die Tests mit Word 2007 erfolgten in einem Copyshop, da ich dieses nicht habe. (Inzwischen stellte sich heraus, dass das fertige Analyse-Programm auch problemlos unter Word 2010 läuft). Inzwischen Version ISO/IEC 10646:2012, Anhang B. 31 6.1.4 Sonderzeichen in der Messagebox Ein weiteres Problem ist die Ergebnisanzeige in einer Messagebox. Die MsgBox-Funktion von Word ist nicht Unicode-tauglich. Teilweise wurden fehlerhaft "a" statt "α" und "d" statt "δ" angezeigt, während das kleine Beta wiederum richtig aussah. Um trotzdem die einzelnen Zeichen erklären zu können, verwendete ich eine API-Funktion, nämlich die MessageBoxW von Windows, wobei mit der Funktion StrPtr (Stringpointer) nur die Speicheradresse des Strings "MsgBoxAnzeige" übergeben wird, was verhindert, dass sonst der Unicode beschnitten wird und fehlerhafte Anzeigen erfolgen [15]. Am Anfang des Makromoduls (vor der ersten Prozedur) muss allerdings der Aufruf der MessageBoxW deklariert werden. Damit ist das Makro allerdings nur in Windows-Umgebung lauffähig, und da auch in der MessageBoxW nur die Systemschrift von Windows verwendet werden kann, sind auch weiterhin nicht alle Zeichen anzeigbar. Hier half nur die Ausgabe als separates WordDokument, die ich in meiner Messagebox in der letzten Zeile unter der Anklickvariante "Ja" anbiete, siehe folgendes Beispiel für die Analyse einer ägyptischen Hieroglyphe. Bild 6.1: Screenshot des Ergebnisses des Analyse-Makros in einer erweiterten Messagebox und in einer "separate Datei" In der Ergebnisanzeige verzichtete ich bei der Angabe der einzelnen Zeichen auf Anführungszeichen, weil sonst einige kombinierenden Zeichen oder Schriftzeichen mit Strichen nicht immer eindeutig lesbar sind. 32 6.1.5 Probleme mit den Windows-Sonderschriftarten Das größte Problem stellten bei der Erstellung des Analyse-Makros die Zeichen der Windows-Sonderschriftarten wie Symbol und Wingdings dar. Für Zeichen der WindowsSonderschriftarten funktionieren nämlich die normalen Regeln der Zeichencodebestimmung mit den Befehlen "Asc(Zeichen)" bzw. "AscW(Zeichen)" und der Schriftartbestimmung mit "Selection.Font.Name" nicht, wenn diese über "Einfügen → Symbol" eingegeben worden waren. Word setzt nämlich im Quelltext an dieser Stelle dann eine "Runde Klammer links" (englisch: "LEFT PARENTHESIS"): αβχ (Buchstaben in Symbol-Schrift umgewandelt) αβχ (über Einfügen → Symbol → Schriftart Symbol) → Analyse funktionierte richtig. → Analyse ergab fälschlich "(". Hier hilft lediglich die folgende Analyse-Methode mit einem "Dialog": If x(i) = "(" Or x(i) Like "[" & ChrW(61472) & "-" & ChrW(61695) & "]" Then Rg(i).Select With Dialogs(wdDialogInsertSymbol) f1 = .Font Zeichennummer1 = .CharNum End With Diese Abfrage mit dem "Dialog" funktioniert allerdings nur bei Einzelzeichen-Analyse beziehungsweise nur beim ersten Zeichen einer Zeichenkette. Deshalb konnte ich mit einem einfachen Analyse-Makro nicht weiterarbeiten, sondern musste die Markierung in Ranges mit einzelnen Zeichen zerlegen. Windows-Sonderzeichen sind nicht in den Unicode-Tabellen der ISO 10646 enthalten. Ihre Codes liegen im dem frei verfügbaren "PUA"-Bereich (PUA = "Private Use Area"). Für die beiden häufigsten Windows-Sonderschriftarten "Symbol" und "Wingdings" ergänzte ich spezielle Unterfunktionen, die diese Zeichen mit ihrer Bedeutung und, soweit vorhanden, mit den Unicode-Entsprechungen enthalten. Details dazu finden sich unter [27]. Ein Problem kann sich in seltenen Fällen ergeben, wenn die Umwandlung normaler Buchstaben in Symbol-Zeichen nicht korrekt erfolgte. Wird einem Zeichen mit einem Code größer als dezimal 255 nachträglich die Schriftart "Symbol" zugeordnet, werden für dessen Anzeige auf dem Bildschirm manchmal nur die letzten zwei hexadezimale Stellen des Codes berücksichtig. Aus dem Ohmzeichen "Ω" (Unicode hex. 2126) wird dann zum Beispiel fälschlich "&", während die Computer-interne Codierung der Code für Ohmzeichen bleibt! Ob der hexadezimale Code nun "26", "126", "226", "426", "1026" oder richtig "F026" lautet ("&", "Ħ", "Ȧ" usw.), das Zeichen wird bei Wechsel in die Schriftart "Symbol" optisch immer zum "Ampersand"! 6.1.6 Probleme mit Steuerzeichen für Feldfunktionen und für Tabellen Am problematischsten waren (abgesehen von den Windows-Sonderschriften) die Steuerzeichen für Tabellen- und Feldfunktionen von Word. Diese können zwar mit der Funktion "Mid(Selection, i, 1)" gut ermittelt werden, führen aber bei der Zerlegung des markierten Textes in Ranges zu Problemen. Der Befehl zur Windows-Sonderzeichen-Erkennung führt bei diesen Steuerzeichen zum Absturz des Makros. Deshalb musste ich die Steuerzeichen für Feldfunktionen vorher separat ermitteln und vor der eigentlichen Analyse aus dem zu analysierenden Bereich entfernen. 33 a) Bei sichtbarem Feldcode wird die Markierung auf die Zeichen innerhalb des Feldes beschränkt (bei mehreren Feldern auf den Feldcode des ersten Feldes). b) Bei Tabellen bzw. Tabellenausschnitte werden die markierten Tabellenfelder in einer separaten (nicht sichtbaren) Datei in Text umgewandelt. Anschließend wird dieser Text so aufbereitet, dass er dem Quelltext der markierten Tabellenfelder entsprechen würde. Hierbei stellt sich die Frage, ob auch bei Tabellenausschnitten das doppelte TabellenfeldSteuerzeichen ChrW(7) am Ende der Tabellen-Reihe angezeigt werden sollte, oder nur dann, wenn die ganze Tabellen-Reihe markiert war. Ich entschied mich, Tabellenfelder in der Markierung wie eine selbstständige Tabelle zu analysieren. Ferner wird bei der Analyse eines Strings eine etwas abweichende Codierung ermittelt (nämlich 13 + 7) als im Quelltext (nur "7"). Mein fertiges Analyse-Makro orientiert sich am Quelltext und gibt nur den Code "7" an. c) Bei nichtsichtbarem Feldcode wird der markierte Text in einer separaten Datei untersucht, wobei erst die Feldcode-Ansicht für die Anzeige im Ergebnis in einer Zeichenkette 23 gespeichert wird, dann werden die Feldfunktionen aufgehoben (Selection.Fields.Unlink) und das Feldergebnis analysiert. Unbekannte Schriftzeichen befinden sich nie im Feldcode, sondern stets nur im Feldergebnis. Sollte wider Erwarten doch noch der Feldcode analysiert werden, kann man das Ergebnis als Datei ausgeben lassen und dort mit demselben Analysemakro die Zeile mit der Feldcode-Ansicht analysieren, z. B. " REF _Ref293239865 \h ". d) Bei durch-Feldfunktion geschützten-Sonderzeichen, bei denen der Unlink-Befehl nicht funktioniert, musste ich die Word-Feldfunktion für die Analyse durch das Makro erst aufwendig nachbilden, und für sonstige Funktionen, bei denen der Unlink-Befehl nicht funktioniert wie bei der Overstrike-Funktion, durch Kopieren und Inhalte-Einfügen die Feldfunktionen beseitigen. Die folgende Tabelle zeigt eine Übersicht verschiedener Feldfunktionen. Tabelle 6.1: Beispiele für Feldfunktionen (1 von 2) Art des Feldes Feldergebnis Seitenzahl 34 PAGE - 1 - Speicherdatum 6. January 2017 SAVEDATE \@ "d. MMMM yyyy" 13. April 2012 Index-Eintrag (ist ausgeblendet) { XE "Sonderzeichen" } (ist ausgeblendet) XE "Sonderzeichen" Unsichtbare Titel für das Inhaltsverzeichnis (ist ausgeblendet) {TC "Überschrift Ebene 3" \l 3} (ist ausgeblendet) TC "Überschrift Ebene 3" \l 3 Overstrike-Feld _ d eq \o (d;_) 23 34 Feldcode (Screenshots) Quelltext in Word 2000 Achtung: Windows-Sonderschriftarten sind in dieser Ergebniszeile nicht erkennbar. Tabelle 6.1 (2 von 2) Geschütztes Sonderzeichen Ω SYMBOL 61527 \f "Symbol" \s 10W Querverweis auf einen Abschnitt Siehe Abschnitt 5.2 Siehe Abschnitt REF _Ref261203182 \r \h \* MERGEFORMAT 5.2 Querverweis auf Überschrift mit Sonderzeichen Siehe Testüberschrift Farbmarkierung ω Siehe Testübersch rift EF _Ref3220 83838 \h Farbm a r k i e r u n g wð = Steuerzeichen 19 = Steuerzeichen 20 = Steuerzeichen 21 = Steuerzeichen 1 Der Quelltext der eingefügten Screenshots: EMBED MSPhotoEd.3 Der Querverweis auf eine Überschrift mit Sonderzeichen lautet im Quelltext bei Word 2010: Siehe Testüberschrift REF _Ref322083838 \h Farbmarkierung w Hier ist der Unterschied zwischen Word 2000 und Word 2010 (im "Kompatibilitätsmodus") gut zu sehen. Sobald ein Zeichen der Sonderschriftarten Symbol oder Wingdings in der Datei vorkommt, werden im Quelltext zwischen alle normalen Unicode-kompatiblen Zeichen im gesamten Dokument je ein Leerzeichen gesetzt, und nur beim Zeichen der Sonderschriftart "Symbol" das Zeichen "ð". 6.1.7 Ermittlung der (englischen) Namen der Unicode-Schriftzeichen In der wahlweisen Anzeige des Ergebnisses in einer separaten Datei wird auch der englische Name des Zeichens aus einer umfangreichen Unicode-Liste "UnicodeData.txt" [1] angezeigt, sofern das Zeichen als Unicode-Zeichen genormt ist. Bei Symbol-Zeichen wird das entsprechende Unicode-Zeichen angegeben. Chinesische, japanische und ein Teil der koreanischen Unicode-Zeichen sind in dieser Liste nicht aufgeführt. In meinem Makro wird stattdessen auf die jeweilige Quelle im Internet verwiesen, die nur als recht große Pdf-Dateien vorliegen. Deshalb habe ich hier auf ein automatisches Nachschlagen verzichtet. Die Textdatei mit der Unicode-Liste habe ich in der Dokumentvorlage "Unicode-Makroskompakt.dot" mit den Makros integriert (siehe [2]), da der Aufruf der Liste im Internet mir zuviel Rechenzeit kostet (ich habe keinen allzu-schnellen Internetzugang). Nur wenn sich das Makro sich nicht in dieser Dokumentvorlage befindet und die Datei "UnicodeData.txt" auch nicht auf dem Computer im Ordner mit den Dokumentvorlagen und auch nicht im Ordner "Word\STARTUP" befindet, wird im Internet nachgesehen. Zuhause mit nicht sehr schnellem Internetzugang und Word 2000 braucht das Makro zur Zeichenanalyse mit direktem Internetzugriff beim ersten Aufruf nach dem Löschen aller temporären Dateien je nach Qualität der Internetverbindung über 10 Sekunden und bei Folgeaufrufen 3 bis 5 Sekunden. Beim Zugriff auf die Kopie der Unicode-Liste auf der Festplatte (also ohne Internet) dauert der Zugriff dagegen lediglich zwischen 0,8 und 1,2 Sekunden. 24 24 Als Test für die Rechenzeit-Messung wählte ich ein Zeichen der (höheren) Unicode-Ebene 1 mit kombinierendem Akzent. 35 Im Büro mit schnellerem Internetzugang dauerte der Internetzugriff beim ersten Mal etwa 6 bis 7 Sekunden, bei Folgezugriffen war der Internetzugriff nur unwesentlich langsamer als der Zugriff auf die Kopie der Unicode-Liste auf der Festplatte (0,62 bis 0,75 Sekunden gegenüber 0,44 bis 0,47 Sekunden). Im Copyshop mit Word 2007 dauert das Makro beim ersten Internetzugriff etwas über 10 Sekunden und Folgezugriffe etwa 1 Sekunde. Ob ich dort auf dem fremden Computer die Unicode-Liste auf der Festplatte speichern könnte, probierte ich nicht aus. Der Nachteil der eingebetteten Unicode-Liste ist, dass ich sie bei Erweiterungen oder Korrekturen, die alle paar Jahre erfolgen, in die Dokumentvorlage neu einarbeiten muss. 25 6.1.8 Weitere Steuerzeichen von Word Word verwendet nicht nur für Feldfunktionen und für Tabellen, sondern auch für Absatzmarken, Feste Leerzeichen, Geschützte Bindestriche, Bedingte Trennstriche, Tabulatoren usw. Steuerzeichen im Codebereich von (dezimal) 01 bis 31. Diese werden vom Makro problemlos analysiert. In der Ergebnis-Anzeige habe ich einige davon zur besseren Verständlichkeit durch ihre deutsche Beschreibung ersetzt. Weitere WordSteuerzeichen wie etwa das für Fußnotenzeichen finden sich unter [5]. Zu dem mit Tabellenfeld-Steuerzeichen und Feld-Steuerzeichen siehe oben 6.1.6. 6.1.9 Grafiken, Textfelder, Zeichnungen und ähnliches im Tex Wenn Bilder oder Formeleditor-Objekte in der Markierung enthalten sind, erscheint in der Analyse der Code "01". Wenn ein Grafik-Anker markiert ist, wird dies vorab durch die Abfrage des Markiertyps abgefangen ("Selection.Type"). Für die seltenen Fällen, in denen ein Grafik-Anker, ein Zeichenobjekt ("Autoform") oder die Linien eines Textfeldes ("Textbox") in der Markierung enthalten sind, stürzte das Makro ab. Es stellte sich heraus, dass die störenden Objekte alle "Shapes" waren, während "Frames" und "InlineShapes" die Analyse nicht behinderten. Will man trotz enthaltener "Shapes" den Text analysieren, muss man die markierte Stelle mitsamt diesen "Shapes" in eine Zwischendatei kopieren und alle "Shapes löschen": Dim i As Integer For i = ActiveDocument.Shapes.Count To 1 Step -1 ActiveDocument.Shapes(i).Delete Next i Dabei ging allerdings der Inhalt von Textfeldern verloren. Dies umgeht das Makro durch die Umwandlung von Textfeldern (Textbox) in Textrahmen (Frame). Shapes, die frei positionierte Bilder sind, lassen sich in InlineShapes umwandeln (normale Bilder in der Zeile). Dies bringt aber für die Analyse nichts. Deshalb werden sie in der Zwischendatei wie auch die AutoShapes gelöscht. 25 36 Für zukünftige Nutzer: Dokumentvorlage "Unicode-Makros-kompakt.dot" derart umbenennen, dass das Wort "kompakt" darin nicht mehr vorkommt, und die Datei "UnicodeData.txt" [1] in Ordner mit den Dokumentvorlagen speichern. Die Abfrage If Selection.Range.ShapeRange.Count > 0 Then brachte einen Absturz in Word 2000 (aber nicht in Word 2010), wenn die Markierung in einer Fußnote oder in einem Textfeld ist. Dort sind keine Shapes zulässig. Deshalb wird im Analysemakro jetzt (seit Oktober 2012) auf die Abfrage verzichtet und dafür immer eine Zwischendatei verwendet. Dies kostet keine nennenswert Rechenzeit. 6.1.10 Problem des Öffnens einer Datei mit Makros per Makro (letzte Änderung des Makros im Mai 2015) In Word 2010 ließ sich die Datei mit den Unicodelisten nach einem Computerabsturz im Mai 2015 (nach mehreren Jahren problemlosen Funktionierens) nicht mehr per VBA öffnen. Stattdessen stürzte Word jedes Mal ab. Offenbar reagiert da eine neue Schutzeinstellung, so dass Dateien mit Makros nicht mehr von Makros geöffnet werden können. Abhilfe: Es wird im Analyse-Makro für das Auslesen der Unicode-Liste nicht mehr die Original-Dokumentvorlage mit den Makros geöffnet, sondern es wird aus der Dokumentvorlage eine neue Datei erzeugt, die ebenfalls die Unicode-Liste enthält, aber nicht mehr die Makros. Mittels des Befehls "WordBasic.DisableAutoMacros 1" dauert die Rechenzeit nur wenig länger als in der bisherigen Version. Ohne diesen würde mein AutoNew-Makro unnötige Zeit beanspruchen, da es bei jeder neuen Datei einen Briefkopf mit Datum und Wochentagsangabe bzw. Feiertagsmeldung erzeugt. 37 6.2 Funktionsablauf des Analyse-Makro 38 6.3 Das fertige Makro zur Analyse von Schrift- und Sonderzeichen, auch von Windows-Sonderzeichen, von höheren Unicode-Ebenen und von Schriftzeichen mit kombinierenden diakritischen Zeichen ' Modul "Unicode_Analyse" ' Dipl.-Ing. Hanna-Chris Gast, Berlin (c) 2010, 2011, 2012, Stand 2015. ' ' ' ' Ausführliche Beschreibung unter: http://www.siebener-kurier.de/chris-aufsaetze/Unicode_Word-Makros.pdf Download des Makros unter: http://www.siebener-kurier.de/chris-aufsaetze/Unicode-Makros.zip Option Explicit ' Die folgende Funktions-Deklaration für eine erweiterte Messagebox ' muss vor dem ersten Makro des Moduls eingefügt werden: Private Declare Function MessageBoxW Lib "user32.dll" (ByVal hwnd As Long, _ ByVal lpText As Long, ByVal lpCaption As Long, ByVal uType As Long) As Long ' ******************************************************************************** Sub Hexcode_und_Name_ermitteln() ' Erstellt von Dipl.-Ing. Hanna-Chris Gast, 2010, 2011, 2012, 2014, ' Mai, August, September, November 2015, 17. Dezember 2015, 14. Juni 2016. ' Funktioniert in Word 2000 bis Word 2010 sowie unter Windows XP und Windows 7. ' Wenn im Namen der Datei mit diesem Makro das Wort "kompakt" enthalten ist, ' wird für die (englischen) Namen der Zeichen die Unicode-Liste in dieser Datei gesucht, ' ansonsten wird nach der Textdatei "UnicodeData.txt" gesucht, notfalls im Internet. ' ' Dieses Makro ermittelt die Schriftart und die Unicode-Werte eines markierten Zeichens oder ' einer markierten Zeichenfolge, aber auch die Schriftart und den Code der beiden ' Sonderschriftarten "Symbol" und "Wingdings". Bei diesen werden, soweit vorhanden, ' die entsprechenden Unicodezeichen mit (englischen) Namen angegeben. ' ' Das Analyse-Ergebnis wird bei bis zu 40 Zeichen in einer Messagebox ausgegeben, kann aber ' auch in eine separate Datei ausgegeben werden. Bei über 40 Zeichen wird das Ergebnis direkt ' in einer separaten Datei ausgegeben. In der separaten Datei mit dem Ergebnisprotokoll werden ' auch die jeweiligen (englischen) Namen der Unicode-Zeichen nach ISO/IEC 10646 angegeben, ' außer bei Steuerzeichen ("Control"). ' ' Bei Feldern im Word-Text wird nur noch das Feldergebnis analysiert. In der Feldcode-Ansicht ' befinden sich im Feld keine unbekannten Schriftzeichen. ' ' Bei Textmarken in der Markierung werden diese ebenfalls aufgelistet (ergänzt November 2012). ' ' Dieses Makro kann seit 2011 auch in Tabellen mehrere Tabellen-Zellen auf einmal analysieren ' Dieses Makro analysiert auch Felder (seit Herbst 2011 auch bei Double-Strike). ' ' In Word 2010 gehen bei "Selection.Paste" manchmal die Absatz-Schriftart verloren, ' und Leerzeichen werden nicht zwischen Absatzmarken eingefügt. Dies wird gesondert abgefangen ' (ergänzt 2014). ' ' Bei nicht erkennbaren Sonderschriftarten wird die Bedeutung von Symbol angezeigt, weil dies die ' wahrscheinlichste Sonderschriftart ist (20. Mai 2015). ' ' Bei Zeichen, deren Font durch Feldcode geschützt ist, muss das Zeichen auch ermittelt werden ' können, wenn der Code hexadezimal ist (25. bis 27. November 2014). 39 ' ' ' ' ' ' ' ' ' ' ' Wenn nur Bilder ohne weiteren Text markiert sind, werden einige Makrozeilen übersprungen (13. August 2015). Wenn nicht-analysierbare OMML-Formeln vorhanden sind, wird die Ausgabe der Analyse in einer Messagebox übersprungen und bei der Ausgabe als Datei der OMML-Quelltext an den Protokoll-Text angehängt. Dieser kann dann ggf. im einem zweiten Arbeitsgang analysiert werden. Gewähltes Tastenkürzel: AltGr + C. ***************** Dim x() As String ' x(i) ist das zu analysierende Zeichen Dim Y() As String ' z(i) der Hexcode Dim Z() As String ' y(i) der Dezimalcode Dim f() As String ' f(i) die jeweilige Schriftart (Font) Dim Rg() As Range ' Rg(i) ist der Range des jeweiligen Zeichens Dim fs As String Dim Feldsteuerzeichen As Boolean Dim zL As String, zR As String Dim Ergebnis1 As String ' Feldcode-Ansicht Dim Ergebnis2 As String ' Analyse-Ergebnis Dim i As Integer Dim j As Integer Dim N As Integer Dim k1 As Integer Dim k2 As Integer Dim strFontname Dim Zeichennummer1 As Integer ' bei Sonderschriftarten Dim rng0 As Range ' Rng0 ist der zu analysierende Bereich. Dim rng1 As Range Dim Rng2 As Range Dim MsgBoxAnzeige As String Dim IntAbfrage As Integer Dim Windowssonderschrift() As Boolean Dim Pfad1 As String Dim Unicodeliste1 As String Dim Pos1 As Integer Dim Pos2 As Integer Dim doc1 As Word.Document ' die Datei mit den zu analysierenden Zeichen Dim doc2 As Word.Document ' temporäre Zwischendatei Dim aTable As Table Dim Unsichtbares_zeigen As Boolean Dim Shape_Meldung As String: Shape_Meldung = "" Dim B_Leerzeichen As Boolean: B_Leerzeichen = False Dim B_Font As Boolean: B_Font = False Dim DokListe As Word.Document Dim Int_OMML As Integer Dim IntKompatibilität As Integer Dim zDatei As String: zDatei = "" Dim strPath As String Dim IntFigures As Integer Dim TM As Bookmark Dim Textmarkenliste As String ' ********************************** ' "Ausgeblendete" Zeichen sichtbar machen, wenn sie unsichtbar sind: If ActiveWindow.View.ShowAll = False Then Unsichtbares_zeigen = True ActiveWindow.View.ShowAll = True End If ' ' Wenn der Cursor am Textanfang steht und nichts markiert ist: If Selection.Range.End = 0 Then 40 ' ' ' ' ' MsgBox "Bitte Zeichen markieren, der Cursor steht vor dem Text " _ & "oder es ist kein Text vorhanden!" Exit Sub End If ' Art der Markierung prüfen: If Selection.Type < 2 Then ' Wenn nichts markiert ist, 1 Zeichen links vom Cursor markieren: Set rng0 = Selection.Range rng0.SetRange Start:=rng0.End - 1, End:=rng0.End rng0.Select ElseIf Selection.Type = 8 Then '' MsgBox "Es ist eine frei positionierte Grafik oder deren Ankerpunkt markiert." ''Exit Sub N=1 Set rng0 = Selection.Range GoTo Zeile_Shape_oder_InlineShape ElseIf Selection.Type = 7 Then '' MsgBox "Es ist Grafik oder eine Formel (InlineShape) markiert." ''Exit Sub N=1 Set rng0 = Selection.Range GoTo Zeile_Shape_oder_InlineShape End If ' *********************** ' Fehlerbehandlung: On Error GoTo Zeile_Abbruch_weil_kein_Schriftzeichen ' ***********************' ' Maximale Länge der Zeichenkette wird begrenzt. N = Len(Selection) If N > 120 Then ' Bei größer 44 Zeilen ist keine Messagebox mehr möglich, aber bei über 100 Zeilen ' wird auch die Ausgabe in eine Datei zu unübersichtlich. Theoretisch ist hier keine Grenze. MsgBox "Maximal 120 Zeichen markieren! Es sind hier " & N & " Zeichen markiert." Exit Sub End If ********************************************************************* "Autofokus" wegen kombinierenden diakritischen Zeichen und Zeichen höherer Unicode-Ebenen: ********************************************************************* ' a) Markierung um kombinierende diakritische Zeichen erweitern ' (Unicode-Zeichen von hex. 0300 bis hex. 036F., bzw. dezimal von 768 bis 879): ' a1) Wenn nur das kombinierende diakritische Zeichen (oder eines von bis zu vier) markiert ist: For i = 1 To 4 zL = Hex(AscW(Left(Selection, 1))) If Val("&H" & zL & "&") > 767 And Val("&H" & zL & "&") < 880 Then Set rng0 = Selection.Range Set Rng2 = rng0 Rng2.SetRange Start:=Rng2.Start - 1, End:=Rng2.End zL = Hex(AscW(Left(Rng2, 1))) ' Zeichen links davon gehört dazu. Rng2.Select Else Exit For End If Next i ' a2) Wenn rechts von der Markierung eins bis vier kombinierende diakritische Zeichen stehen: Set rng0 = Selection.Range Set Rng2 = rng0 For i = 1 To 4 Rng2.SetRange Start:=Rng2.Start, End:=Rng2.End + 1 zR = Hex(AscW(Right(Rng2, 1))) 41 If Val("&H" & zR & "&") > 767 And Val("&H" & zR & "&") < 880 Then Rng2.Select Else Exit For End If Next i ' b) Wenn Surrogate für Unicode-Zeichen höherer Ebenen vorhanden sind: ' b1) Markierung nach rechts erweitern, wenn nur das linke Surrogat vorhanden ist: zR = Hex(AscW(Right(Selection, 1))) If Val("&H" & zR & "&") > 55295 And Val("&H" & zR & "&") < 56320 Then Set rng0 = Selection.Range Set Rng2 = rng0 Rng2.SetRange Start:=Rng2.Start, End:=Rng2.End + 1 ' Nur wenn das neue Zeichen das gesuchte rechte Surrogat ist, Markierung erweitern: zR = Hex(AscW(Right(Rng2, 1))) If Val("&H" & zR & "&") > 56319 And Val("&H" & zR & "&") < 57344 Then Rng2.Select End If End If ' b2) Markierung nach links erweitern, wenn nur das rechte Surrogat vorhanden ist: zL = Hex(AscW(Left(Selection, 1))) If Val("&H" & zL & "&") > 56319 And Val("&H" & zL & "&") < 57344 Then Set rng0 = Selection.Range Set Rng2 = rng0 Rng2.SetRange Start:=Rng2.Start - 1, End:=Rng2.End ' Nur wenn das neue Zeichen das gesuchte linke Surrogat ist, Markierung erweitern: zL = Hex(AscW(Left(Rng2, 1))) If Val("&H" & zL & "&") > 55295 And Val("&H" & zL & "&") < 56320 Then Rng2.Select End If End If ' ******* ' Durch "Autofokus" veränderte Länge des markierten Bereichs: N = Len(Selection) Set rng0 = Selection.Range ' ****************************************************************** Zeile_Shape_oder_InlineShape: ' Wenn die Markierung sichtbaren Feldcode mit den Feldsteuerzeichen enthält, ' Feldcode-Ansicht abschalten. Feldsteuerzeichen = False Ergebnis1 = "" ' Text, der später ggf. den Feldcode enthalten soll. If InStr(Selection, ChrW(19)) > 0 And InStr(Selection, ChrW(21)) > 0 _ And Selection.Fields.Count > 0 Then ActiveWindow.View.ShowFieldCodes = False N = Len(Selection) End If ' **************************************************************************** ' Bei der Analyse von Einzel-Ranges machen folgende Elemente Probleme: ' a) Shapes (Textfelder oder Zeichenobjekte), ' b) Tabellensteuerzeichen und ' c) Feldfunktionen (Feld-Steuerzeichen). ' Eine Beseitigung dieser Elemente in der Originaldatei und Verwendung von "Undo" ist zu ' nach der Analyse riskant. Deshalb erfolgt in einer Zwischendatei ("doc2") die Umwandlung ' von Shapes in Frames bzw. deren Löschung, der Umwandlung des markierten Tabellenbereichs ' in Text und schließlich die Beseitigung von Feldfunktionen im zu analysierenden Text. ' ************************************************* ' Fehlerbehandlung: Beim Befehl "Selection.Copy" ' Ergänzung März 2012, wegen Absturz des "Copy-Befehl" bei Tabellenreihen-Endmarke: '' If Len(Selection) <= 2 Then ' macht Probleme bei Seitenzahl in Positionsrahmen. '' If Selection = Chr(13) & Chr(7) Then ' macht Problem bei Feldfunktion in Tabelle. If rng0.Text = Chr(13) & Chr(7) Then MsgBox "Es ist nur das Tabellen-Steuerzeichen (Code = 7) markiert." 42 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Exit Sub End If '***************** On Error Resume Next Selection.Copy If Err <> 0 Then MsgBox "Die Markierung enthält keinen (kopierfähigen) analysierbaren Inhalt!" Exit Sub End If *********************************************** In Word 2010 wird die Absatzschriftart unzulänglich übertragen, und einzelne Leerzeichen werden nicht mehr vor Absatzmarken eingefügt (2. Juni 2014): If Selection.Text = " " Then B_Leerzeichen = True If Selection.Font.Name <> "" Then B_Font = True If Err.Number > 0 Then B_Font = False Err.Clear End If On Error GoTo Zeile_Abbruch_weil_kein_Schriftzeichen Selection.CopyFormat ********************************************************************* September 2015. Bei Dok1 bestimmen, ob OMML-Formeln oder Bilder vorhanden sind: IntFigures = Selection.Range.InlineShapes.Count If Val(Application.Version) >= 13 Then ' Nur wenn die Word-Version Word 2010 oder höher ist, ' OMML-Formeln Formeln zählen: IntKompatibilität = Fkt_Kompatibitaet Int_OMML = Fkt_OMML_zählen If Int_OMML > 0 Then ' Pfad der Ausgangsdatei: strPath = ActiveDocument.Path If Right(strPath, 1) <> "\" Then strPath = strPath & "\" End If Else ' Wordversion bis Word 2003: Int_OMML = 0 IntKompatibilität = 11 End If ********************************************************************* Zwischendatei "doc2" erzeugen und dort die zu untersuchende Zeichenkette einfügen: ********************************************************************* Set doc1 = ActiveDocument ' (vorhandene Datei) '' B_Zwischendatei = True Application.ScreenUpdating = False ' Zwischendatei soll unsichtbar bleiben. ' Automakros abstellen, damit neue Datei sich schneller öffnet: WordBasic.DisableAutoMacros 1 ' = Disables auto-macros Set doc2 = Documents.Add ' DocumentType:=wdNewBlankDocument ggf. Briefkopf entfernen Selection.WholeStory Selection.Delete 14. Juni 2016: Ggf. Textmarken aus der Dokumentvorlage entfernen: For Each tm In ActiveDocument.Bookmarks tm.Delete Next tm ****************************************************************** September 2015: Bei Dateien mit OMML-Formeln die Zwischendatei im nicht-kompatiblen Modus (14) speichern, um OMML-Formel analysieren zu können, aber im nicht-kompatiblen Modus lassen sich verknüpfte Bildpfade nicht erkennen, bei Kompatibilität > 11 werden Bilder 43 ' ' ' ' ' ' ' ' ' ' fälschlich nur als '/' analysiert!" Abhilfe: Bei Anwesenheit von Bildern im kompatiblen Modus (11) speichern und auf die Analyse der OMML-Formeln verzichten. *** Damit das Makro auch unter Word 2000 läuft, erfolgt das Speichern in einer Unterprozedur: If IntKompatibilität > 11 Then If IntFigures > 0 Then ' Zwischendatei im Kompatiblen Modus (11) speichern, um Bild-Verknüpfungspfade ' zu analysieren: Call SpeichernX(strPath & "zzz_Temp.docx", 11) zDatei = doc2.FullName If Int_OMML > 0 Then MsgBox "Um Bildpfade zu erkennen, wurde auf die Analyse von OMML-Formeln verzichtet." End If Else ' Zwischendatei im nicht-kompatiblen Modus (14) speichern, um ggf. OMML-Formeln ' zu analyieren: Call SpeichernX(strPath & "zzz_Temp.docx", 14) zDatei = doc2.FullName End If Else ' Zwischendatei doc2 nicht speichern (Wordversion bis Word 2003 oder kompatible Datei). End If ********************************************** In Word 2010 Absatzschriftart und Einzel-Leerzeichen ggf. separat übertragen: Selection.WholeStory If B_Leerzeichen = True Then Selection.TypeText Text:=" " Else Selection.Paste End If Selection.WholeStory If B_Font = True Then Selection.PasteFormat End If ********************************************** Selection.WholeStory Selection.Range.HighlightColorIndex = wdNoHighlight Selection.Font.Color = wdColorAutomatic ******************************************** Beseitigung von Shapes in der Zwischendatei: If doc2.Shapes.Count > 0 Then j = ActiveDocument.Shapes.Count If j = 0 Then '' MsgBox "Die Markierung enthält keine Textfelder oder Zeichenobjekte (Shapes)." ElseIf j = 1 Then Shape_Meldung = "Die Markierung enthält" _ & " ein Textfeld oder Zeichenobjekt (Shape)." & vbCrLf & vbCrLf Else Shape_Meldung = "Die Markierung enthält " & j _ & " Textfelder und/ oder Zeichenobjekte (Shapes)." & vbCrLf & vbCrLf End If ' *** ' Rückwärts umwandeln bzw. löschen, weil sonst alle anderen Shapes umnummeriert würden: ' (was dann zum Absturz des Makros führen würde): For i = j To 1 Step -1 If ActiveDocument.Shapes(i).Type = msoTextBox Then ' Typ 17 ' Textfelder (Textbox) umwandeln in Textrahmen(Frame). ActiveDocument.Shapes(i).ConvertToFrame Else ' AutoForm, Zeichnungsobjekt oder sonstige Grafik (Shape). ActiveDocument.Shapes(i).Delete 44 End If Next i ' *** End If ' Alle Shapes in der Markierung sind jetzt beseitigt. ' ***************************************************************** ' Tabellenbeseitigung in der Zwischendatei (doc2): ' Vor der Umwandlung der Tabellen in Text alle Tabellen gelb markieren: For Each aTable In Selection.Tables aTable.Range.HighlightColorIndex = wdYellow Next aTable ' ' Echte Absatzmarken in Tabellen vorübergehend beseitigen: Selection.Find.ClearFormatting Selection.Find.Highlight = True Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^p" .Replacement.Text = "<!p!>" .Replacement.Font.Color = wdColorRed .Wrap = wdFindContinue ' (ergänzt 29.7.2013) .Forward = True .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' ' Umwandlung der Tabellen in Text (ggf. mehrere kleine Tabellen): For Each aTable In Selection.Tables aTable.Rows.ConvertToText Separator:=ChrW(7) ' Tabellenfeld-Steuerzeichen. Next aTable Selection.WholeStory ' ' Absatzmarken in Tabellenzeilenschluss in doppeltes Tabellenfeldsteuerzeichen umwandeln: ' (dies entspricht dem Quellcode einer Tabelle in Word 2000 bis Word 2003): Selection.Find.ClearFormatting Selection.Find.Highlight = True Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^p" .Replacement.Text = ChrW(7) & ChrW(7) .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' ' Absatzmarken innerhalb Tabellenfeldern wiederherstellen: Selection.Find.ClearFormatting Selection.Find.Highlight = True With Selection.Find .Text = "<!p!>" .Font.Color = wdColorRed 45 ' ' ' ' .Replacement.Text = "^p" .Forward = True .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' ' Durch das Umwandeln einer Tabelle in Text änderte sich die Zahl der markierten Zeichen: N = Len(Selection) ************************************************************************************** Feldfunktionen bei markierten Feldergebnissen in Zwischendatei beseitigen: ************************************************************************************** Solange nur Feldergebnis sichtbar, werden Steuerzeichen von Feldern nicht gefunden: Application.ScreenUpdating = False Selection.Fields.ToggleShowCodes If InStr(Selection, ChrW(19)) > 0 And InStr(Selection, ChrW(21)) > 0 _ And Selection.Fields.Count > 0 Then ' Feldfunktion vorübergehend beseitigen, aber Feldfunktion speichern: Feldsteuerzeichen = True Ergebnis1 = Selection ' String mit Feldcode-Ansicht '''''''''' 26.11.2012 Ergebnis1 = Replace(Ergebnis1, ChrW(19), "{") Ergebnis1 = Replace(Ergebnis1, ChrW(21), "}") ' *************************** ' Durch Felder geschützte Formelzeichen für Analyse vorübergehend beseitigen (31. März 2011) ' wie zum Beispiel {SYMBOL 87 \f "Symbol" \s 10} oder {SYMBOL 937 \f "Arial" \s 10 \u}: If InStr(Selection, ChrW(19) & "SYMBOL") > 0 _ Or InStr(Selection, ChrW(19) & " SYMBOL") > 0 Then Ergebnis1 = "Die Markierung enthält Feldfunktionen " _ & "(dezimale Codes 19 und 21, " _ & "hier als geschweifte Klammern angezeigt) " _ & "mit einem oder mehreren geschützten Sonderzeichen;" _ & vbCrLf & vbCrLf & "Feldcode-Ansicht: " _ & vbCrLf & Ergebnis1 & vbCrLf & vbCrLf _ & "Die Zeichenanalyse ergibt:" & vbCrLf With Selection.Find .ClearFormatting .Text = "^19Symbol" .Forward = True .Wrap = wdFindContinue ' es wird sonst nur ein Zeichen ersetzt! .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False Do While .Execute ' solange etwas gefunden wird If InStr(Selection, "\f ") > 0 Then ''''''''''''''' k1 = InStr(Selection, "\f ") + 3 ' Anfang des Schriftarts-Namen k2 = InStr(Selection, ChrW(21)) ' Ende des Feldes strFontname = Mid(Selection, k1, k2 - k1) If InStr(strFontname, "\") > 0 Then _ strFontname = Mid(strFontname, 1, InStr(strFontname, "\") - 1) strFontname = Trim(strFontname) ' If InStr(Selection, "0x") = 0 Then ' Dezimalcode: 46 Selection.Font.Name = strFontname Selection.Text = ChrW(Val(Mid(Selection, InStr(3, Selection, " ")))) Else ' Hexadezimaler Code (muss ohne "0x" eingefügt werden!): k1 = InStr(Selection, "0x") + 2 ' Anfang des reinen Hexwertes k2 = InStr(Selection, "\") ' Ende des Zeichencodes ' Selection.Text = ChrW(Val("&H" & '((reiner_Hexwert))' & "&")) Selection.Text = ChrW(Val("&H" & Mid(Selection, k1, k2 - k1) & "&")) Selection.Font.Name = strFontname End If End If Loop End With ' Falls zwischen Feldanfang und dem Wort "Symbol" ein Leerzeichen ist: With Selection.Find .ClearFormatting .Text = "^19 Symbol" .Forward = True .Wrap = wdFindContinue ' es wird sonst nur ein Zeichen ersetzt! .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False Do While .Execute ' solange etwas gefunden wird If InStr(Selection, "\f ") > 0 Then k1 = InStr(Selection, "\f ") + 3 ' Anfang des Schriftarts-Namen k2 = InStr(Selection, ChrW(21)) ' Ende des Feldes strFontname = Mid(Selection, k1, k2 - k1) If InStr(strFontname, "\") > 0 Then _ strFontname = Mid(strFontname, 1, InStr(strFontname, "\") - 1) strFontname = Trim(strFontname) ' If InStr(Selection, "0x") = 0 Then ' Dezimalcode: Selection.Font.Name = strFontname Selection.Text = ChrW(Val(Mid(Selection, InStr(3, Selection, " ")))) Else ' Hexadezimaler Code (muss ohne "0x" eingefügt werden!): k1 = InStr(Selection, "0x") + 2 ' Anfang des reinen Hexwertes k2 = InStr(Selection, "\") ' Ende des Zeichencodes ' Selection.Text = ChrW(Val("&H" & '((reiner_Hexwert))' & "&")) Selection.Text = ChrW(Val("&H" & Mid(Selection, k1, k2 - k1) & "&")) Selection.Font.Name = strFontname End If End If Loop End With Else Ergebnis1 = "Die Markierung enthält Feldfunktionen " _ & "(dezimale Codes 19 und 21, " _ & "hier als geschweifte Klammern angezeigt); " _ & vbCrLf & vbCrLf & "Feldcode-Ansicht: " & vbCrLf & Ergebnis1 _ & vbCrLf & vbCrLf & "Die Zeichenanalyse ergibt:" & vbCrLf End If ' *********************************** '' Else ' keine Feld oder keine Feldsteuerzeichen in der Markierung: '' rng0.Select ' macht Ärger bei Tabellenzellen untereinander! 18. 12.2014. End If Selection.Fields.ToggleShowCodes ' ******************************* 47 ' Markierung in Zwischendatei "doc2" um letzte Absatzmarke verkürzen: Selection.WholeStory Set rng0 = Selection.Range rng0.SetRange Start:=rng0.Start, End:=rng0.End - 1 rng0.Select ' ***************** Application.ScreenUpdating = True If Feldsteuerzeichen = True Then Selection.Fields.Unlink End If ' ***************************************************************** ' Bei dem Befehl "Overstrike" funktioniert der obige Unlink-Befehl nicht. ' Beseitigung durch Kopieren und als Inhalt wieder einfügen (ergänzt 2. November 2011): If Selection.Fields.Count > 0 Then Dim F0 As Field Dim RngX As Range Set RngX = Selection.Range For Each F0 In RngX.Fields F0.Select Selection.Copy Selection.PasteSpecial Link:=False, DataType:=wdPasteText, _ Placement:=wdInLine, DisplayAsIcon:=False Next F0 Selection.WholeStory Selection.MoveEnd Unit:=wdCharacter, Count:=-1 End If ' ****************************************************************** ' Analyse des markierten Bereichs (die eigentliche Zeichenanalyse) ' ****************************************************************** N = Len(Selection) ReDim Rg(N) ReDim x(N) ReDim Y(N) ReDim Z(N) ReDim f(N) ReDim Windowssonderschrift(N) ' Bestimmung der Schriftart des markierten Bereichs "f(0)": f(0) = Selection.Font.Name ' Wenn die Schriftart-Anzeige leer ist, ist sie unterschiedlich: If f(0) = "" Then f(0) = "unterschiedlich" End If ' Dim RgN As Range ' Markierung in der Zwischendatei Set RgN = Selection.Range ' For i = 1 To N Windowssonderschrift(i) = False Set Rg(i) = Selection.Range '' Rg(i).SetRange Start:=Rg(i).Start + i - 1, End:=Rg(i).Start + i Rg(i).SetRange Start:=RgN.Start + i - 1, End:=RgN.Start + i ''Rg(i).Select f(i) = Rg(i).Font.Name x(i) = Rg(i).Text ' y(i) = AscW(x(i)) ' Ergibt negative Zahlen bei x(i) > 32'767! ' z(i) = Hex(y(i)) ' Da bei VBA das Integerformat nur bis + 32767 reicht, muss durch einen Umweg ' für den Dezimalcode (y) der Typ "Long" erzwungen werden. Z(i) = Hex(AscW(x(i))) Y(i) = Val("&H" & Z(i) & "&") ' Der Hexadezimale Unicode wird in der Regel vierstellig angegeben: Select Case Len(Z(i)) 48 Case Is = 3 Z(i) = "0" & Z(i) Case Is = 2 Z(i) = "00" & Z(i) Case Is = 1 Z(i) = "000" & Z(i) End Select ' ************* ' Fallunterscheidung: ' Steuerzeichen sollen im Ergebnis erklärt, aber nicht dargestellt werden: If Y(i) <= 32 Then Select Case Y(i) Case 32 x(i) = """Leerzeichen""" Case 31 x(i) = """Bedingter Trennstrich""" Case 30 x(i) = """Geschützter Bindestrich""" Case 13 x(i) = """Absatzzeichen""" Case 11 x(i) = """manueller Zeilenumbruch""" Case 12 x(i) = """Abschnittswechsel/Seitenumbruch""" Case 14 x(i) = """Spaltenumbruch""" Case 9 x(i) = """Tabulator""" Case 1 x(i) = """Steuerzeichen für Bild oder Formeleditor-Objekt""" Case 7 x(i) = """Tabellenfeld-Steuerzeichen""" Case Else x(i) = """Steuerzeichen""" End Select ' Bei Windows-Sonderschriften gelten völlig andere Regeln: ElseIf x(i) = "(" Or x(i) Like "[" & ChrW(61472) & "-" & ChrW(61695) & "]" Then Rg(i).Select With Dialogs(wdDialogInsertSymbol) fs = .Font Zeichennummer1 = .charNum End With '' If fs <> "(normaler Text)" And fs <> "" Then '' If Zeichennummer1 < 0 Then If fs <> "(normaler Text)" And fs <> "" _ Or Zeichennummer1 <> 40 And x(i) = "(" Then ' Or Zeichennummer1 < 0 And x(i) = "(" Then Windowssonderschrift(i) = True If fs = "(normaler Text)" Or fs = "" Then fs = "???" f(i) = fs If Zeichennummer1 < 0 Then Y(i) = (Zeichennummer1 + 4096 + 61440) x(i) = ChrW(Zeichennummer1 + 4096 + 61440) Else Y(i) = Zeichennummer1 + 61440 x(i) = ChrW(Zeichennummer1 + 61440) End If Z(i) = Hex(Y(i)) End If '' rng0.Select ' führte zur Markierung der Originaldatei, 19.12.2014. ' Fehlerhafte Zuweisung einer Windows-Sonderschrift: ElseIf f(i) = "Symbol" Or f(i) Like ("Wingding*") Or f(i) = "Webdings" Then 49 ' ' ' ' ' ' ' ' f(i) = f(i) & "???" x(i) = "???" ' einige weitere nicht-Unicode-kompatible Sonderschriftarten: ElseIf f(i) = "BSsymb9" Or f(i) = "BeuthPi2" Then x(i) = "Sonderschriftzeichen" End If ' *** If f(i) <> f(0) Then f(0) = "unterschiedlich" Next i ************************************ Alle Textmarken in der Markierung auflisten (25.11.2012). Textmarkenliste = "Die Markierung enthält folgende Textmarken (""Bookmarks"")" & vbCrLf _ & "(der Text hinter dem Komma ist ggf. der Text der dazugehörigen Stelle):" & vbCrLf If Selection.Bookmarks.Count > 0 Then For Each TM In Selection.Bookmarks Textmarkenliste = Textmarkenliste & " " & TM.Name & ", " & TM.Range.Text & vbCrLf Next Else Textmarkenliste = "Die Markierung enthält keine Textmarken." & vbCrLf End If ************************************ Zwischendatei "doc2" wieder schließen: If Left(doc2.Name, 8) = "zzz_Temp" Then ' (Temp-Datei liegt vor) doc2.Close SaveChanges:=wdDoNotSaveChanges Kill zDatei Else doc2.Close SaveChanges:=wdDoNotSaveChanges End If Zu analysierende Datei wieder aktivieren: doc1.Activate Application.ScreenUpdating = True ************************************************** Ergebniszusammenstellung für Messagebox: ************************************************** Ergebnis2 = Shape_Meldung & Ergebnis1 & "Schriftart: " & f(0) For j = 1 To N If Y(j) > 55295 And Y(j) < 57344 Then ' Zeichen höherer Unicode-Ebene: If N > j And Y(j) > 55295 And Y(j) < 56320 Then If Y(j + 1) > 56319 And Y(j + 1) < 57344 Then ' Wenn ja, liegt Zeichen höherer Unicode-Ebene vor: ' Berechnung des Unicodes höherer Ebenen nach ISO 10646:2003, Anhang C: Y(0) = ((Y(j) - 55296) * 1024) + (Y(j + 1) - 56320) + 65536 Z(0) = Hex(Y(0)) ' z(0) ist der Unicode des gesuchten Zeichen höherer Unicode-Ebene. Ergebnis2 = Ergebnis2 & "," & vbCrLf _ & "der Unicode des Zeichens höherer Ebene ist hexadezimal: " & Z(0) _ & " und dezimal: " & Y(0) j=j+1 Else Ergebnis2 = Ergebnis2 & ", " & vbCrLf & "der Unicode von " & x(j) _ & " ist hexadezimal: " & Z(j) & " und dezimal: " & Y(j) _ & vbCrLf & " (unvollständiges Surrogat)" End If Else Ergebnis2 = Ergebnis2 & ", " & vbCrLf & "der Unicode von " & x(j) _ & " ist hexadezimal: " & Z(j) & " und dezimal: " & Y(j) _ & vbCrLf & " (unvollständiges Surrogat)" End If ElseIf Windowssonderschrift(j) = True Then ' Windows-Sonderzeichen: 50 ' ' ' ' ' ' ' '' '' '' ' ' ' ' Ergebnis2 = Ergebnis2 & ", " & vbCrLf & "der Code von " & x(j) _ & " ist hexadezimal: " & Hex(Y(j) - 61440) & "/" & Hex(Y(j)) & " und dezimal: " _ & ((Y(j) - 61440)) & "/" & Y(j) & ", Schriftart: " & f(j) If f(j) = "Symbol" Then Ergebnis2 = Ergebnis2 & "," & vbCrLf _ & " Bedeutung: " & Symbolname(Hex(Y(j) - 61440)) ElseIf f(j) = "Wingdings" Then Ergebnis2 = Ergebnis2 & "," & vbCrLf _ & " Bedeutung: " & Wingdingsname(Hex(Y(j) - 61440)) End If Else ' normales Unicode-Zeichen: ' Bei Dezimalcodes bis 255 wird bei Windows eine "0" davorgesetzt: If Y(j) < 256 Then Y(j) = "0" & Y(j) End If If Y(j) = 160 Then x(j) = """Festes Leerzeichen""" Ergebnis2 = Ergebnis2 & ", " & vbCrLf & "der Unicode von " & x(j) _ & " ist hexadezimal: " & Z(j) & " und dezimal: " & Y(j) End If Next j Ergebnis2 = Ergebnis2 & "." ****************************************************************** Nur wenn nicht mehr als 40 Zeichen, Ergebnis als Messagebox anzeigen, ansonsten direkt in die Ausgabe als Datei ( geändert 6. Oktober 2012) ***************************************************************** Beim Analyse-Ergebnis kann eine MessageBoxW maximal 44 Zeilen anzeigen (eine normale MsgBox sogar nur 16 Zeilen). Bei OMML-Formeln ist die Ausgabe als Datei günstiger: If N < 40 Then '' _ And Int_OMML = 0 ' Ergebnisanzeige in Messagebox mit Abfrage, ob Ergebnis in separater Datei gewünscht: MsgBoxAnzeige = Ergebnis2 & vbCrLf & vbCrLf _ & "Wollen Sie das Ergebnis ausführlicher in einer separaten Datei?" IntAbfrage = MessageBoxW(0, StrPtr(MsgBoxAnzeige), StrPtr("Zeichenanalyse"), _ vbYesNoCancel + vbDefaultButton2) ' Alternative einfache Funktion, wenn keine Windows-Umgebung, leider ohne Unicode: ' IntAbfrage = MsgBox(MsgBoxAnzeige, vbYesNoCancel + vbDefaultButton2, "Zeichenanalyse") ' Bei "Ja" kommt "6" heraus, bei "Nein" kommt "7" heraus, bei Abbrechen eine "2". ' If IntAbfrage <> 6 Then ' Speicher löschen und Programm beenden. GoTo Zeile_Suchverzeichnis_löschen_und_beenden End If Else MsgBox "Da insgesamt " & N & " Zeichen markiert sind, erfolgt das Ergebnis " _ & "in einer separaten Datei. Es passt nicht mehr in eine Messagbox." End If ********************************************************************** Wenn mehr als 40 Zeichen oder Abfrage = "ja" (IntAbfrage = 6), ausführlichere Ergebnisanzeige in Extra-Datei: ********************************************************************* Selection.Copy ' ********** ' Zeitmessen für die Makro-Dauer Dim Zeit1, Zeit2, Zeitdauer Zeit1 = Timer ' *********** ' Zur Bestimmung des Unicode-Namens Datei mit der Unicode-Liste öffnen: ' Das Makro braucht zum Nachschlagen des Unicode-Zeichennamens ' im Internet unter "http://unicode.org/Public/UNIDATA/UnicodeData.txt" ' (zumindest beim ersten Mal) mindestens 6 Sekunden. Von daher ist es 51 ' besser, diese Text-Datei (von Hand) vorher auf der Festplatte zu speichern. ' Dann beträgt die Dauer weniger als 1,2 Sekunden. ' Auf ein automatisches Speichern der Datei auf der Festplatte per Makro ' habe ich bewusst verzichtet. ' Daher habe ich eine Kompakt-Version erstellt, in welcher das Makro und die Text-Liste ' in einer einzigen Dokumentvorlage kombiniert sind, die ich zum Download in meiner ' Homepage unter "http://www.siebener-kurier.de/chris-aufsaetze" anbiete. ' ************ Application.StatusBar = "Bitte warten - das Makro läuft." Application.ScreenUpdating = False ' ************************************ ' Die ggf. gespeicherte Datei mit der Unicode-Liste suchen: If InStr(ThisDocument.Name, "kompakt") > 0 Then ' Die Datei mit dem Makro ist die "kompakte" Datei mit der vollständigen Unicode-Liste. ''Unicodeliste1 = ThisDocument.FullName ' Es wird hier daraus eine neue Datei erzeugt, weil Word 2010 das Öffnen der Dot-Datei ' mit Makros per VBA gelegentlich verweigerte (Schutzeinstellung). ' Die neu-erzeugte Datei enthält keine Makros, aber die vollständige Unicode-Liste. Set DokListe = _ Documents.Add(Template:=ThisDocument.FullName, NewTemplate:=False, DocumentType:=0) Else ' alternativ die Original-Textdatei suchen: If Dir(Options.DefaultFilePath(wdUserTemplatesPath) & "\UnicodeData.txt") <> "" Then Unicodeliste1 = Options.DefaultFilePath(wdUserTemplatesPath) & "\UnicodeData.txt" ElseIf Dir(Options.DefaultFilePath(wdStartupPath) & "\UnicodeData.txt") <> "" Then Unicodeliste1 = Options.DefaultFilePath(wdStartupPath) & "\UnicodeData.txt" Else ' Nicht auf der Festplatte, deshalb im Internet nachsehen: On Error GoTo Zeile_Internetzugang_fehlt Unicodeliste1 = "http://unicode.org/Public/UNIDATA/UnicodeData.txt" End If ' ******************************* ' Unicodeliste1 öffnen: Set DokListe = Documents.Open(FileName:=Unicodeliste1, _ ConfirmConversions:=False, ReadOnly:=True, AddToRecentFiles:=False, _ PasswordDocument:="", PasswordTemplate:="", Revert:=False, _ WritePasswordDocument:="", WritePasswordTemplate:="", _ Format:=wdOpenFormatAuto, Encoding:=1252) End If On Error GoTo 0 ' Zum Beschleunigung beim Suchen in der Datei "Unicodeliste1": ActiveWindow.View.Type = wdNormalView ' ************************************************************* ' Ausführlichere Ergebniszusammenstellung für Ausgabe in Datei: ' ************************************************************* Ergebnis2 = Shape_Meldung & Ergebnis1 For j = 1 To N If Y(j) > 55295 And Y(j) < 57344 Then ' Zeichen höherer Unicode-Ebene If N > j And Y(j) > 55295 And Y(j) < 56320 Then If Y(j + 1) > 56319 And Y(j + 1) < 57344 Then ' Wenn ja, liegt Zeichen höherer Unicode-Ebene vor: ' Berechnung des Unicodes höherer Ebenen nach ISO 10646:2003, Anhang C: Y(0) = ((Y(j) - 55296) * 1024) + (Y(j + 1) - 56320) + 65536 Z(0) = Hex(Y(0)) ' z(0) ist der Unicode des gesuchten Zeichen höherer Unicode-Ebene. x(j) = x(j) & x(j + 1) Ergebnis2 = Ergebnis2 _ & "Der Unicode des Zeichens höherer Ebene x(" & j _ & ") ist hexadezimal: " & Z(0) & " und dezimal: " & Y(0) & "," & Chr(11) _ & "(der Unicode des Surrogat 1 ist hexadezimal: " & Z(j) _ & " und dezimal: " & Y(j) & ", " & Chr(11) _ 52 & "der Unicode des Surrogat 2 ist hexadezimal: " & Z(j + 1) _ & " und dezimal: " & Y(j + 1) & "), " & Chr(11) _ & EnglischName(Z(0)) & ", " & Chr(11) _ & "die Schriftart ist " & f(j) & ". " & vbCrLf j=j+1 Else Ergebnis2 = Ergebnis2 & "der Unicode von x(" & j _ & ") ist hexadezimal: " & Z(j) & " und dezimal: " & Y(j) _ & Chr(11) & "(unvollständiges Surrogat)" & ". " & vbCrLf End If Else Ergebnis2 = Ergebnis2 & "Der Unicode von x(" & j _ & ") ist hexadezimal: " & Z(j) & " und dezimal: " & Y(j) _ & Chr(11) & "(unvollständiges Surrogat)" & ". " & vbCrLf End If ElseIf Windowssonderschrift(j) = True Then ' Windowssonderschriftzeichen: Ergebnis2 = Ergebnis2 & "Der Code von x(" & j _ & ") ist hexadezimal: " & Hex(Y(j) - 61440) & "/" & Hex(Y(j)) & " und dezimal: " _ & ((Y(j) - 61440)) & "/" & Y(j) & ", Schriftart: " & f(j) ' If f(j) = "Symbol" Then If f(j) = "Symbol" Or f(j) = "SymbolPS" Then Ergebnis2 = Ergebnis2 & "," & vbCrLf _ & " Bedeutung: " & Symbolname(Hex(Y(j) - 61440)) & ". " & vbCrLf ElseIf f(j) = "Wingdings" Then ' (im März 2011 neu ergänzt) Ergebnis2 = Ergebnis2 & "," & vbCrLf _ & " Bedeutung: " & Wingdingsname(Hex(Y(j) - 61440)) & ". " & vbCrLf ElseIf f(j) = "???" Then ' am Wahrscheinlichsten ist "Symbol": Ergebnis2 = Ergebnis2 & "," & vbCrLf _ & " Falls die Schriftart 'Symbol' sein sollte, ist die Bedeutung: " _ & Symbolname(Hex(Y(j) - 61440)) & ". " & vbCrLf Else Ergebnis2 = Ergebnis2 & ". " & vbCrLf End If ElseIf f(j) = "BSsymb9" Or f(j) = "BeuthPi2" Then ' Sonderschrift-Zeichen (hier eventuell weitere Sonderschriftarten aufnehmen): Ergebnis2 = Ergebnis2 & "Der Code des Sonderzeichens " _ & "ist hexadezimal: " & Z(j) & " und dezimal: " & Y(j) & ", " _ & "Schriftart:" & Chr(160) & f(j) & ". " & vbCrLf ElseIf Y(j) < 32 Then ' Steuerzeichen (ohne englischen Zeichennamen und ohne Schriftart): Ergebnis2 = Ergebnis2 & "Der Unicode von x(" & j _ & ") ist hexadezimal: " & Z(j) & " und dezimal: " & Y(j) & ". " & vbCrLf Else ' normales Unicode-Zeichen: Ergebnis2 = Ergebnis2 & "Der Unicode von x(" & j _ & ") ist hexadezimal: " & Z(j) & " und dezimal: " & Y(j) & ", " _ & "Schriftart:" & Chr(160) & f(j) & ", " & EnglischName(Z(j)) & ". " & vbCrLf End If Next j ' **************************************** ' Unicode-Liste schließen, wenn sie nicht das zu untersuchende Dokument ist: If ActiveDocument <> doc1 Then DokListe.Close SaveChanges:=False Else ActiveWindow.ActivePane.View.Type = wdPrintView End If ' **************************************** ' Anzeige in separater Datei: ' **************************************** Documents.Add DocumentType:=wdNewBlankDocument 53 '' '' '' '' '' '' '' '' '' '' '' '' ActiveWindow.View.Type = wdPrintView ' Falls in der Normal.dot schon ein Briefkopf ist mit Name und Datum, ' soll dieser ersetzt werden: Selection.WholeStory ' Absatzabstand auf Null stellen: With Selection.ParagraphFormat .Alignment = wdAlignParagraphLeft .LeftIndent = CentimetersToPoints(0.5) .FirstLineIndent = CentimetersToPoints(-0.5) .SpaceBefore = 0 .SpaceAfter = 0 .SpaceAfterAuto = False .Alignment = wdAlignParagraphLeft End With Selection.Font.Size = 11 ' If Val(Y(1)) < 30 And N < 3 Then Selection.TypeText Text:="Das markierte Zeichen bzw. die Zeichenfolge setzt sich " _ & "wie folgt zusammen:" & vbCrLf Selection.TypeText Text:=Ergebnis2 Else Selection.TypeText Text:="Das markierte Zeichen bzw. die Zeichenfolge " ' Das Zeichen muss mitsamt seiner Schriftart eingefügt werden. ' Und danach muss wieder die Ausgangsschrift usw. wiederhergestellt werden. ' Dies gelang mir über den Umweg des nachträglichen Einfügens: Set rng1 = Selection.Range Selection.TypeText Text:=vbCrLf & "besteht aus folgenden analysierbaren Zeichen:" _ & vbCrLf & vbCrLf Selection.TypeText Text:=Ergebnis2 Set Rng2 = Selection.Range rng1.Select ' ' Zu untersuchenden Text in einer neuen Zeile angeben: Selection.TypeParagraph Selection.Paste ' Hier den zu analysierenden Text einfügen. ' rng1.SetRange Start:=rng1.Start, End:=Selection.End rng1.Select Selection.Range.HighlightColorIndex = wdYellow ' ********* ' Alle Textmarken in der Markierung auflisten (25.11.2012). Textmarkenliste = "Die Markierung enthält folgende Textmarken (""Bookmarks"")" & vbCrLf _ & "(der Text hinter dem Komma ist ggf. die zugehörige Stelle):" & vbCrLf If Selection.Bookmarks.Count > 0 Then For Each TM In Selection.Bookmarks Textmarkenliste = Textmarkenliste & " " & TM.Name & ", " & TM.Range.Text & vbCrLf Next Else Textmarkenliste = "Die Markierung enthält keine Textmarken." & vbCrLf End If ' ********* ' Bei Seitenumbrüchen oder Spaltenumbrüchen auf "Normalansicht" umschalten (5.10.2012): If InStr(Selection, ChrW(12)) > 0 Or InStr(Selection, ChrW(14)) > 0 Then ActiveWindow.View.Type = wdNormalView End If ' ********* ' Wenn in "Ergebnis" Hyperlinks, diese aktivieren: Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting With Selection.Find .Text = "http://www.unicode.org/charts/PDF/U*.pdf" .Replacement.Text = "" 54 .Forward = True ' .Wrap = wdFindContinue (führt zu Endlosschleife!) .Format = True .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True Do While .Execute ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, _ Address:=Selection.Range.Text, _ SubAddress:="", ScreenTip:="", TextToDisplay:=Rng2.Text Selection.Collapse Direction:=wdCollapseEnd Loop End With Selection.EndKey Unit:=wdStory End If ' ************************** ' Die Original-Zeichen sollen in der Auswertung mitsamt ihrer Schriftart dargestellt und gelb ' markiert werden, außer wenn sie bereits durch eine Beschreibung ersetzt worden sind: For j = 1 To N Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "x(" & j & ")" .Forward = True .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False Do While .Execute If Len(x(j)) < 3 Then Selection.Font.Name = f(j) Selection.Range.HighlightColorIndex = wdYellow Selection.Font.Bold = True Selection.TypeText Text:=x(j) Else Selection.Font.Name = "Times New Roman" Selection.Range.HighlightColorIndex = wdYellow Selection.Font.Bold = True Selection.Text = x(j) End If Loop End With Next j ' ************************* Selection.EndKey Unit:=wdStory Selection.TypeParagraph ' Selection.TypeText Text:= _ "Die englischen Namen aller Unicode-Schriftzeichen sind in ISO/IEC 10646 genormt " _ & " und weitgehend in " ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, _ Address:="http://unicode.org/Public/UNIDATA/UnicodeData.txt", SubAddress:="", _ ScreenTip:="", TextToDisplay:="http://unicode.org/Public/UNIDATA/UnicodeData.txt" Selection.TypeText Text:=Chr(11) & "oder über " ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, _ Address:="http://www.unicode.org/charts", SubAddress:="", _ ScreenTip:="", TextToDisplay:="http://www.unicode.org/charts" 55 ' ' ' ' '' '' '' ' ' ' ' Selection.TypeText Text:=" zu finden." Selection.TypeParagraph ' Ergänzung 03.04.2011 Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "Times New Roman" .Replacement.Text = "Times^sNew^sRoman" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' Ergänzung 4.10.2012 Options.DefaultHighlightColorIndex = wdRed ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Highlight = True 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 Options.DefaultHighlightColorIndex = wdYellow *********************** Am Schluss die Textmarken auflisten: Selection.EndKey Unit:=wdStory Selection.TypeParagraph Selection.TypeText Text:=Textmarkenliste ********************** Formeln von Word 2010 mit OMML erwähnen: If Int_OMML > 0 Then Selection.EndKey Unit:=wdStory Selection.TypeParagraph Selection.TypeText _ Text:="Die Markierung enthält " & Int_OMML & " 'OMML'-Formeln bzw. Formelzeichen." Selection.EndKey Unit:=wdStory Selection.TypeParagraph Selection.TypeText Text:="Quelltext: " Selection.PasteSpecial DataType:=wdPasteText Selection.TypeParagraph End If ************************ Call Ueberschriften_fett ************************ Bildschirm wieder anstellen: Application.ScreenUpdating = True *************************************************** 56 ' Zeitmessen für die Makro-Dauer auf drei Stellen hinter dem Komma Zeit2 = Timer Zeitdauer = Format((Zeit2 - Zeit1), "##,##0.0") Selection.TypeParagraph Selection.TypeText Text:="Die Rechenzeit war " & Zeitdauer & " Sekunden." Selection.HomeKey Unit:=wdStory ' An den Anfang des Ergebnisses gehen. ' *************************************************** ' Zwischenspeicher aufräumen und alles zurückstellen: Zeile_Suchverzeichnis_löschen_und_beenden: ' *************************************************** ' Im Suchen/Ersetzen-Menü alles zurückstellen Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With ' Ansicht zurückstellen: If Unsichtbares_zeigen = True Then ActiveWindow.View.ShowAll = False End If ' Automakros wieder ermöglichen: WordBasic.DisableAutoMacros 0 ' Enables auto macros Exit Sub ' **************************************************** ' **************************************************** Zeile_Abbruch_weil_kein_Schriftzeichen: ' 12. August 2015 + 2. November 2015. ' Abbrechen,da keine analysierbaren Zeichen vorhanden sind, ' dazu Zwischendatei "doc2" wieder schließen: If Left(doc2.Name, 8) = "zzz_Temp" Then ' (Temp-Datei liegt vor) doc2.Close SaveChanges:=wdDoNotSaveChanges Kill zDatei Else doc2.Close SaveChanges:=wdDoNotSaveChanges End If ' Zu analysierende Datei wieder aktivieren: doc1.Activate Application.ScreenUpdating = True ' ****** MsgBox "Die Markierung enthält nur Elemente, die keine Schriftzeichen sind." _ & vbCrLf & "Bitte ändern Sie zur Schriftzeichen-Analyse den Umfang der Markierung!" Exit Sub '' Resume ' (nur für Testzwecke) Exit Sub ' *************************************************** Zeile_Internetzugang_fehlt: MsgBox "Bitte aus dem Internet die Datei " _ & """http://unicode.org/Public/UNIDATA/UnicodeData.txt""" _ & " auf der Festplatte " & vbCrLf & "unter """ & Pfad1 & """ speichern" _ & " oder wenigstens einen Internet-Zugang herstellen." End Sub ' --------------------------------------------------------------------------------------------------------- 57 Private Sub Ueberschriften_fett() ' 28. März 2014. ' Ergebnis-Zwischenüberschriften fett machen: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Font.Bold = True With Selection.Find .Text = "Feldcode-Ansicht:" .Replacement.Text = "" .Replacement.Font.Size = 12 .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceOne ' With Selection.Find .Text = "Die Zeichenanalyse ergibt:" .Replacement.Text = "" .Replacement.Font.Size = 12 .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceOne ' With Selection.Find .Text = "Die Markierung enthält folgende Textmarken" .Replacement.Text = "Die Markierung enthält folgende Textmarken" .Replacement.Font.Size = 12 .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceOne Selection.EndKey Unit:=wdStory End Sub ' --------------------------------------------------------------------------------------------------------- Private Function EnglischName(Z1 As String) As String ' Makro erstellt von Dipl.-Ing. Hanna-Chris Gast am 20. Juli 2010, Stand 3. November 2010. ' Diese Funktion sucht aus der bereits downgeloadeten und geöffneten Unicode-Liste ' http://unicode.org/Public/UNIDATA/UnicodeData.txt den englischen ' Zeichennamen heraus. 58 Dim rng1, Rng2, y1 ' ActiveDocument.Range(0, 0).Select ' Selection.Find.ClearFormatting With Selection.Find .Text = "^p" & Z1 & ";" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute ' If Selection.Find.Found = True Then ' Zeile ist gefunden, jetzt Resultat einlesen: Selection.Collapse Direction:=wdCollapseEnd Set rng1 = Selection.Range ' bis zum nächsten Semikolon suchen Selection.Find.ClearFormatting With Selection.Find .Text = ";" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Set Rng2 = Selection.Range Rng2.SetRange Start:=rng1.Start, End:=Rng2.End - 1 Rng2.Select ' Gefundene Erklärung einlesen: EnglischName = "der" & Chr(160) & "genormte" & Chr(160) & "englische" _ & Chr(160) & "Zeichenname" & Chr(160) & "ist:" & Chr(160) & Selection Else y1 = Val("&H" & Z1 & "&") Select Case y1 Case Val(&H3400&) To Val(&H4DBF&) EnglischName = "das" & Chr(160) & "Zeichen gehört zu ""CJK Ideograph Extension A""," _ & Chr(11) & "siehe http://www.unicode.org/charts/PDF/U3400.pdf" Case Val(&H4E00&) To Val(&H9FCB&) EnglischName = "das" & Chr(160) & "Zeichen ist ein ""CJK-Ideograph""," & Chr(11) _ & "siehe http://www.unicode.org/charts/PDF/U4E00.pdf" Case Val(&HAC00&) To Val(&HD7AF&) EnglischName = "das" & Chr(160) & "Zeichen ist eine ""Hangul Syllable"", " & Chr(11) _ & "siehe http://www.unicode.org/charts/PDF/UAC00.pdf" Case 57344 To 63743 EnglischName = "das" & Chr(160) & "Zeichen ist nicht genormt und gehört zur " _ & """Privat-Use-Area""" Case Val(&H20000) To Val(&H2A6DF & "&") EnglischName = "das" & Chr(160) & "Zeichen gehört zu ""CJK Ideograph Extension B""," _ & Chr(11) & "siehe http://www.unicode.org/charts/PDF/U20000.pdf" 59 Case Val(&H2A700) To Val(&H2B734 & "&") EnglischName = "das" & Chr(160) & "Zeichen gehört zu ""CJK Ideograph Extension C""," _ & Chr(11) & "siehe http://www.unicode.org/charts/PDF/U2A700.pdf" Case Else EnglischName = "das" & Chr(160) & "Zeichen ist nicht in der " _ & "Unicode-Liste enthalten" End Select End If End Function ' --------------------------------------------------------------------------------------------------------- Private Function Symbolname(Z1 As String) As String ' Dipl.-Ing. Hanna-Chris Gast, 30. August 2010, 12. März 2011, Stand 25. September 2014. ' Diese Funktion gibt die (englischen) Unicode-Namen und entsprechende Unicodes an, ' wenn der (niedrige) hexadezimale Symbol-Code eingegeben wird ' Quellen "http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/SYMBOL.TXT" und andere ' Ein paar Fehler habe ich hierbei beseitigt, zum Beispiel: Kleines Phi und Phi-Symbol ' waren vertauscht, und in einigen Fällen habe ich Ergänzungen vorgenommen. ' Select Case Z1 Case Is = "20" Symbolname = "NO-BREAK SPACE (Unicode = hex. 00A0)" Case Is = "21" Symbolname = "EXCLAMATION MARK (Unicode = hex. 0021)" Case Is = "22" Symbolname = "FOR ALL (Unicode = hex. 2200)" Case Is = "23" Symbolname = "NUMBER SIGN (Unicode = hex. 0023)" Case Is = "24" Symbolname = "THERE EXISTS (Unicode = hex. 2203)" Case Is = "25" Symbolname = "PERCENT SIGN (Unicode = hex. 0025)" Case Is = "26" Symbolname = "AMPERSAND (Unicode = hex. 0026)" Case Is = "27" Symbolname = "CONTAINS AS MEMBER (Unicode = hex. 220B)" Case Is = "28" Symbolname = "LEFT PARENTHESIS (Unicode = hex. 0028)" Case Is = "29" Symbolname = "RIGHT PARENTHESIS (Unicode = hex. 0029)" Case Is = "2A" Symbolname = "ASTERISK OPERATOR (Unicode = hex. 2217)" Case Is = "2B" Symbolname = "PLUS SIGN (Unicode = hex. 002B)" Case Is = "2C" Symbolname = "COMMA (Unicode = hex. 002C)" Case Is = "2D" Symbolname = "MINUS SIGN (Unicode = hex. 2212)" Case Is = "2E" Symbolname = "FULL STOP (Unicode = hex. 002E)" Case Is = "2F" Symbolname = "SOLIDUS (Unicode = hex. 002F)" Case Is = "30" Symbolname = "DIGIT ZERO (Unicode = hex. 0030)" Case Is = "31" Symbolname = "DIGIT ONE (Unicode = hex. 0031)" Case Is = "32" Symbolname = "DIGIT TWO (Unicode = hex. 0032)" Case Is = "33" Symbolname = "DIGIT THREE (Unicode = hex. 0033)" Case Is = "34" 60 Symbolname = "DIGIT FOUR (Unicode = hex. 0034)" Case Is = "35" Symbolname = "DIGIT FIVE (Unicode = hex. 0035)" Case Is = "36" Symbolname = "DIGIT SIX (Unicode = hex. 0036)" Case Is = "37" Symbolname = "DIGIT SEVEN (Unicode = hex. 0037)" Case Is = "38" Symbolname = "DIGIT EIGHT (Unicode = hex. 0038)" Case Is = "39" Symbolname = "DIGIT NINE (Unicode = hex. 0039)" Case Is = "3A" Symbolname = "COLON (Unicode = hex. 003A)" Case Is = "3B" Symbolname = "SEMICOLON (Unicode = hex. 003B)" Case Is = "3C" Symbolname = "LESS-THAN SIGN (Unicode = hex. 003C)" Case Is = "3D" Symbolname = "EQUALS SIGN (Unicode = hex. 003D)" Case Is = "3E" Symbolname = "GREATER-THAN SIGN (Unicode = hex. 003E)" Case Is = "3F" Symbolname = "QUESTION MARK (Unicode = hex. 003F)" Case Is = "40" Symbolname = "APPROXIMATELY EQUAL TO (Unicode = hex. 2245)" Case Is = "41" Symbolname = "GREEK CAPITAL LETTER ALPHA (Unicode = hex. 0391)" Case Is = "42" Symbolname = "GREEK CAPITAL LETTER BETA (Unicode = hex. 0392)" Case Is = "43" Symbolname = "GREEK CAPITAL LETTER CHI (Unicode = hex. 03A7)" Case Is = "44" Symbolname = "INCREMENT (Unicode = hex. 2206)" _ & vbCrLf & " oder GREEK CAPITAL LETTER DELTA (Unicode = hex. 0394)" Case Is = "45" Symbolname = "GREEK CAPITAL LETTER EPSILON (Unicode = hex. 0395)" Case Is = "46" Symbolname = "GREEK CAPITAL LETTER PHI (Unicode = hex. 03A6)" Case Is = "47" Symbolname = "GREEK CAPITAL LETTER GAMMA (Unicode = hex. 0393)" Case Is = "48" Symbolname = "GREEK CAPITAL LETTER ETA (Unicode = hex. 0397)" Case Is = "49" Symbolname = "GREEK CAPITAL LETTER IOTA (Unicode = hex. 0399)" Case Is = "4A" Symbolname = "GREEK THETA SYMBOL (Unicode = hex. 03D1)" Case Is = "4B" Symbolname = "GREEK CAPITAL LETTER KAPPA (Unicode = hex. 039A)" Case Is = "4C" Symbolname = "GREEK CAPITAL LETTER LAMDA (Unicode = hex. 039B)" Case Is = "4D" Symbolname = "GREEK CAPITAL LETTER MU (Unicode = hex. 039C)" Case Is = "4E" Symbolname = "GREEK CAPITAL LETTER NU (Unicode = hex. 039D)" Case Is = "4F" Symbolname = "GREEK CAPITAL LETTER OMICRON (Unicode = hex. 039F)" Case Is = "50" Symbolname = "GREEK CAPITAL LETTER PI (Unicode = hex. 03A0)" Case Is = "51" Symbolname = "GREEK CAPITAL LETTER THETA (Unicode = hex. 0398)" Case Is = "52" Symbolname = "GREEK CAPITAL LETTER RHO (Unicode = hex. 03A1)" 61 Case Is = "53" Symbolname = "GREEK CAPITAL LETTER SIGMA (Unicode = hex. 03A3)" Case Is = "54" Symbolname = "GREEK CAPITAL LETTER TAU (Unicode = hex. 03A4)" Case Is = "55" Symbolname = "GREEK CAPITAL LETTER UPSILON (Unicode = hex. 03A5)" Case Is = "56" Symbolname = "GREEK SMALL LETTER FINAL SIGMA (Unicode = hex. 03C2)" Case Is = "57" Symbolname = "OHM SIGN (Unicode = hex. 2126)" _ & vbCrLf & " oder GREEK CAPITAL LETTER OMEGA (Unicode = hex. 03A9)" Case Is = "58" Symbolname = "GREEK CAPITAL LETTER XI (Unicode = hex. 039E)" Case Is = "59" Symbolname = "GREEK CAPITAL LETTER PSI (Unicode = hex. 03A8)" Case Is = "5A" Symbolname = "GREEK CAPITAL LETTER ZETA (Unicode = hex. 0396)" Case Is = "5B" Symbolname = "LEFT SQUARE BRACKET (Unicode = hex. 005B)" Case Is = "5C" Symbolname = "THEREFORE (Unicode = hex. 2234)" Case Is = "5D" Symbolname = "RIGHT SQUARE BRACKET (Unicode = hex. 005D)" Case Is = "5E" Symbolname = "UP TACK (Unicode = hex. 22A5)" Case Is = "5F" Symbolname = "LOW LINE (Unicode = hex. 005F)" Case Is = "60" Symbolname = "RADICAL EXTENDER" & vbCrLf _ & " (kein Unicode-Zeichen dafür vorhanden)," & vbCrLf _ & " Ersatz-Vorschlag: MACRON (Unicode = hex. 00AF)" & vbCrLf _ & " oder COMBINING OVERLINE (Unicode = hex. 0305)" Case Is = "61" Symbolname = "GREEK SMALL LETTER ALPHA (Unicode = hex. 03B1)" Case Is = "62" Symbolname = "GREEK SMALL LETTER BETA (Unicode = hex. 03B2)" Case Is = "63" Symbolname = "GREEK SMALL LETTER CHI (Unicode = hex. 03C7)" Case Is = "64" Symbolname = "GREEK SMALL LETTER DELTA (Unicode = hex. 03B4)" Case Is = "65" Symbolname = "GREEK SMALL LETTER EPSILON (Unicode = hex. 03B5)" Case Is = "66" Symbolname = "GREEK PHI SYMBOL (Unicode = hex. 03D5)" ' (gegenüber Originallisten korrigiert) Case Is = "67" Symbolname = "GREEK SMALL LETTER GAMMA (Unicode = hex. 03B3)" Case Is = "68" Symbolname = "GREEK SMALL LETTER ETA (Unicode = hex. 03B7)" Case Is = "69" Symbolname = "GREEK SMALL LETTER IOTA (Unicode = hex. 03B9)" Case Is = "6A" Symbolname = "GREEK SMALL LETTER PHI (Unicode = hex. 03C6)" ' (gegenüber Originallisten korrigiert) Case Is = "6B" Symbolname = "GREEK SMALL LETTER KAPPA (Unicode = hex. 03BA)" Case Is = "6C" Symbolname = "GREEK SMALL LETTER LAMDA (Unicode = hex. 03BB)" Case Is = "6D" Symbolname = "MICRO SIGN (Unicode = hex. 00B5)" _ & vbCrLf & " oder GREEK SMALL LETTER MU (Unicode = hex. 03BC)" Case Is = "6E" 62 Symbolname = "GREEK SMALL LETTER NU (Unicode = hex. 03BD)" Case Is = "6F" Symbolname = "GREEK SMALL LETTER OMICRON (Unicode = hex. 03BF)" Case Is = "70" Symbolname = "GREEK SMALL LETTER PI (Unicode = hex. 03C0)" Case Is = "71" Symbolname = "GREEK SMALL LETTER THETA (Unicode = hex. 03B8)" Case Is = "72" Symbolname = "GREEK SMALL LETTER RHO (Unicode = hex. 03C1)" Case Is = "73" Symbolname = "GREEK SMALL LETTER SIGMA (Unicode = hex. 03C3)" Case Is = "74" Symbolname = "GREEK SMALL LETTER TAU (Unicode = hex. 03C4)" Case Is = "75" Symbolname = "GREEK SMALL LETTER UPSILON (Unicode = hex. 03C5)" Case Is = "76" Symbolname = "GREEK PI SYMBOL (Unicode = hex. 03D6)" Case Is = "77" Symbolname = "GREEK SMALL LETTER OMEGA (Unicode = hex. 03C9)" Case Is = "78" Symbolname = "GREEK SMALL LETTER XI (Unicode = hex. 03BE)" Case Is = "79" Symbolname = "GREEK SMALL LETTER PSI (Unicode = hex. 03C8)" Case Is = "7A" Symbolname = "GREEK SMALL LETTER ZETA (Unicode = hex. 03B6)" Case Is = "7B" Symbolname = "LEFT CURLY BRACKET (Unicode = hex. 007B)" Case Is = "7C" Symbolname = "VERTICAL LINE (Unicode = hex. 007C)" Case Is = "7D" Symbolname = "RIGHT CURLY BRACKET (Unicode = hex. 007D)" Case Is = "7E" Symbolname = "TILDE OPERATOR (Unicode = hex. 223C)" Case Is = "A0" Symbolname = "EURO SIGN (bzw. nicht definiert)(Unicode = hex. 20AC)" Case Is = "A1" Symbolname = "GREEK UPSILON WITH HOOK SYMBOL (Unicode = hex. 03D2)" Case Is = "A2" Symbolname = "PRIME (Unicode = hex. 2032)" Case Is = "A3" Symbolname = "LESS-THAN OR EQUAL TO (Unicode = hex. 2264)" Case Is = "A4" Symbolname = "FRACTION SLASH (Unicode = hex. 2044)" Case Is = "A5" Symbolname = "INFINITY (Unicode = hex. 221E)" Case Is = "A6" Symbolname = "LATIN SMALL LETTER F WITH HOOK (Unicode = hex. 0192)" Case Is = "A7" Symbolname = "BLACK CLUB SUIT (Unicode = hex. 2663)" Case Is = "A8" Symbolname = "BLACK DIAMOND SUIT (Unicode = hex. 2666)" Case Is = "A9" Symbolname = "BLACK HEART SUIT (Unicode = hex. 2665)" Case Is = "AA" Symbolname = "BLACK SPADE SUIT (Unicode = hex. 2660)" Case Is = "AB" Symbolname = "LEFT RIGHT ARROW (Unicode = hex. 2194)" Case Is = "AC" Symbolname = "LEFTWARDS ARROW (Unicode = hex. 2190)" Case Is = "AD" Symbolname = "UPWARDS ARROW (Unicode = hex. 2191)" Case Is = "AE" 63 Symbolname = "RIGHTWARDS ARROW (Unicode = hex. 2192)" Case Is = "AF" Symbolname = "DOWNWARDS ARROW (Unicode = hex. 2193)" Case Is = "B0" Symbolname = "DEGREE SIGN (Unicode = hex. 00B0)" Case Is = "B1" Symbolname = "PLUS-MINUS SIGN (Unicode = hex. 00B1)" Case Is = "B2" Symbolname = "DOUBLE PRIME (Unicode = hex. 2033)" Case Is = "B3" Symbolname = "GREATER-THAN OR EQUAL TO (Unicode = hex. 2265)" Case Is = "B4" Symbolname = "MULTIPLICATION SIGN (Unicode = hex. 00D7)" Case Is = "B5" Symbolname = "PROPORTIONAL TO (Unicode = hex. 221D)" Case Is = "B6" Symbolname = "PARTIAL DIFFERENTIAL (Unicode = hex. 2202)" Case Is = "B7" Symbolname = "BULLET (Unicode = hex. 2022)" Case Is = "B8" Symbolname = "DIVISION SIGN (Unicode = hex. 00F7)" Case Is = "B9" Symbolname = "NOT EQUAL TO (Unicode = hex. 2260)" Case Is = "BA" Symbolname = "IDENTICAL TO (Unicode = hex. 2261)" Case Is = "BB" Symbolname = "ALMOST EQUAL TO (Unicode = hex. 2248)" Case Is = "BC" Symbolname = "HORIZONTAL ELLIPSIS (Unicode = hex. 2026)" Case Is = "BD" Symbolname = "VERTICAL LINE EXTENSION (for arrows) (Unicode = hex. 23D0)" _ & vbCrLf & " möglicher Ersatz: Senkrechter Strich (Unicode = hex. 007C)" Case Is = "BE" Symbolname = "HORIZONTAL ARROW EXTENDER (Unicode = hex. 23AF)," _ & vbCrLf & " möglicher Ersatz: Geviertstrich (Unicode = hex. 2014, EM DASH)" Case Is = "BF" Symbolname = "DOWNWARDS ARROW WITH CORNER LEFTWARDS " _ & "(Unicode = hex. 21B5)" Case Is = "C0" Symbolname = "ALEF SYMBOL (Unicode = hex. 2135)" Case Is = "C1" Symbolname = "BLACK-LETTER CAPITAL I (Unicode = hex. 2111)" Case Is = "C2" Symbolname = "BLACK-LETTER CAPITAL R (Unicode = hex. 211C)" Case Is = "C3" Symbolname = "SCRIPT CAPITAL P (Unicode = hex. 2118)" Case Is = "C4" Symbolname = "CIRCLED TIMES (Unicode = hex. 2297)" Case Is = "C5" Symbolname = "CIRCLED PLUS (Unicode = hex. 2295)" Case Is = "C6" Symbolname = "EMPTY SET (Unicode = hex. 2205)," _ & vbCrLf & " meistens aber ""Durchmesser"" (Unicode = hex. 2300)" Case Is = "C7" Symbolname = "INTERSECTION (Unicode = hex. 2229)" Case Is = "C8" Symbolname = "UNION (Unicode = hex. 222A)" Case Is = "C9" Symbolname = "SUPERSET OF (Unicode = hex. 2283)" Case Is = "CA" Symbolname = "SUPERSET OF OR EQUAL TO (Unicode = hex. 2287)" Case Is = "CB" 64 Symbolname = "NOT A SUBSET OF (Unicode = hex. 2284)" Case Is = "CC" Symbolname = "SUBSET OF (Unicode = hex. 2282)" Case Is = "CD" Symbolname = "SUBSET OF OR EQUAL TO (Unicode = hex. 2286)" Case Is = "CE" Symbolname = "ELEMENT OF (Unicode = hex. 2208)" Case Is = "CF" Symbolname = "NOT AN ELEMENT OF (Unicode = hex. 2209)" Case Is = "D0" Symbolname = "ANGLE (Unicode = hex. 2220)" Case Is = "D1" Symbolname = "NABLA (Unicode = hex. 2207)" Case Is = "D2" Symbolname = "REGISTERED SIGN (Unicode = hex. 00AE) mit Serifen" Case Is = "D3" Symbolname = "COPYRIGHT SIGN (Unicode = hex. 00A9) mit Serifen" Case Is = "D4" Symbolname = "TRADE MARK SIGN (Unicode = hex. 2122) mit Serifen" Case Is = "D5" Symbolname = "N-ARY PRODUCT (Unicode = hex. 220F)" Case Is = "D6" Symbolname = "SQUARE ROOT (Unicode = hex. 221A)" Case Is = "D7" Symbolname = "DOT OPERATOR (Unicode = hex. 22C5)" Case Is = "D8" Symbolname = "NOT SIGN (Unicode = hex. 00AC)" Case Is = "D9" Symbolname = "LOGICAL AND (Unicode = hex. 2227)" Case Is = "DA" Symbolname = "LOGICAL OR (Unicode = hex. 2228)" Case Is = "DB" Symbolname = "LEFT RIGHT DOUBLE ARROW (Unicode = hex. 21D4)" Case Is = "DC" Symbolname = "LEFTWARDS DOUBLE ARROW (Unicode = hex. 21D0)" Case Is = "DD" Symbolname = "UPWARDS DOUBLE ARROW (Unicode = hex. 21D1)" Case Is = "DE" Symbolname = "RIGHTWARDS DOUBLE ARROW (Unicode = hex. 21D2)" Case Is = "DF" Symbolname = "DOWNWARDS DOUBLE ARROW (Unicode = hex. 21D3)" Case Is = "E0" Symbolname = "LOZENGE (Unicode = hex. 25CA)" Case Is = "E1" Symbolname = "LEFT-POINTING ANGLE BRACKET (Unicode = hex. 2329)" Case Is = "E2" Symbolname = "REGISTERED SIGN, (Unicode = hex. 00AE) Sans Serif" Case Is = "E3" Symbolname = "COPYRIGHT SIGN, (Unicode = hex. 00A9) Sans Serif" Case Is = "E4" Symbolname = "TRADE MARK SIGN, (Unicode = hex. 2122) Sans Serif" Case Is = "E5" Symbolname = "N-ARY SUMMATION (Unicode = hex. 2211)" Case Is = "E6" Symbolname = "LEFT PARENTHESIS UPPER HOOK (Unicode = hex. 239B)" Case Is = "E7" Symbolname = "LEFT PARENTHESIS EXTENSION (Unicode = hex. 239C)" Case Is = "E8" Symbolname = "LEFT PARENTHESIS LOWER HOOK (Unicode = hex. 239D)" Case Is = "E9" Symbolname = "LEFT SQUARE BRACKET UPPER CORNER (Unicode = hex. 23A1)" Case Is = "EA" 65 Symbolname = "LEFT SQUARE BRACKET EXTENSION (Unicode = hex. 23A2)" Case Is = "EB" Symbolname = "LEFT SQUARE BRACKET LOWER CORNER (Unicode = hex. 23A3)" Case Is = "EC" Symbolname = "LEFT CURLY BRACKET UPPER HOOK (Unicode = hex. 23A7)" Case Is = "ED" Symbolname = "LEFT CURLY BRACKET MIDDLE PIECE (Unicode = hex. 23A8)" Case Is = "EE" Symbolname = "LEFT CURLY BRACKET LOWER HOOK (Unicode = hex. 23A9)" Case Is = "EF" Symbolname = "CURLY BRACKET EXTENSION (Unicode = hex. 23AA)" Case Is = "F0" Symbolname = "(nicht definiert, bzw. Apple-Logo)" Case Is = "F1" Symbolname = "RIGHT-POINTING ANGLE BRACKET (Unicode = hex. 232A)" Case Is = "F2" Symbolname = "INTEGRAL (Unicode = hex. 222B)" Case Is = "F3" Symbolname = "TOP HALF INTEGRAL (Unicode = hex. 2320)" Case Is = "F4" Symbolname = "INTEGRAL EXTENSION (Unicode = hex. 23AE)" Case Is = "F5" Symbolname = "BOTTOM HALF INTEGRAL (Unicode = hex. 2321)" Case Is = "F6" Symbolname = "RIGHT PARENTHESIS UPPER HOOK (Unicode = hex. 239E)" Case Is = "F7" Symbolname = "RIGHT PARENTHESIS EXTENSION (Unicode = hex. 239F)" Case Is = "F8" Symbolname = "RIGHT PARENTHESIS LOWER HOOK (Unicode = hex. 23A0)" Case Is = "F9" Symbolname = "RIGHT SQUARE BRACKET UPPER CORNER (Unicode = hex. 23A4)" Case Is = "FA" Symbolname = "RIGHT SQUARE BRACKET EXTENSION (Unicode = hex. 23A5)" Case Is = "FB" Symbolname = "RIGHT SQUARE BRACKET LOWER CORNER (Unicode = hex. 23A6)" Case Is = "FC" Symbolname = "RIGHT CURLY BRACKET UPPER HOOK (Unicode = hex. 23AB)" Case Is = "FD" Symbolname = "RIGHT CURLY BRACKET MIDDLE PIECE (Unicode = hex. 23AC)" Case Is = "FE" Symbolname = "RIGHT CURLY BRACKET LOWER HOOK (Unicode = hex. 23AD)" Case Else Symbolname = "(kein Symbol-Zeichen festgelegt!)" End Select End Function ' --------------------------------------------------------------------------------------------------------- Private Function Wingdingsname(Z1 As String) As String ' Erstellt von Dipl.-Ing. Hanna-Chris Gast, 5. März 2011, 12. Oktober 2011, 19. Dezember 2014. ' Diese Funktion gibt englische Zeichenerklärung und teilweise auch entsprechende Unicodes an, ' wenn der (niedrige) hexadezimale Code eingegeben wird. ' Quelle (modifiziert): http://www.alanwood.net/demos/wingdings.html. ' ' Inzwischen (19. 12.2014) gibt es zu weiteren Wingdingszeichen entsprechende Unicode-Zeichen, ' die hier noch nicht erwähnt sind, sie sind aber in dem Makro für die Ersetzung von ' Symbol- und Wingdingszeichen im Makromodul "Symbol_Wingdings_in_Unicode" erfasst. ' Select Case Z1 Case Is = "20" Wingdingsname = "SPACE (Unicode = hex. 0020)" Case Is = "20" 66 Wingdingsname = "SPACE (Unicode = hex. 0020)" Case Is = "21" Wingdingsname = "PENCIL (Unicode = hex. 270F)" Case Is = "22" Wingdingsname = "BLACK SCISSORS (Unicode = hex. 2702)" Case Is = "23" Wingdingsname = "UPPER BLADE SCISSORS (Unicode = hex. 2701)" Case Is = "24" Wingdingsname = "EYEGLASSES (Unicode = hex. 1F453)" Case Is = "25" Wingdingsname = "BELL (Unicode = hex. 1F514)" Case Is = "26" Wingdingsname = "OPEN BOOK (Unicode = hex. 1F4D6)" Case Is = "27" Wingdingsname = " (CANDLE)" Case Is = "28" Wingdingsname = "BLACK TELEPHONE (Unicode = hex. 260E)" Case Is = "29" Wingdingsname = "TELEPHONE LOCATION SIGN (Unicode = hex. 2706)" Case Is = "2A" Wingdingsname = "ENVELOPE (Unicode = hex. 2709)" Case Is = "2B" Wingdingsname = "ENVELOPE WITH ADDRESS AND STAMP" Case Is = "2C" Wingdingsname = "CLOSED MAILBOX WITH LOWERED FLAG (Unicode = hex. 1F4EA)" Case Is = "2D" Wingdingsname = "CLOSED MAILBOX WITH RAISED FLAG (Unicode = hex. 1F4EB)" Case Is = "2E" Wingdingsname = "OPEN MAILBOX WITH RAISED FLAG (Unicode = hex. 1F4EC)" Case Is = "2F" Wingdingsname = "OPEN MAILBOX WITH LOWERED FLAG (Unicode = hex. 1F4ED)" Case Is = "30" Wingdingsname = "FILE FOLDER (Unicode = hex. 1F4C1)" Case Is = "31" Wingdingsname = "OPEN FILE FOLDER (Unicode = hex. 1F4C2)" Case Is = "32" Wingdingsname = "PAGE FACING UP (Unicode = hex. 1F4C4)" Case Is = "33" Wingdingsname = "PRINTED PAGE" Case Is = "34" Wingdingsname = "STACK OF PRINTED PAGES" Case Is = "35" Wingdingsname = "FILING CABINET" Case Is = "36" Wingdingsname = "HOURGLASS (Unicode = hex. 231B)" Case Is = "37" Wingdingsname = "KEYBOARD (Unicode = hex. 2328)" Case Is = "38" Wingdingsname = "MOUSE" Case Is = "39" Wingdingsname = "TRACKBALL" Case Is = "3A" Wingdingsname = "PERSONAL COMPUTER (Unicode = hex. 1F4BB)" Case Is = "3B" Wingdingsname = "HARD DISK" Case Is = "3C" Wingdingsname = "FLOPPY DISK (Unicode = hex. 1F4BE)" Case Is = "3D" Wingdingsname = "FLOPPY DISK" Case Is = "3E" Wingdingsname = "TAPE DRIVE (Unicode = hex. 2707)" Case Is = "3F" 67 Wingdingsname = "WRITING HAND (Unicode = hex. 270D)" Case Is = "40" Wingdingsname = "WRITING LEFT HAND" Case Is = "41" Wingdingsname = "VICTORY HAND (Unicode = hex. 270C)" Case Is = "42" Wingdingsname = "OK HAND SIGN (Unicode = hex. 1F44C)" Case Is = "43" Wingdingsname = "THUMBS UP SIGN (Unicode = hex. 1F44D)" Case Is = "44" Wingdingsname = "THUMBS DOWN SIGN (Unicode = hex. 1F44E)" Case Is = "45" Wingdingsname = "WHITE LEFT POINTING INDEX (Unicode = hex. 261C)" Case Is = "46" Wingdingsname = "WHITE RIGHT POINTING INDEX (Unicode = hex. 261E)" Case Is = "47" Wingdingsname = "WHITE UP POINTING INDEX (Unicode = hex. 261D)" Case Is = "48" Wingdingsname = "WHITE DOWN POINTING INDEX (Unicode = hex. 261F)" Case Is = "49" Wingdingsname = "OPEN HAND" Case Is = "4A" Wingdingsname = "WHITE SMILING FACE (Unicode = hex. 263A)" Case Is = "4B" Wingdingsname = "NEUTRAL FACE (Unicode = hex. 1F610)" Case Is = "4C" Wingdingsname = "WHITE FROWNING FACE (Unicode = hex. 2639)" Case Is = "4D" Wingdingsname = "BOMB (Unicode = hex. 1F4A3)" Case Is = "4E" Wingdingsname = "SKULL AND CROSSBONES (Unicode = hex. 2620)" Case Is = "4F" Wingdingsname = "WHITE FLAG (Unicode = hex. 2690)" Case Is = "50" Wingdingsname = "PENNANT ON POLE" Case Is = "51" Wingdingsname = "AIRPLANE (Unicode = hex. 2708)" Case Is = "52" Wingdingsname = "WHITE SUN WITH RAYS (Unicode = hex. 263C)" Case Is = "53" Wingdingsname = "DROPLET (Unicode = hex. 1F4A7)" Case Is = "54" Wingdingsname = "SNOWFLAKE (Unicode = hex. 2744)" Case Is = "55" Wingdingsname = "WHITE LATIN CROSS" Case Is = "56" Wingdingsname = "SHADOWED WHITE LATIN CROSS (Unicode = hex. 271E)" Case Is = "57" Wingdingsname = "CELTIC CROSS" Case Is = "58" Wingdingsname = "MALTESE CROSS (Unicode = hex. 2720)" Case Is = "59" Wingdingsname = "STAR OF DAVID (Unicode = hex. 2721)" Case Is = "5A" Wingdingsname = "STAR AND CRESCENT (Unicode = hex. 262A)" Case Is = "5B" Wingdingsname = "YIN YANG (Unicode = hex. 262F)" Case Is = "5C" Wingdingsname = "DEVANAGARI OM (Unicode = hex. 0950)" Case Is = "5D" Wingdingsname = "WHEEL OF DHARMA (Unicode = hex. 2638)" Case Is = "5E" 68 Wingdingsname = "ARIES (Unicode = hex. 2648)" Case Is = "5F" Wingdingsname = "TAURUS (Unicode = hex. 2649)" Case Is = "60" Wingdingsname = "GEMINI (Unicode = hex. 264A)" Case Is = "61" Wingdingsname = "CANCER (Unicode = hex. 264B)" Case Is = "62" Wingdingsname = "LEO (Unicode = hex. 264C)" Case Is = "63" Wingdingsname = "VIRGO (Unicode = hex. 264D)" Case Is = "64" Wingdingsname = "LIBRA (Unicode = hex. 264E)" Case Is = "65" Wingdingsname = "SCORPIO (Unicode = hex. 264F)" Case Is = "66" Wingdingsname = "SAGITTARIUS (Unicode = hex. 2650)" Case Is = "67" Wingdingsname = "CAPRICORN (Unicode = hex. 2651)" Case Is = "68" Wingdingsname = "AQUARIUS (Unicode = hex. 2652)" Case Is = "69" Wingdingsname = "PISCES (Unicode = hex. 2653)" Case Is = "6A" Wingdingsname = "AMPERSAND (lower Case) (Unicode = hex. 0026)" Case Is = "6B" Wingdingsname = "AMPERSAND (ITALIC) (Unicode = hex. 0026)" Case Is = "6C" Wingdingsname = "BLACK CIRCLE (Unicode = hex. 25CF)" Case Is = "6D" Wingdingsname = "SHADOWED WHITE CIRCLE (Unicode = hex. 274D)" Case Is = "6E" Wingdingsname = "BLACK SQUARE (Unicode = hex. 25A0)" Case Is = "6F" Wingdingsname = "WHITE SQUARE (Unicode = hex. 25A1)" Case Is = "70" Wingdingsname = "BOLD WHITE SQUARE" Case Is = "71" Wingdingsname = "LOWER RIGHT SHADOWED WHITE SQUARE (Unicode = hex. 2751)" Case Is = "72" Wingdingsname = "UPPER RIGHT SHADOWED WHITE SQUARE (Unicode = hex. 2752)" Case Is = "73" Wingdingsname = "BLACK MEDIUM LOZENGE (Unicode = hex. 2B27)" Case Is = "74" Wingdingsname = "BLACK LOZENGE (Unicode = hex. 29EB)" Case Is = "75" Wingdingsname = "BLACK DIAMOND (Unicode = hex. 25C6)" Case Is = "76" Wingdingsname = "BLACK DIAMOND MINUS WHITE X (Unicode = hex. 2756)" Case Is = "77" Wingdingsname = "BLACK MEDIUM DIAMOND (Unicode = hex. 2B25)" Case Is = "78" Wingdingsname = "X IN A RECTANGLE BOX (Unicode = hex. 2327)" Case Is = "79" Wingdingsname = "APL FUNCTIONAL SYMBOL QUAD UP CARET (Unicode = hex. 2353)" Case Is = "7A" Wingdingsname = "PLACE OF INTEREST SIGN (Unicode = hex. 2318)" Case Is = "7B" Wingdingsname = "WHITE FLORETTE (Unicode = hex. 2740)" Case Is = "7C" Wingdingsname = "BLACK FLORETTE (Unicode = hex. 273F)" Case Is = "7D" 69 Wingdingsname = "HEAVY DOUBLE TURNED COMMA QUOTATION MARK " _ & "ORNAMENT (Unicode = hex. 275D)" Case Is = "7E" Wingdingsname = "HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT " _ & "(Unicode = hex. 275E)" Case Is = "7F" Wingdingsname = "(WHITE VERTICAL RECTANGLE) (Unicode = hex. 25AF)" Case Is = "80" Wingdingsname = "CIRCLED DIGIT ZERO (Unicode = hex. 24EA)" Case Is = "81" Wingdingsname = "CIRCLED DIGIT ONE (Unicode = hex. 2460)" Case Is = "82" Wingdingsname = "CIRCLED DIGIT TWO (Unicode = hex. 2461)" Case Is = "83" Wingdingsname = "CIRCLED DIGIT THREE (Unicode = hex. 2462)" Case Is = "84" Wingdingsname = "CIRCLED DIGIT FOUR (Unicode = hex. 2463)" Case Is = "85" Wingdingsname = "CIRCLED DIGIT FIVE (Unicode = hex. 2464)" Case Is = "86" Wingdingsname = "CIRCLED DIGIT SIX (Unicode = hex. 2465)" Case Is = "87" Wingdingsname = "CIRCLED DIGIT SEVEN (Unicode = hex. 2466)" Case Is = "88" Wingdingsname = "CIRCLED DIGIT EIGHT (Unicode = hex. 2467)" Case Is = "89" Wingdingsname = "CIRCLED DIGIT NINE (Unicode = hex. 2468)" Case Is = "8A" Wingdingsname = "CIRCLED NUMBER TEN (Unicode = hex. 2469)" Case Is = "8B" Wingdingsname = "NEGATIVE CIRCLED DIGIT ZERO (Unicode = hex. 24FF)" Case Is = "8C" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT ONE (Unicode = hex. 2776)" Case Is = "8D" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT TWO (Unicode = hex. 2777)" Case Is = "8E" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT THREE (Unicode = hex. 2778)" Case Is = "8F" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT FOUR (Unicode = hex. 2779)" Case Is = "90" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT FIVE (Unicode = hex. 277A)" Case Is = "91" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT SIX (Unicode = hex. 277B)" Case Is = "92" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT SEVEN (Unicode = hex. 277C)" Case Is = "93" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT EIGHT (Unicode = hex. 277D)" Case Is = "94" Wingdingsname = "DINGBAT NEGATIVE CIRCLED DIGIT NINE (Unicode = hex. 277E)" Case Is = "95" Wingdingsname = "DINGBAT NEGATIVE CIRCLED NUMBER TEN (Unicode = hex. 277F)" Case Is = "96" Wingdingsname = "BUD AND LEAF NORTH EAST" Case Is = "97" Wingdingsname = "BUD AND LEAF NORTH WEST" Case Is = "98" Wingdingsname = "BUD AND LEAF SOUTH WEST" Case Is = "99" Wingdingsname = "BUD AND LEAF SOUTH EAST" Case Is = "9A" Wingdingsname = "BOLD VINE LEAF NORTH EAST" Case Is = "9B" 70 Wingdingsname = "BOLD VINE LEAF NORTH WEST" Case Is = "9C" Wingdingsname = "BOLD VINE LEAF SOUTH WEST" Case Is = "9D" Wingdingsname = "BOLD VINE LEAF SOUTH EAST" Case Is = "9E" Wingdingsname = "MIDDLE DOT (Unicode = hex. 00B7)" Case Is = "9F" Wingdingsname = "BULLET (Unicode = hex. 2022)" Case Is = "A0" Wingdingsname = "BLACK SMALL SQUARE (Unicode = hex. 25AA)" Case Is = "A1" Wingdingsname = "WHITE CIRCLE (Unicode = hex. 25CB)" Case Is = "A2" Wingdingsname = "BOLD WHITE CIRCLE" Case Is = "A3" Wingdingsname = "EXTRA BOLD WHITE CIRCLE" Case Is = "A4" Wingdingsname = "FISHEYE (Unicode = hex. 25C9)" Case Is = "A5" Wingdingsname = "BULLSEYE (Unicode = hex. 25CE)" Case Is = "A6" Wingdingsname = "ähnlich SHADOWED WHITE CIRCLE (Unicode = hex. 274D)" Case Is = "A7" Wingdingsname = "BLACK SMALL SQUARE 7 (Unicode = hex. 25AA)" Case Is = "A8" Wingdingsname = "WHITE MEDIUM SQUARE (Unicode = hex. 25FB)" Case Is = "A9" Wingdingsname = "BLACK THREE POINTED STAR" Case Is = "AA" Wingdingsname = "BLACK FOUR POINTED STAR (Unicode = hex. 2726)" Case Is = "AB" Wingdingsname = "BLACK STAR (Unicode = hex. 2605)" Case Is = "AC" Wingdingsname = "SIX POINTED BLACK STAR (Unicode = hex. 2736)" Case Is = "AD" Wingdingsname = "EIGHT POINTED BLACK STAR (Unicode = hex. 2734)" Case Is = "AE" Wingdingsname = "TWELVE POINTED BLACK STAR (Unicode = hex. 2739)" Case Is = "AF" Wingdingsname = "EIGHT POINTED PINWHEEL STAR (Unicode = hex. 2735)" Case Is = "B0" Wingdingsname = "SQUARE REGISTER MARK" Case Is = "B1" Wingdingsname = "POSITION INDICATOR (Unicode = hex. 2316)" Case Is = "B2" Wingdingsname = "WHITE CONCAVE-SIDED DIAMOND (Unicode = hex. 27E1)" Case Is = "B3" Wingdingsname = "SQUARE LOZENGE (Unicode = hex. 2311)" Case Is = "B4" Wingdingsname = "QUESTION MARK IN WHITE DIAMOND" Case Is = "B5" Wingdingsname = "CIRCLED WHITE STAR (Unicode = hex. 272A)" Case Is = "B6" Wingdingsname = "SHADOWED WHITE STAR (Unicode = hex. 2730)" Case Is = "B7" Wingdingsname = "CLOCK FACE ONE O CLOCK (Unicode = hex. 1F550)" Case Is = "B8" Wingdingsname = "CLOCK FACE TWO O CLOCK (Unicode = hex. 1F551)" Case Is = "B9" Wingdingsname = "CLOCK FACE THREE O CLOCK (Unicode = hex. 1F552)" Case Is = "BA" 71 Wingdingsname = "CLOCK FACE FOUR O CLOCK (Unicode = hex. 1F553)" Case Is = "BB" Wingdingsname = "CLOCK FACE FIVE O CLOCK (Unicode = hex. 1F554)" Case Is = "BC" Wingdingsname = "CLOCK FACE SIX O CLOCK (Unicode = hex. 1F555)" Case Is = "BD" Wingdingsname = "CLOCK FACE SEVEN O CLOCK (Unicode = hex. 1F556)" Case Is = "BE" Wingdingsname = "CLOCK FACE EIGHT O CLOCK (Unicode = hex. 1F557)" Case Is = "BF" Wingdingsname = "CLOCK FACE NINE O CLOCK (Unicode = hex. 1F558)" Case Is = "C0" Wingdingsname = "CLOCK FACE TEN O CLOCK (Unicode = hex. 1F559)" Case Is = "C1" Wingdingsname = "CLOCK FACE ELEVEN O CLOCK (Unicode = hex. 1F55A)" Case Is = "C2" Wingdingsname = "CLOCK FACE TWELVE O CLOCK (Unicode = hex. 1F55B)" Case Is = "C3" Wingdingsname = "(WHITE ARROW POINTING DOWNWARDS THEN CURVING " _ & "LEFTWARDS" Case Is = "C4" Wingdingsname = "WHITE ARROW POINTING DOWNWARDS THEN CURVING " _ & "RIGHTWARDS" Case Is = "C5" Wingdingsname = "WHITE ARROW POINTING UPWARDS THEN CURVING " _ & "LEFTWARDS" Case Is = "C6" Wingdingsname = "WHITE ARROW POINTING UPWARDS THEN CURVING " _ & "RIGHTWARDS" Case Is = "C7" Wingdingsname = "WHITE ARROW POINTING LEFTWARDS THEN CURVING " _ & "UPWARDS" Case Is = "C8" Wingdingsname = "WHITE ARROW POINTING RIGHTWARDS THEN CURVING " _ & "UPWARDS" Case Is = "C9" Wingdingsname = "WHITE ARROW POINTING LEFTWARDS THEN CURVING " _ & "DOWNWARDS" Case Is = "CA" Wingdingsname = "WHITE ARROW POINTING RIGHTWARDS THEN CURVING " _ & "DOWNWARDS" Case Is = "CB" Wingdingsname = "QUILT SQUARE 2" Case Is = "CC" Wingdingsname = "BLACK QUILT SQUARE 2" Case Is = "CD" Wingdingsname = "LEAF COUNTERCLOCKWISE SOUTH WEST" Case Is = "CE" Wingdingsname = "LEAF COUNTERCLOCKWISE NORTH WEST" Case Is = "CF" Wingdingsname = "LEAF COUNTERCLOCKWISE SOUTH EAST" Case Is = "D0" Wingdingsname = "LEAF COUNTERCLOCKWISE NORTH EAST" Case Is = "D1" Wingdingsname = "LEAF NORTH WEST" Case Is = "D2" Wingdingsname = "LEAF SOUTH WEST" Case Is = "D3" Wingdingsname = "LEAF NORTH EAST" Case Is = "D4" Wingdingsname = "LEAF SOUTH EAST" Case Is = "D5" 72 Wingdingsname = "ERASE TO THE LEFT (Unicode = hex. 232B)" Case Is = "D6" Wingdingsname = "ERASE TO THE RIGHT (Unicode = hex. 2326)" Case Is = "D7" Wingdingsname = "THREE-D TOP-LIGHTED LEFTWARDS ARROWHEAD" Case Is = "D8" Wingdingsname = "THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD " _ & "(Unicode = hex. 27A2)" Case Is = "D9" Wingdingsname = "THREE-D RIGHT-LIGHTED UPWARDS ARROWHEAD " _ &"" Case Is = "DA" Wingdingsname = "THREE-D LEFT-LIGHTED DOWNWARDS ARROWHEAD " _ &"" Case Is = "DB" Wingdingsname = "CIRCLED HEAVY WHITE LEFTWARDS ARROW" Case Is = "DC" Wingdingsname = "CIRCLED HEAVY WHITE RIGHTWARDS ARROW " _ & "(Unicode = hex. 27B2)" Case Is = "DD" Wingdingsname = "CIRCLED HEAVY WHITE UPWARDS ARROW" Case Is = "DE" Wingdingsname = "CIRCLED HEAVY WHITE DOWNWARDS ARROW" Case Is = "DF" Wingdingsname = "WIDE-HEADED LEFTWARDS ARROW" Case Is = "E0" Wingdingsname = "WIDE-HEADED RIGHTWARDS ARROW" Case Is = "E1" Wingdingsname = "WIDE-HEADED UPWARDS ARROW" Case Is = "E2" Wingdingsname = "WIDE-HEADED DOWNWARDS ARROW" Case Is = "E3" Wingdingsname = "WIDE-HEADED NORTH WEST ARROW" Case Is = "E4" Wingdingsname = "WIDE-HEADED NORTH EAST ARROW" Case Is = "E5" Wingdingsname = "WIDE-HEADED SOUTH WEST ARROW" Case Is = "E6" Wingdingsname = "WIDE-HEADED SOUTH EAST ARROW" Case Is = "E7" Wingdingsname = "HEAVY WIDE-HEADED LEFTWARDS ARROW" Case Is = "E8" Wingdingsname = "HEAVY WIDE-HEADED RIGHTWARDS ARROW (Unicode = hex. 2794)" Case Is = "E9" Wingdingsname = "HEAVY WIDE-HEADED UPWARDS ARROW" Case Is = "EA" Wingdingsname = "HEAVY WIDE-HEADED DOWNWARDS ARROW" Case Is = "EB" Wingdingsname = "HEAVY WIDE-HEADED NORTH WEST ARROW" Case Is = "EC" Wingdingsname = "HEAVY WIDE-HEADED NORTH EAST ARROW" Case Is = "ED" Wingdingsname = "HEAVY WIDE-HEADED SOUTH WEST ARROW" Case Is = "EE" Wingdingsname = "HEAVY WIDE-HEADED SOUTH EAST ARROW" Case Is = "EF" Wingdingsname = "LEFTWARDS WHITE ARROW (Unicode = hex. 21E6)" Case Is = "F0" Wingdingsname = "RIGHTWARDS WHITE ARROW (Unicode = hex. 21E8)" Case Is = "F1" Wingdingsname = "UPWARDS WHITE ARROW (Unicode = hex. 21E7)" Case Is = "F2" 73 Wingdingsname = "DOWNWARDS WHITE ARROW (Unicode = hex. 21E9)" Case Is = "F3" Wingdingsname = "LEFT RIGHT WHITE ARROW (Unicode = hex. 2B04)" Case Is = "F4" Wingdingsname = "UP DOWN WHITE ARROW (Unicode = hex. 21F3)" Case Is = "F5" Wingdingsname = "NORTH WEST WHITE ARROW (Unicode = hex. 2B01)" Case Is = "F6" Wingdingsname = "NORTH EAST WHITE ARROW (Unicode = hex. 2B00)" Case Is = "F7" Wingdingsname = "SOUTH WEST WHITE ARROW (Unicode = hex. 2B03)" Case Is = "F8" Wingdingsname = "SOUTH EAST WHITE ARROW (Unicode = hex. 2B02)" Case Is = "F9" Wingdingsname = "WHITE RECTANGLE (Unicode = hex. 25AD)" Case Is = "FA" Wingdingsname = "WHITE SMALL SQUARE (Unicode = hex. 25AB)" Case Is = "FB" Wingdingsname = "BALLOT X (Unicode = hex. 2717)" Case Is = "FC" Wingdingsname = "CHECK MARK (Unicode = hex. 2713)" Case Is = "FD" Wingdingsname = "BALLOT BOX WITH X (FONT-WEIGHT: BOLD) (Unicode = hex. 2612)" Case Is = "FE" Wingdingsname = "BALLOT BOX WITH CHECK (FONT-WEIGHT: BOLD) " _ & "(Unicode = hex. 2611)" Case Is = "FF" Wingdingsname = "WINDOWS LOGO" Case Else Wingdingsname = "(KEIN WINGDINGS-ZEICHEN FESTGELEGT!)" End Select End Function ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_OMML_zählen() As Integer ' Diese Funktion setzt Word 2010 oder höher voraus! Dim objEq As Word.OMath ' Formelobjekt für Word 2010 Dim k As Integer For Each objEq In Selection.Range.OMaths k=k+1 ''objEq.Range.Select ''MsgBox "hier OMML-Formel!" Next objEq Fkt_OMML_zählen = k End Function ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_Kompatibitaet() ' Befehl führt bis Word 2003 zum Absturz. Fkt_Kompatibitaet = ActiveDocument.CompatibilityMode ' (bei Dok1) End Function ' --------------------------------------------------------------------------------------------------------- Private Sub SpeichernX(xxx As String, i As Integer) ' Speichern als ".docx", damit OMML-Formeln analysiert werden können: ActiveDocument.SaveAs2 _ FileName:=xxx, _ FileFormat:=wdFormatXMLDocument, LockComments:=False, Password:="", _ AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _ 74 EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, _ SaveFormsData:=False, SaveAsAOCELetter:=False, CompatibilityMode:=i End Sub ' --------------------------------------------------------------------------------------------------------- 6.4 Zusatzfunktion: Ausgabe der Zeichenformatierung bei Einzelzeichen Im September 2016 habe ich einige Programmzeilen eingefügt, die mir die Formatierung eines Zeichens anzeigen, wenn nur ein Zeichen markiert ist (N = 1). Im Grunde ist diese Zusatzfunktion überflüssig. Mit dem Befehl Shift + F1 erhält man dassselbe und zusätzlich noch die Absatzformatierung und die hier fehlende Angabe, ob die Stelle farbig markiert ist. ' Ist nur ein einziges Zeichen markiert, werden auch einige Zeichenformatierungen ' in der MsgBox ausgeben. ... ' ****************************************************************** ' Nur wenn nicht mehr als 40 Zeichen, Ergebnis als Messagebox anzeigen, ' ansonsten direkt in die Ausgabe als Datei ( geändert 6. Oktober 2012) ' ***************************************************************** ' Beim Analyse-Ergebnis kann eine MessageBoxW maximal 44 Zeilen anzeigen ' (eine normale MsgBox sogar nur 16 Zeilen). ' Bei OMML-Formeln ist die Ausgabe als Datei günstiger: ''''''''''' ' 23. September 2016 + 9. November 2016: If N = 1 Then ' Bei nur einem Buchstaben lohnt sich auch die Ausgabe der Schriftattribute: ' Ergebnisanzeige in Messagebox mit Abfrage, ob Ergebnis in separater Datei gewünscht: MsgBoxAnzeige = Ergebnis2 & vbCrLf & vbCrLf _ & Fkt_Schriftattribute_ausgeben _ & vbCrLf & vbCrLf _ & "Wollen Sie das Ergebnis (ohne die Schriftattribute) ausführlicher in einer separaten Datei?" IntAbfrage = MessageBoxW(0, StrPtr(MsgBoxAnzeige), StrPtr("Zeichenanalyse"), _ vbYesNoCancel + vbDefaultButton2) If IntAbfrage <> 6 Then ' Speicher löschen und Programm beenden. GoTo Zeile_Suchverzeichnis_löschen_und_beenden End If ''''''''''' ElseIf N < 40 Then '' If N < 40 Then '' _ And Int_OMML = 0 ' Ergebnisanzeige in Messagebox mit Abfrage, ob Ergebnis in separater Datei gewünscht: MsgBoxAnzeige = Ergebnis2 & vbCrLf & vbCrLf _ & "Wollen Sie das Ergebnis ausführlicher in einer separaten Datei?" IntAbfrage = MessageBoxW(0, StrPtr(MsgBoxAnzeige), StrPtr("Zeichenanalyse"), _ vbYesNoCancel + vbDefaultButton2) ' Alternative einfache Funktion, wenn keine Windows-Umgebung, leider ohne Unicode: ' IntAbfrage = MsgBox(MsgBoxAnzeige, vbYesNoCancel + vbDefaultButton2, "Zeichenanalyse") ' Bei "Ja" kommt "6" heraus, bei "Nein" kommt "7" heraus, bei Abbrechen eine "2". ' If IntAbfrage <> 6 Then ' Speicher löschen und Programm beenden. GoTo Zeile_Suchverzeichnis_löschen_und_beenden End If '' Else '' MsgBox "Da insgesamt " & N & " Zeichen markiert sind, erfolgt das Ergebnis " _ 75 '' ' ' ' ' & "in einer separaten Datei. Es passt nicht mehr in eine Messagbox." End If ********************************************************************** Wenn mehr als 40 Zeichen oder Abfrage = "ja" (IntAbfrage = 6), ausführlichere Ergebnisanzeige in Extra-Datei: ********************************************************************* Private Function Fkt_Schriftattribute_ausgeben() As String ' Dipl.-Ing. Hanna-Chris Gast, 4. Juni 2010, 21. September 2016, 14. Dezember 2016. ' Bei der Schriftfarbe wird die Grundfarbe genannt. Dim x(7) As Variant Dim Strpos As String ' x(1) = Selection.Font.Size If x(1) > 99 Then x(1) = "unterschiedlich" ' Select Case Selection.Font.Bold Case -1 x(2) = "fett" Case 0 x(2) = "nicht fett" Case Else x(2) = "unterschiedlich fett und nicht fett" End Select ' Select Case Selection.Font.Italic Case -1 x(3) = "kursiv" Case 0 x(3) = "nicht kursiv" Case Else x(3) = "unterschiedlich kursiv und nicht kursiv" End Select ' Select Case Selection.Font.Underline Case -1 x(4) = "unterstrichen" Case 0 x(4) = "nicht unterstrichen" Case Else x(4) = "teilweise unterstrichen" End Select ' x(5) = Selection.Font.Name If x(5) = "" Then x(5) = "unterschiedlich" '''''''''' ' 14. 12. 2016 If Selection.Font.Subscript = True Then x(6) = "tiefgestellt" ElseIf Selection.Font.Superscript = True Then x(6) = "hochgestellt" Else x(6) = "weder hoch- noch tiefgestellt" End If If Selection.Range.HighlightColorIndex = 0 Then x(7) = "keine farbige Textmarkierung" Else x(7) = "die Textstelle ist farbig markiert" End If '''''''''' ' 21. 9. 2016 76 If Selection.Font.Position > 9999 Then Strpos = vbCrLf & vbCrLf & "Die vertikale Position der Zeichen ist unterschiedlich." ElseIf Selection.Font.Position <> 0 Then Strpos = vbCrLf & vbCrLf & "Die vertikale Position des Zeichens ist " _ & Selection.Font.Position & "." Else Strpos = "" End If ''''''''' ''' MsgBox "Die Schriftattribute sind: " & vbCrLf _ '''''''' Fkt_Schriftattribute_ausgeben = "Die Schriftattribute sind: " & vbCrLf _ & "Schriftart: " & x(5) & "," & vbCrLf _ & "Schriftgröße: " & x(1) & ", " & vbCrLf _ & x(2) & "," & vbCrLf _ & x(3) & "," & vbCrLf _ & x(4) & "," & vbCrLf _ & x(6) & "," & vbCrLf _ & x(7) & ";" & vbCrLf _ & "Schriftfarbe (ColorIndex): " _ & Fkt_FarbIndex_Farbe & "." _ & Strpos End Function ' *********************************************************************- Private Function Fkt_FarbIndex_Farbe() ' H. Chris Gast 15. August 2012, 7. April 2014, 8. Januar 2015, 22. September 2016. ' Dies Makro gibt die Text-Grundfarbe an der Cursor-Stelle zurück. Dim StrFarbe As String ' Select Case Selection.Font.ColorIndex Case 0 StrFarbe = " keine Farbe" Case 1 StrFarbe = " Schwarz" Case 2 StrFarbe = " Blau" Case 3 StrFarbe = " Türkis (eigentlich eher hellblau)" Case 4 StrFarbe = " Hellgrün" Case 5 StrFarbe = " Rosa" Case 6 StrFarbe = " Rot" Case 7 StrFarbe = " Gelb" Case 8 StrFarbe = " Weiß" Case 9 StrFarbe = " Dunkelblau" Case 10 StrFarbe = " Blaugrün" Case 11 StrFarbe = " Grün" Case 12 StrFarbe = " Violett" Case 13 StrFarbe = " Dunkelrot" Case 14 77 StrFarbe = " Dunkelgelb" Case 15 StrFarbe = " Grau-50" Case 16 StrFarbe = " Grau-25" Case Else StrFarbe = "unbekannte Farbe oder mehrere Farben" End Select Fkt_FarbIndex_Farbe = StrFarbe End Function ' --------------------------------------------------------------------------------------------------------- 78 7 Ersatz der Schriftarten Symbol und Wingdings durch Cambria 7.1 Problemstellung und Kurzbeschreibung Sonderschriftarten wie Symbol und Wingdings sind nicht Unicode-kompatibel, was dazu führt, dass Leser im Internet oder Empfänger der Datei nach einer Übertragung mit Verlust der Formatierung falsche Buchstaben lesen würden, was meines Erachtens schlimmer ist, als wenn sie nur leere Rechtecke ("Kästchen") zu sehen bekämen. Das hier erstellte Word-Makro (siehe Abschnitt 7.6) wandelt wahlweise in der gesamten Datei oder nur in der Markierung alle Zeichen der Schriftart "Symbol" (mit einer Ausnahme) und den größten Teil der Zeichen der Schriftart "Wingdings" in Unicode-Zeichen um. Beim Ersetzen in der gesamten Datei erfolgt die Ersetzung nicht nur in der Hauptkomponente des Dokuments, sondern auch in den Fußnoten, Kopfzeilen und Fußzeilen 26. Das Makro funktioniert in Word 2000 bis Word 2010. Ich habe für das neue Ersetzungs-Makro (August 2014) die auf dem Windows-Computer bereits vorhandenen Schriftarten (Fonts) Cambria, Times New Roman, Arial und Arial Unicode bevorzugt. Ferner verwende ich die in Word 2010 neu vorhandene Schriftart "Segoe UI Symbol". Damit lassen sich jedoch nicht alle Wingdings-Zeichen ersetzen. Ich verwendete deshalb auch die kostenlos downloadbare Schriftart (Font) Symbola [10]. Bei Bedarf kann man das hier entwickelte Makro passend ändern, wenn man möglichst viele Zeichen mit anderen Schriftarten wiedergeben will, wie zum Beispiel mit "RomanCyrillic_Std "[11] oder mit Code 2001 [12], oder man lässt alle Ersetzungen aus, die nicht mit den vorhandenen Schriftarten möglich sind. Die von mir bisher verwendeten zusätzlichen Fonts wie "DejaVu" usw. wurden jetzt durch die Einführung von "Cambria", "Cambria Math" und "Segoe UI Symbol" überflüssig, mit Ausnahme von "Symbola". Verwendet man "Symbola", wird auch "Segoe UI Symbol" überflüssig. Für die Analyse von Sonderzeichen bei der Erstellung dieser Arbeit verwendete ich mein Makro für Zeichenanalyse, siehe Abschnitt 6. Hinweis: Steuerzeichen (Code kleiner als dezimal 032 bzw. hexadezimal 0x20) sind im Aussehen relativ unabhängig von der Schriftart. Hier kann einfach allen Steuerzeichen die Grundschriftart zugewiesen werden, es braucht kein "Mapping" nach Abschnitt 7 zu erfolgen. 7.2 Ersatz ("Mapping") von Symbol-Zeichen durch Unicode-Zeichen Die Zeichen der Schriftart (Font) Symbol können fast vollständig durch Zeichen der Schriftart "Cambria" ersetzt werden. 27 Mit Rosa markierte ich das einzige fehlende Zeichen. In der folgenden Tabelle sind die gesuchten Zeichen in Schriftgröße 14 der betreffenden Schriftart dargestellt, der erklärende Text dagegen in 10 Punkt Arial. 26 27 Kopf- und Fußzeilen von zusätzlichen "Sections" oder von Textfeldern in Kopf- und Fußzeilen werden von meinem Makro nicht erfasst, da dieser Fall nicht zu erwarten ist. Weitgehend verwendete Quellen: [20] und [21]. 79 Bei den Zeichen, für die je nach Bedeutung unterschiedlicher Ersatz zu wählen ist, machte ich in drei Fällen im Makro die Auswahl davon abhängig, ob das Zeichen kursiv oder steil geschrieben ist: Formelzeichen werden kursiv, Einheiten und Einheiten-Zusätze werden stets steil geschrieben. Bei einigen anderen Fällen (spezielle Klammern und das Durchmesserzeichen) versuchte ich, die wahrscheinlichere Variante zu wählen. Tabelle 7.1: Alle Zeichen der Schriftart Symbol mit Unicode-Entsprechungen (1 von 9) Schriftart DezimalSymbol code 29 30 31 80 PUA 29 Unicode-Name Unicode (dez) Unicode (hex.) geigneter Font 32 0x20 61472 NO-BREAK SPACE 30 160 0x00A0 Cambria ! 33 0x21 61473 EXCLAMATION MARK 33 0x0021 Cambria ∀ 34 0x22 61474 FOR ALL 8704 0x2200 Cambria # 35 0x23 61475 NUMBER SIGN 35 0x0023 Cambria ∃ 36 0x24 61476 THERE EXISTS 8707 0x2203 Cambria % 37 0x25 61477 PERCENT SIGN 37 0x0025 Cambria & 38 0x26 61478 AMPERSAND 38 0x0026 Cambria ∋ 39 0x27 61479 CONTAINS AS MEMBER 31 8715 0x220B Cambria ( 40 0x28 61480 LEFT PARENTHESIS 40 0x0028 Cambria ) 41 0x29 61481 RIGHT PARENTHESIS 41 0x0029 Cambria ∗ 42 0x2A 61482 ASTERISK OPERATOR 8727 0x2217 Cambria 43 0x2B 61483 PLUS SIGN 43 0x002B Cambria 44 0x2C 61484 COMMA 44 0x002C Cambria 45 0x2D 61485 MINUS SIGN 8722 0x2212 Cambria 46 0x2E 61486 FULL STOP 46 0x002E Cambria 47 0x2F 61487 SOLIDUS 47 0x002F Cambria 48 0x30 61488 DIGIT ZERO 48 0x0030 Cambria 49 0x31 61489 DIGIT ONE 49 0x0031 Cambria + , − . / 0 1 28 Hexcode 28 Hexadezimaler Code. Eigentlich "F020" usw. in der "Private Use Area". Es werden bei Schriftart "Symbol" auch dann die richtigen Symbol-Zeichen angezeigt, wenn nur die letzten beiden Hexziffern stimmen. Dezimaler Code in der Private-Use-Area (siehe [1]). Hier trifft nur "No-Break Space" (Festes Leerzeichen) wie in der Adobe-Liste zu, nicht das einfache Leerzeichen wie in der Apple-Liste [21]. Die Apple-Liste verwendet hier: "SMALL CONTAINS AS MEMBER" (0x220D). Ich habe mich hier aber an die Adobe-Liste gehalten. [20]. Tabelle 7.1 (2 von 9) Schriftart DezimalSymbol code 2 3 4 5 Hexcode 28 PUA 29 Unicode-Name Unicode (dez) Unicode (hex.) geigneter Font 50 0x32 61490 DIGIT TWO 50 0x0032 Cambria 51 0x33 61491 DIGIT THREE 51 0x0033 Cambria 52 0x34 61492 DIGIT FOUR 52 0x0034 Cambria 53 0x35 61493 DIGIT FIVE 53 0x0035 Cambria 6 54 0x36 61494 DIGIT SIX 54 0x0036 Cambria 7 55 0x37 61495 DIGIT SEVEN 55 0x0037 Cambria 8 56 0x38 61496 DIGIT EIGHT 56 0x0038 Cambria 9 57 0x39 61497 DIGIT NINE 57 0x0039 Cambria : 58 0x3A 61498 COLON 58 0x003A Cambria ; 59 0x3B 61499 SEMICOLON 59 0x003B Cambria < 60 0x3C 61500 LESS-THAN SIGN 60 0x003C Cambria = 61 0x3D 61501 EQUALS SIGN 61 0x003D Cambria > 62 0x3E 61502 62 0x003E Cambria ? 63 0x3F 61503 QUESTION MARK 63 0x003F Cambria ≅ 64 0x40 61504 APPROXIMATELY EQUAL TO 8773 0x2245 Cambria Α 65 0x41 61505 GREEK CAPITAL LETTER ALPHA 913 0x0391 Cambria Β 66 0x42 61506 GREEK CAPITAL LETTER BETA 914 0x0392 Cambria Χ 67 0x43 61507 GREEK CAPITAL LETTER CHI 935 0x03A7 Cambria ∆ 68 0x44 GREEK CAPITAL 61508 LETTER DELTA INCREMENT 916 0x0394 Cambria 8710 0x2206 Cambria GREATER-THAN SIGN Ε 69 0x45 61509 GREEK CAPITAL LETTER EPSILON 917 0x0395 Cambria Φ 70 0x46 61510 GREEK CAPITAL LETTER PHI 934 0x03A6 Cambria Γ 71 0x47 61511 GREEK CAPITAL LETTER GAMMA 915 0x0393 Cambria Η 72 0x48 61512 GREEK CAPITAL LETTER ETA 919 0x0397 Cambria Ι 73 0x49 61513 GREEK CAPITAL LETTER IOTA 921 0x0399 Cambria ϑ 74 0x4A 61514 GREEK THETA SYMBOL 977 0x03D1 Cambria 81 Tabelle 7.1 (3 von 9) Schriftart DezimalSymbol code PUA 29 Unicode-Name Unicode (dez) Unicode (hex.) geigneter Font Κ 75 0x4B 61515 GREEK CAPITAL LETTER KAPPA 922 0x039A Cambria Λ 76 0x4C 61516 GREEK CAPITAL LETTER LAMDA 923 0x039B Cambria Μ 77 0x4D 61517 GREEK CAPITAL LETTER MU 924 0x039C Cambria Ν 78 0x4E 61518 GREEK CAPITAL LETTER NU 925 0x039D Cambria Ο 79 0x4F 61519 GREEK CAPITAL 927 LETTER OMICRON 0x039F Cambria Π 80 0x50 61520 GREEK CAPITAL LETTER PI 928 0x03A0 Cambria Θ 81 0x51 61521 GREEK CAPITAL LETTER THETA 920 0x0398 Cambria Ρ 82 0x52 61522 GREEK CAPITAL LETTER RHO 929 0x03A1 Cambria Σ 83 0x53 61523 GREEK CAPITAL LETTER SIGMA 931 0x03A3 Cambria Τ 84 0x54 61524 GREEK CAPITAL LETTER TAU 932 0x03A4 Cambria Υ 85 0x55 61525 GREEK CAPITAL LETTER UPSILON 933 0x03A5 Cambria ς 86 0x56 GREEK SMALL 61526 LETTER FINAL SIGMA 962 0x03C2 Cambria 0x57 GREEK CAPITAL 61527 LETTER OMEGA OHM SIGN 937 0x03A9 Cambria 8486 0x2126 Cambria Ω 82 Hexcode 28 87 Ξ 88 0x58 61528 GREEK CAPITAL LETTER XI 926 0x039E Cambria Ψ 89 0x59 61529 GREEK CAPITAL LETTER PSI 936 0x03A8 Cambria Ζ 90 0x5A 61530 GREEK CAPITAL LETTER ZETA 918 0x0396 Cambria [ 91 0x5B 61531 LEFT SQUARE BRACKET 91 0x005B Cambria ∴ 92 0x5C 61532 THEREFORE 8756 0x2234 Cambria ] 93 0x5D 61533 93 0x005D Cambria ⊥ 94 0x5E 61534 UP TACK 8869 0x22A5 Cambria Math _ 95 0x5F 61535 LOW LINE 95 0x005F Cambria RIGHT SQUARE BRACKET Tabelle 7.1 (4 von 9) Schriftart DezimalSymbol code 96 Hexcode 28 0x60 PUA 29 61537 33 34 35 RADICAL EXTENDER 32 Ersatz-Vorschlag: Macron GREEK SMALL LETTER ALPHA GREEK SMALL LETTER BETA GREEK SMALL LETTER CHI GREEK SMALL LETTER DELTA GREEK SMALL LETTER EPSILON (korrigiert) 34 GREEK PHI SYMBOL GREEK SMALL LETTER GAMMA GREEK SMALL LETTER ETA GREEK SMALL LETTER IOTA (korrigiert) 35 GREEK SMALL LETTER PHI Unicode (dez) Unicode (hex.) geigneter Font ---- ---- 0175 0x00AF Times New Roman 33 945 0x03B1 Cambria 946 0x03B2 Cambria 967 0x03C7 Cambria 948 0x03B4 Cambria 949 0x03B5 Cambria 981 0x03D5 Cambria 947 0x03B3 Cambria 951 0x03B7 Cambria 953 0x03B9 Cambria 966 0x03C6 Cambria α 97 0x61 61537 β 98 0x62 61538 χ 99 0x63 61539 δ 100 0x64 61540 ε 101 0x65 61541 φ 102 0x66 61542 γ 103 0x67 61543 η 104 0x68 61544 ι 105 0x69 61545 ϕ 106 0x6A 61546 κ 107 0x6B 61547 GREEK SMALL LETTER KAPPA 954 0x03BA Cambria λ 108 0x6C 61548 GREEK SMALL LETTER LAMDA 955 0x03BB Cambria 0x6D GREEK SMALL 61549 LETTER MU MICRO SIGN 956 0x03BC Cambria 181 00B5 Cambria µ 32 Unicode-Name 109 ν 110 0x6E 61550 GREEK SMALL LETTER NU 957 0x03BD Cambria ο 111 0x6F 61551 GREEK SMALL 959 LETTER OMICRON 0x03BF Cambria π 112 0x70 61552 GREEK SMALL LETTER PI 960 0x03C0 Cambria θ 113 0x71 61553 GREEK SMALL LETTER THETA 952 0x03B8 Cambria ρ 114 0x72 61554 GREEK SMALL LETTER RHO 961 0x03C1 Cambria Kein entsprechendes Unicode-Zeichen vorhanden. Hier ist am besten der Formeleditor zu verwenden, im neuen Makro (2014) deshalb weggelassen. Die ursprünglichen Unicode-Zeichen für phi und phi-Symbol wurden später vertauscht [23]. Die ursprünglichen Unicode-Zeichen für phi und phi-Symbol wurden später vertauscht [23]. 83 Tabelle 7.1 (5 von 9) Schriftart DezimalSymbol code 84 Unicode (dez) Unicode (hex.) geigneter Font 0x73 61555 GREEK SMALL LETTER SIGMA 963 0x03C3 Cambria τ 116 0x74 61556 GREEK SMALL LETTER TAU 964 0x03C4 Cambria υ 117 0x75 61557 GREEK SMALL LETTER UPSILON 965 0x03C5 Cambria ϖ 118 0x76 61558 GREEK PI SYMBOL 982 0x03D6 Cambria ω 119 0x77 61559 GREEK SMALL LETTER OMEGA 969 0x03C9 Cambria ξ 120 0x78 61560 GREEK SMALL LETTER XI 958 0x03BE Cambria ψ 121 0x79 61561 GREEK SMALL LETTER PSI 968 0x03C8 Cambria ζ 122 0x7A 61562 GREEK SMALL LETTER ZETA 950 0x03B6 Cambria 123 0x7B 61563 LEFT CURLY BRACKET 123 0x007B Cambria 124 0x7C 61564 VERTICAL LINE 124 0x007C Cambria 125 0x007D Cambria 126 0x007E Cambria 8364 0x20AC Cambria 978 0x03D2 Cambria 8242 0x2032 Cambria RIGHT CURLY 61565 BRACKET 61566 TILDE 36 125 0x7D 126 0x7E 37 160 0xA0 EURO SIGN 61600 (bzw. nicht definiert) ϒ 161 0xA1 61601 WITH HOOK GREEK UPSILON SYMBOL 162 0xA2 61602 PRIME 163 0xA3 8804 0x2264 Cambria 164 0xA4 61603 EQUAL TO 61604 FRACTION SLASH 8260 0x2044 Cambria 165 0xA5 61605 INFINITY 8734 0x221E Cambria 402 0x0192 Cambria 9827 0x2663 Times New Roman LESS-THAN OR ƒ 166 0xA6 LATIN SMALL 61606 LETTER F WITH HOOK ♣ 167 0xA7 61607 BLACK CLUB SUIT ♦ 168 0xA8 61608 SUIT 9830 0x2666 Cambria Math 169 0xA9 61609 BLACK HEART SUIT 9829 0x2665 Times New Roman 38 170 0xAA 61610 BLACK SPADE SUIT 9824 0x2660 Cambria 171 0xAB 61611 LEFT RIGHT ARROW 8596 0x2194 Cambria ♥ ♠ ↔ 38 Unicode-Name 115 ′ ≤ ⁄ ∞ 37 PUA 29 σ { | } ∼ 36 Hexcode 28 BLACK DIAMOND Bei manchen Fonts ist hier besser der TILDE OPERATOR zu verwenden, dez. 8764, hex. 0x223C. Das Eurozeichen ist bei mir in Symbol nicht vorhanden (Word 2000 und Word 2010). In Cambria gibt es nur das weiße Herz, ♡ (Code: 0x2661). Tabelle 7.1 (6 von 9) Schriftart DezimalSymbol code ← → ↓ ° ± ″ ≥ × ∝ ∂ • ÷ ≠ ≡ ≈ … ↵ ℵ ℑ Hexcode 28 PUA 29 Unicode-Name LEFTWARDS 172 0xAC 173 0xAD 61612 ARROW 61613 UPWARDS ARROW 174 0xAE 61614 ARROW 175 0xAF 176 Unicode (dez) Unicode (hex.) geigneter Font 8592 0x2190 Cambria 8593 0x2191 Cambria 8594 0x2192 Cambria 8595 0x2193 Cambria 0xB0 61615 ARROW 61616 DEGREE SIGN 176 0x00B0 Cambria 177 0xB1 61617 PLUS-MINUS SIGN 177 0x00B1 Cambria 178 0xB2 61618 DOUBLE PRIME 8243 0x2033 Cambria 179 0xB3 61619 8805 0x2265 Cambria 180 0xB4 215 0x00D7 Cambria 181 0xB5 61621 PROPORTIONAL TO 8733 0x221D Cambria 182 0xB6 PARTIAL 61622 DIFFERENTIAL 8706 0x2202 Cambria 183 0xB7 61623 BULLET 8226 0x2022 Cambria 184 0xB8 61624 DIVISION SIGN 247 0x00F7 Cambria 185 0xB9 61625 NOT EQUAL TO 8800 0x2260 Cambria 186 0xBA 61626 IDENTICAL TO 8801 0x2261 Cambria 187 0xBB 61627 ALMOST EQUAL TO 8776 0x2248 Cambria 188 0xBC 61628 ELLIPSIS 8230 0x2026 Cambria 9168 0x23D0 124 0x007C 9135 0x23AF 8212 0x2014 Cambria 8629 0x21B5 Cambria 8501 0x2135 Cambria Math 8465 0x2111 Cambria Math 8476 0x211C Cambria Math 8472 0x2118 Cambria RIGHTWARDS DOWNWARDS GREATER-THAN OR EQUAL TO MULTIPLICATION 61620 SIGN HORIZONTAL VERTICAL LINE EXTENSION 189 0xBD 61629 (for arrows) besser: Senkrechter Strich HORIZONTAL LINE EXTENSION 190 0xBE 191 0xBF 192 0xC0 61630 (for arrows) besser: Geviertstrich DOWNWARDS ARROW WITH 61631 CORNER LEFTWARDS 61632 ALEF SYMBOL BLACK-LETTER 61633 CAPITAL I BLACK-LETTER 61634 CAPITAL R SCRIPT CAPITAL 61635 P Cambria 193 0xC1 ℜ 194 0xC2 ℘ 195 0xC3 ⊗ 196 0xC4 61636 CIRCLED TIMES 8855 0x2297 Cambria ⊕ 197 0xC5 61637 CIRCLED PLUS 8853 0x2295 Cambria 85 Tabelle 7.1 (7 von 9) Schriftart DezimalSymbol code ∅ ∩ ∪ ⊃ ⊇ ⊄ ⊂ ⊆ ∈ ∉ ∠ ∇ 39 86 198 Hexcode 28 0xC6 PUA 29 Unicode-Name Unicode (dez) Unicode (hex.) geigneter Font 8709 0x2205 Arial Unicode 39 DIAMETER SIGN 8960 0x2300 Cambria Math 61638 EMPTY SET 199 0xC7 61639 INTERSECTION 8745 0x2229 Cambria 200 0xC8 61640 UNION 8746 0x222A Cambria 201 0xC9 61641 SUPERSET OF 8835 0x2283 Cambria 202 0xCA 61642 SUPERSET OF OR 8839 EQUAL TO 0x2287 Cambria 203 0xCB 61643 NOT A SUBSET OF 8836 0x2284 Cambria 204 0xCC 61644 SUBSET OF 8834 0x2282 Cambria 205 0xCD 61645 8838 0x2286 Cambria 206 0xCE 61646 ELEMENT OF 8712 0x2208 Cambria 207 0xCF 61647 NOT AN ELEMENT 8713 OF 0x2209 Cambria 208 0xD0 61648 ANGLE 8736 0x2220 Cambria 209 0xD1 61649 NABLA 8711 0x2207 Cambria Math 210 0xD2 0x00AE Cambria 211 0xD3 0x00A9 Cambria 212 0xD4 0x2122 Cambria ∏ 213 0xD5 61653 N-ARY PRODUCT 8719 0x220F Cambria √ 214 0xD6 61654 SQUARE ROOT 8730 0x221A Cambria ⋅ 215 0xD7 61655 DOT OPERATOR 8901 0x22C5 Cambria ¬ 216 0xD8 61656 NOT SIGN 172 0x00AC Cambria ∧ 217 0xD9 61657 LOGICAL AND 8743 0x2227 Cambria ∨ 218 0xDA 61658 LOGICAL OR 8744 0x2228 Cambria ⇔ 219 0xDB 61659 LEFT RIGHT DOUBLE ARROW 8660 0x21D4 Cambria ⇐ 220 0xDC 61660 LEFTWARDS DOUBLE ARROW 8656 0x21D0 Cambria ⇑ 221 0xDD 61661 UPWARDS DOUBLE ARROW 8657 0x21D1 Cambria ⇒ 222 0xDE 61662 RIGHTWARDS DOUBLE ARROW 8658 0x21D2 Cambria ⇓ 223 0xDF 61663 DOWNWARDS DOUBLE ARROW 8659 0x21D3 Cambria SUBSET OF OR EQUAL TO REGISTERED 61650 SIGN 174 (Serifenschrift) COPYRIGHT SIGN 61651 169 (Serifenschrift) TRADE MARK 61652 SIGN 8482 (Serifenschrift) In Cambria sieht das Empty-Set-Zeichen als Durchmesserzeichen nicht rund genug aus und kommt deshalb nicht in Frage. Verboten ist auch das skandinavische Umlautzeichen "Ø". Es bleibt nur das (leider etwas kleine) Durchmesserzeichen mit Cambria Math. Tabelle 7.1 (8 von 9) Schriftart DezimalSymbol code ◊ 224 Hexcode 28 0xE0 PUA 29 Unicode-Name 61664 LOZENGE LEFT-POINTING ANGLE BRACKET 〈 225 0xE1 61665 LESS-THAN SIGN 40 MATHEMATICAL LEFT ANGLE BRACKET 40 REGISTERED 61666 SIGN, (sans serif) COPYRIGHT SIGN, 61667 (sans serif) TRADE MARK 61668 SIGN, (sans serif) N-ARY 61669 SUMMATION LEFT 61670 PARENTHESIS UPPER HOOK LEFT 61671 PARENTHESIS EXTENSION Unicode (dez) Unicode (hex.) geigneter Font 9674 0x25CA Cambria 9001 0x2329 Cambria 060 U+003C Cambria 10216 U+27E8 Cambria Math 174 0x00AE Arial, Cambria 169 0x00A9 8482 0x2122 Arial, Cambria 8721 0x2211 Cambria 9115 0x239B Cambria Math 9116 0x239C Cambria Math 226 0xE2 227 0xE3 228 0xE4 ∑ 229 0xE5 230 0xE6 231 0xE7 232 0xE8 LEFT 61672 PARENTHESIS LOWER HOOK 9117 0x239D Cambria Math 233 0xE9 LEFT SQUARE 61673 BRACKET UPPER CORNER 9121 0x23A1 Cambria Math 234 0xEA LEFT SQUARE 61674 BRACKET EXTENSION 9122 0x23A2 Cambria Math 235 0xEB LEFT SQUARE 61675 BRACKET LOWER 9123 CORNER 0x23A3 Cambria Math 236 0xEC LEFT CURLY 61676 BRACKET UPPER HOOK 9127 0x23A7 Cambria Math 237 0xED LEFT CURLY 61677 BRACKET MIDDLE 9128 PIECE 0x23A8 Cambria Math 238 0xEE LEFT CURLY 61678 BRACKET LOWER 9129 HOOK 0x23A9 Cambria Math 239 0xEF 61679 CURLY BRACKET EXTENSION 0x23AA Cambria Math 9130 Arial, Cambria Genausogut möglich ist auch das einfache Zeichen für "Kleiner-Gleich". Apple hat hier "LEFT ANGLE BRACKET" (0x3008) [21], diese Klammer gehört aber in den Bereich für ostasiatische Sprachen. 87 Tabelle 7.1 (9 von 9) Schriftart DezimalSymbol code 240 〉 ∫ ⌠ 41 42 88 241 Hexcode 28 0xF0 0xF1 PUA 29 Unicode-Name Unicode (dez) Unicode (hex.) geigneter Font 61680 (nicht definiert) 41 61681 RIGHT-POINTING ANGLE BRACKET 9002 0x232A Cambria GREATER-THAN 42 SIGN 003E 062 Cambria MATHEMATICAL RIGHT ANGLE BRACKET 10217 U+27E9 Cambria Math 8747 0x222B Cambria 8992 0x2320 Cambria 9134 0x23AE Cambria Math 8993 0x2321 Cambria 9118 0x239E Cambria Math 9119 0x239F Cambria Math 9120 0x23A0 Cambria Math 9124 0x23A4 Cambria Math 9125 0x23A5 Cambria Math 9126 0x23A6 Cambria Math 9131 0x23AB Cambria Math 9132 0x23AC Cambria Math 9133 0x23AD Cambria Math 242 0xF2 61682 INTEGRAL 243 0xF3 61683 244 0xF4 61684 ⌡ 245 0xF5 61685 246 0xF6 61686 247 0xF7 61687 248 0xF8 61688 249 0xF9 61689 250 0xFA RIGHT SQUARE 61690 BRACKET EXTENSION 251 0xFB 252 0xFC 253 0xFD 254 0xFE TOP HALF INTEGRAL INTEGRAL EXTENSION BOTTOM HALF INTEGRAL RIGHT PARENTHESIS UPPER HOOK RIGHT PARENTHESIS EXTENSION RIGHT PARENTHESIS LOWER HOOK RIGHT SQUARE BRACKET UPPER CORNER RIGHT SQUARE 61691 BRACKET LOWER CORNER RIGHT CURLY 61692 BRACKET UPPER HOOK RIGHT CURLY 61693 BRACKET MIDDLE PIECE RIGHT CURLY 61694 BRACKET LOWER HOOK Apple hat hier das Apple-Logo [21]. Die Schriftart "SymbolPS" hat hier das Eurozeichen. Hier entschied ich mich für die erste Variante. Das normale Zeichen für "Größer-Gleich" kann ebensogut verwendet werden. Apple verwendet hier "RIGHT ANGLE BRACKET" (0x3009) [21]; diese Klammer gehört aber in den Bereich für ostasiatische Sprachen. 7.2.1 Auswertung der geeigneten Ersatz-Schriftarten für "Symbol" Nur ein Zeichen der Sonderschriftart "Symbol" (Wurzelzeichen-Verlängerung) hat keine Unicode-Entsprechung, hierfür eignet sich als optisch halbwegs passender Ersatz das Makron oder der "Kombinierende Überstrich" ("combining overline"). Zwei Zeichen (vertikale und horizontale LINE EXTENSION) lassen sich nur in schlechter Qualität mit Unicodezeichen wiedergeben; hierfür empfehle ich den optisch besser passenden Ersatz mit dem Geviertstrich bzw. dem Senkrechtem Strich. Im Prinzip kann folglich die Schriftart "Symbol" vollständig durch Unicode-Zeichen ersetzt werden. Von den 193 Zeichen der Sonderschriftart "Symbol" lassen sich bis auf 2 Zeichen alle mit Cambria bzw. Cambria Math wiedergeben: (Stand Juni 2014): — Die bei Cambria bzw. Cambria Math fehlenden 2 Spielkartenzeichen "Kreuz" und "Herz" lassen sich mit Times New Roman darstellen; Weitere 5 Zeichen sehen in Cambria unbefriedigend aus: — Das Makron als Ersatz für den (fast nie gebrauchten) Wurzelzeichen-Verlängerer erhält in Cambria eine falsche Position, auf eine Ersetzung habe ich deshalb jetzt in der neuen Makro-Version verzichtet (Juni 2014). Hier empfehle ich die Verwendung eines FormelEditors, siehe auch [6]. — Das Zeichen für "Leere Menge ist in Cambria nicht brauchbar (verzerrt), hierfür wäre "Arial Unicode" besser. Fast immer ist jedoch das Durchmesserzeichen gemeint, welches sich sehr gut mit Cambria darstellen lässt. — Die drei "Sans-Serif"-Zeichen habe ich mit Arial ersetzt. Die neuen Schriftarten (Fonts) "Calibri" und "Candara" habe ich nicht getestet. ************************************************************************** 7.2.2 Unicode-Ersatzschriftarten ohne Cambria (Stand 2011) Vor der Einführung von der Schriftart Cambria waren nicht alle Symbol-Zeichen mit den damals vorhandenen Schriftarten von Word 2003 unter Windows XP ersetzbar. Ich musste damals weitere Schriftarten aus dem Internet suchen und wählte DejaVu. 184 172 128 Zeichen mit RomanCyrillic_Std; (Nur 9 Zeichen von 193 Zeichen haben keine Entsprechung in RomanCyrillic_Std) Zeichen mit Arial-Unicode; (Nur 21 Zeichen von 193 Zeichen sind nicht mit Arial Unicode darstellbar.) Zeichen mit Times New Roman oder Arial; Von den Zeichen, die nicht mit Times New Roman bzw. Arial darstellbar sind, lassen sich wie folgt mit Unicode-Zeichen wiedergeben: 42 33 52 Zeichen mit Arial Unicode (im Makro nur verwendet, wo DejaVu Serif nicht möglich war); Zeichen mit RomanCyrillic_Std (im Makro nicht verwendet); Zeichen mit DejaVu Serif oder DejaVu Sans; davon 13 Zeichen ausschließlich mit DejaVu Serif oder DejaVu Sans; in OpenOffice funktioniert dies nur mit DejaVu Sans. 7 Zeichen nur mit Lucida Sans Unicode oder Arial Unicode, aber nicht mit Times New Roman und DejaVu Serif; 3 Zeichen nur mit Arial Unicode oder RomanCyrillic_Std, aber nicht mit Times New Roman, DejaVu Serif oder Lucida Sans Unicode; Die einzige sinnvolle Art, eine Wurzel im Text darzustellen, bleibt aber der Formel-Editor: (Einfügen → Objekt → Microsoft Formel-Editor 3.0): αβχ . 89 7.3 Ersatz ("Mapping") für die Wingdings-Zeichen durch Cambria Für Wingdings habe ich noch keinen vollständigen Ersatz gefunden 43. Rosa sind Felder markiert, für die ein Unicode-Ersatz noch fehlt (Stand 28. September 2014). In der folgenden Tabelle sind die jeweiligen Sonderzeichen in Schriftgröße 14 dargestellt, der übrige Text in Arial 10 Punkt. In Roter Schrift sind die Zeichen dargestellt, die sich nicht mit den in Word 2010 vorhandenen Schriftarten darstellen lassen. Tabelle 7.2: Alle Zeichen der Schriftart Wingdings mit Unicode-Entsprechungen (1 von 10) Wingdings- dez hex 44 PUA 45 Zeichen Name des Zeichens 46 Unicode Unicode (hex) (dez) Font 32 0x20 61472 Space U+0020 32 Cambria 33 0x21 61473 Pencil U+270F 9999 Arial Unicode 34 0x22 61474 Black scissors U+2702 9986 Arial Unicode 35 0x23 61475 Upper blade scissors U+2701 9985 Arial Unicode 36 0x24 61476 Eyeglasses U+1F453 128083 37 0x25 61477 Bell U+1F514 128276 38 0x26 61478 Open book U+1F4D6 128214 39 0x27 61479 CANDLE U+1F56F 128367 Symbola 40 0x28 61480 Black telephone U+260E 9742 Arial Unicode 41 0x29 61481 Telephone location sign U+2706 9990 Arial Unicode 42 0x2A 61482 Envelope U+2709 9993 Arial Unicode 43 0x2B 61483 STAMPED ENVELOPE U+1F583 128387 44 0x2C 61484 Closed mailbox with lowered flag U+1F4EA 128234 45 0x2D 61485 Closed mailbox with raised flag U+1F4EB 128235 43 44 45 46 90 Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Die Gegenüberstellung in dieser Tabelle ist großenteils einer Liste von Alan Wood [22] entnommen, im Herbst 2014 erweitert um viele neue Zeichen, die mit "Symbola" darstellbar sind. Hexadezimaler Code. Eigentlich "F020" usw. in der "Private Use Area". Es werden bei Schriftart "Wingdings" auch dann die richtigen Symbol-Zeichen angezeigt, wenn nur die letzten beiden Hexziffern stimmen. Dezimaler Code in der Private-Use-Area. Die Namen der Zeichen sind, soweit vorhanden, den Unicode-Zeichen entnommen. Die ursprünglichen Wingdings-Namen weichen oft davon ab. Tabelle 7.2 (2 von 10) Wingdings- dez hex 44 PUA 45 Zeichen Name des Zeichens 46 Unicode Unicode (hex) (dez) Font 46 0x2E 61486 47 0x2F 61487 48 0x30 61488 File folder U+1F4C1 128193 49 0x31 61489 Open file folder U+1F4C2 128194 50 0x32 61490 Page facing up U+1F4C4 128196 51 0x33 61491 PAGE U+1F5CF 128463 Symbola 52 0x34 61492 PAGES U+1F5D0 128464 Symbola 53 0x35 61493 Filing cabinet 54 0x36 61494 Hourglass U+231B 8987 Cambria 55 0x37 61495 Keyboard U+2328 9000 Cambria 56 0x38 61496 Mouse 57 0x39 61497 Trackball 58 0x3A 61498 Personal computer 59 0x3B 61499 Hard disk 60 0x3C 61500 Floppy disk 61 0x3D 61501 5¼" Floppy disk 62 0x3E 61502 63 0x3F 64 OPEN MAILBOX WITH RAISED FLAG OPEN MAILBOX WITH LOWERED FLAG U+1F4EC 128236 Symbola U+1F4ED 128237 Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola U+1F4BB 128187 Segoe UI Symbol; Symbola U+1F4BE 128190 Segoe UI Symbol; Symbola Tape drive U+2707 9991 Arial Unicode 61503 Writing hand U+2 9997 Arial Unicode 0x40 61504 Writing left hand 65 0x41 61505 Victory hand U+270C 9996 Arial Unicode 66 0x42 61506 OK hand sign U+1F44C 128076 67 0x43 61507 Thumbs up sign U+1F44D 128077 68 0x44 61508 Thumbs down sign U+1F44E 128078 69 0x45 61509 White left pointing index U+261C 9756 Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Arial Unicode 91 Tabelle 7.2 (3 von 10) Wingdings- dez hex 44 PUA 45 Zeichen 92 Name des Zeichens 46 Unicode Unicode (hex) (dez) Font 70 0x46 61510 White right pointing index U+261E 9758 Arial Unicode 71 0x47 61511 White up pointing index U+261D 9757 Arial Unicode 72 0x48 61512 White down pointing index U+261F 9759 Arial Unicode 73 0x49 61513 Open hand 74 0x4A 61514 White smiling face U+263A 9786 75 0x4B 61515 Neutral face U+1F610 128528 76 0x4C 61516 White frowning face U+2639 77 0x4D 61517 Bomb U+1F4A3 128 163 78 0x4E 61518 Skull and crossbones U+2620 9760 Arial Unicode 79 0x4F 61519 White flag U+2690 9872 Segoe UI Symbol; Symbola 80 0x50 61520 WHITE PENNANT U+1F3F1 127985 Symbola 81 0x51 61521 Airplane U+2708 9992 Arial Unicode 82 0x52 61522 White sun with rays U+263C 9788 83 0x53 61523 Droplet U+1F4A7 128 167 84 0x54 61524 Snowflake U+2744 85 0x55 61525 WHITE LATIN CROSS U+1F546 128326 86 0x56 61526 Shadowed white Latin cross U+271E 10 014 Arial Unicode 87 0x57 61527 CELTIC CROSS 1F548 128328 Symbola 88 0x58 61528 Maltese cross U+2720 10 016 Arial Unicode 89 0x59 61529 Star of David U+2721 10 017 Arial Unicode 90 0x5A 61530 Star and crescent U+262A 9770 Arial Unicode 91 0x5B 61531 Yin Yang U+262F 9775 Arial Unicode 92 0x5C 61532 Devanagari Om U+0950 2384 Arial Unicode 93 0x5D 61533 Wheel of Dharma U+2638 9784 Arial Unicode 94 0x5E Aries U+2648 9800 Arial Unicode 61534 9785 10 052 Arial Unicode; Segoe UI Symbol Segoe UI Symbol; Symbola Arial Unicode; Segoe UI Symbol Segoe UI Symbol; Symbola Times New Roman Segoe UI Symbol; Symbola Arial Unicode Symbola Tabelle 7.2 (4 von 10) Wingdings- dez hex 44 PUA 45 Zeichen Name des Zeichens 46 Unicode Unicode (hex) (dez) Font 95 0x5F 61535 Taurus U+2649 9801 Arial Unicode 96 0x60 61536 Gemini U+264A 9802 Arial Unicode 97 0x61 61537 Cancer U+264B 9803 Arial Unicode 98 0x62 61538 Leo U+264C 9804 Arial Unicode 99 0x63 61539 Virgo U+264D 9805 Arial Unicode 100 0x64 61540 Libra U+264E 9806 Arial Unicode 101 0x65 61541 Scorpio U+264F 9807 Arial Unicode 102 0x66 61542 Sagittarius U+2650 9808 Arial Unicode 103 0x67 61543 Capricorn U+2651 9809 Arial Unicode 104 0x68 61544 Aquarius U+2652 9810 Arial Unicode 105 0x69 61545 Pisces U+2653 9811 Arial Unicode 106 0x6A 61546 Ampersand (italic, lower-case) U+0026 38 Cambria 107 0x6B 61547 Ampersand (italic) U+0026 108 0x6C 61548 Black circle U+25CF 9679 Times New Roman 109 0x6D 61549 Shadowed white circle U+274D 10061 Arial Unicode 110 0x6E 61550 Black square U+25A0 9632 Times New Roman; Cambria Math 111 0x6F 61551 Ballot Box ("White square", dez. 9633, U+2610 ist zu klein) 9744 Arial Unicode 112 0x70 61552 BOLD WHITE SQUARE 113 0x71 61553 114 0x72 61554 115 0x73 61555 116 0x74 61556 Black lozenge 117 0x75 61557 Black diamond 118 0x76 61558 119 0x77 61559 120 0x78 61560 X in a rectangle box 121 0x79 61561 U+1F790 128912 Lower right shadowed white U+2751 square Upper right shadowed white U+2752 square BLACK MEDIUM U+2B27 LOZENGE Symbola 10065 Arial Unicode 10066 Arial Unicode 11047 Symbola; Code2000 U+29EB 10731 Cambria U+25C6 9670 Arial Unicode 10070 Arial Unicode 11045 Symbola; Code 2000 U+2327 8999 Cambria APL functional symbol quad U+2353 up caret 9043 Cambria Black diamond minus white U+2756 X BLACK MEDIUM U+2B25 DIAMOND 93 Tabelle 7.2 (5 von 10) Wingdings- dez hex 44 PUA 45 Zeichen 94 Name des Zeichens 46 Unicode Unicode (hex) (dez) Font 122 0x7A 61562 Place of interest sign U+2318 8984 Cambria 123 0x7B 61563 White florette U+2740 10048 Arial Unicode 124 0x7C 61564 Black florette U+273F 10047 Arial Unicode 125 0x7D 61565 U+275D 10077 Arial Unicode 126 0x7E 61566 U+275E 10078 Arial Unicode � 127 0x7F 61567 (eventuell im Makro noch vergößern?) U+25AF 9647 Arial Unicode 128 0x80 61568 Circled digit zero U+24EA 9450 Cambria 129 0x81 61569 Circled digit one U+2460 9312 Cambria 130 0x82 61570 Circled digit two U+2461 9313 Cambria 131 0x83 61571 Circled digit three U+2462 9314 Cambria 132 0x84 61572 Circled digit four U+2463 9315 Cambria 133 0x85 61573 Circled digit five U+2464 9316 Cambria 134 0x86 61574 Circled digit six U+2465 9317 Cambria 135 0x87 61575 Circled digit seven U+2466 9318 Cambria 136 0x88 61576 Circled digit eight U+2467 9319 Cambria 137 0x89 61577 Circled digit nine U+2468 9320 Cambria 138 0x8A 61578 Circled number ten U+2469 9321 Cambria U+24FF 9471 Cambria; RomanCyrillic_Std; Code 2000; Everson; Symbola U+2776 10102 Cambria U+2777 10103 Cambria U+2778 10104 Cambria U+2779 10105 Cambria U+277A 10106 Cambria U+277B 10107 Cambria U+277C 10108 Cambria 139 0x8B 140 0x8C 61580 141 0x8D 61581 142 0x8E 61582 143 0x8F 61583 144 0x90 61584 145 0x91 61585 146 0x92 61586 61579 Heavy double turned comma quotation mark ornament Heavy double comma quotation mark ornament White vertical rectangle Negative circled digit zero Dingbat negative circled digit one Dingbat negative circled digit two Dingbat negative circled digit three Dingbat negative circled digit four Dingbat negative circled digit five Dingbat negative circled digit six Dingbat negative circled digit seven Tabelle 7.2 (6 von 10) Wingdings- dez hex 44 PUA 45 Zeichen 47 Name des Zeichens 46 147 0x93 61587 148 0x94 61588 149 0x95 61589 150 0x96 61590 Bud and leaf north east 151 0x97 61591 Bud and leaf north west 152 0x98 61592 Bud and leaf south west 153 0x99 61593 Bud and leaf south east 154 0x9A 61594 Bold vine leaf north east 155 0x9B 61595 Bold vine leaf north west 156 0x9C 61596 Bold vine leaf south west 157 0x9D 61597 Bold vine leaf south east 158 0x9E 61598 159 0x9F 160 Dingbat negative circled digit eight Dingbat negative circled digit nine Dingbat negative circled number ten Unicode Unicode (hex) (dez) Font U+277D 10109 Cambria U+277E 10110 Cambria U+277F 10111 Cambria Middle dot U+00B7 183 Cambria 61599 Bullet U+2022 8226 Cambria 0xA0 61600 Black small square 47 U+25AA 9642 Times New Roman 161 0xA1 61601 White circle U+25CB 9675 Cambria 162 0xA2 61602 Heavy large circle U+2B55 11093 Segoe UI Symbol Symbola 163 0xA3 61603 HEAVY WHITE CIRCLE U+1F787 128903 Symbola Sun U+2609 9737 Arial Unicode 164 0xA4 61604 CIRCLED BULLET U+29BF 10687 Cambria 165 0xA5 61605 TARGET U+1F78B 128907 Symbola 166 0xA6 61606 (nur ähnlich) Shadowed white circle U+274D 10061 Arial Unicode 167 0xA7 61607 Black small square U+25AA 9642 168 0xA8 61608 White medium square U+25FB 9723 169 0xA9 61609 LIGHT THREE POINTED BLACK STAR U+1F7C0 128960 Symbola 170 0xAA 61610 Black four pointed star U+2726 10022 Arial Unicode 171 0xAB 61611 Black star U+2605 9733 Arial Unicode 47 Times New Roman Times New Roman, Arial Unicode Zwei Wingdingszeichen werden mit demselben Unicode-Zeichen wiedergegeben. 95 Tabelle 7.2 (7 von 10) Wingdings- dez hex 44 PUA 45 Zeichen 96 Name des Zeichens 46 Unicode Unicode (hex) (dez) Font 172 0xAC 61612 Six pointed black star U+2736 10038 Arial Unicode - 173 0xAD 61613 Eight pointed black star U+2734 10036 Arial Unicode 174 0xAE 61614 Twelve pointed black star U+2739 10041 Arial Unicode 175 0xAF 61615 Eight pointed pinwheel star U+2735 10037 Arial Unicode 176 0xB0 61616 Square register mark 177 0xB1 61617 Position indicator U+2316 8982 Cambria 178 0xB2 61618 White concave-sided diamond U+27E1 10209 Cambria 179 0xB3 61619 Square lozenge U+2311 8977 Cambria 180 0xB4 61620 UNCERTAINTY SIGN U+2BD1 11217 Symbola 181 0xB5 61621 Circled white star U+272A 10026 Arial Unicode 182 0xB6 61622 Shadowed white star U+2730 10032 Arial Unicode 183 0xB7 61623 Clock face one o clock U+1F550 128336 184 0xB8 61624 Clock face two o clock U+1F551 128337 185 0xB9 61625 Clock face three o clock U+1F552 128338 186 0xBA 61626 Clock face four o clock U+1F553 128339 187 0xBB 61627 Clock face five o clock U+1F554 128340 188 0xBC 61628 Clock face six o clock U+1F555 128341 189 0xBD 61629 Clock face seven o clock U+1F556 128342 190 0xBE 61630 Clock face eight o clock U+1F557 128343 191 0xBF 61631 Clock face nine o clock U+1F558 128344 192 0xC0 61632 Clock face ten o clock U+1F559 128345 193 0xC1 61633 Clock face eleven o clock U+1F55A 128346 Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Segoe UI Symbol; Symbola Tabelle 7.2 (8 von 10) Wingdings- dez hex 44 PUA 45 Zeichen Name des Zeichens 46 Unicode Unicode (hex) (dez) Font U+1F55B 128347 Segoe UI Symbol; Symbola 2BB0 11184 Symbola 2BB1 11185 Symbola 0xC5 61637 RIBBON ARROW UP LEFT 2BB2 11186 Symbola 198 0xC6 61638 RIBBON ARROW UP RIGHT 2BB3 11187 Symbola 199 0xC7 61639 RIBBON ARROW LEFT UP 2BB4 11188 Symbola 200 0xC8 61640 2BB5 11189 Symbola 201 0xC9 61641 2BB6 11190 Symbola 202 0xCA 61642 2BB7 11191 Symbola 203 0xCB 61643 Quilt square 2 204 0xCC 61644 Black quilt square 2 205 0xCD 61645 206 0xCE 61646 207 0xCF 61647 208 0xD0 61648 209 0xD1 61649 210 194 0xC2 61634 195 0xC3 61635 196 0xC4 61636 197 Clock face twelve o clock RIBBON ARROW DOWN LEFT RIBBON ARROW DOWN RIGHT RIBBON ARROW RIGHT UP RIBBON ARROW LEFT DOWN RIBBON ARROW RIGHT DOWN TURNED SOUTH WEST POINTING LEAF TURNED NORTH WEST POINTING LEAF Leaf counterclockwise south east Leaf counterclockwise north east U+1F655 128597 Symbola U+1F654 128596 Symbola U+1F657 128599 Symbola U+1F656 128598 Symbola Leaf north west U+1F650 128592 Symbola 0xD2 61650 Leaf south west U+1F651 128593 Symbola 211 0xD3 61651 Leaf north east U+1F652 128594 Symbola 212 0xD4 61652 Leaf south east U+1F653 128595 Symbola 213 0xD5 61653 Erase to the left U+232B 9003 Arial Unicode 214 0xD6 61654 Erase to the right U+2326 8998 Cambria Math 215 0xD7 61655 Three-D top-lighted leftwards arrowhead 216 0xD8 61656 U+27A2 10146 Arial Unicode 217 0xD9 61657 218 0xDA 61658 219 0xDB 61659 U+2B88 11144 Symbola 220 0xDC 61660 U+27B2 10162 Arial Unicode Three-D top-lighted rightwards arrowhead Three-D right-lighted upwards arrowhead Three-D left-lighted downwards arrowhead LEFTWARDS BLACK CIRCLED WHITE ARROW Circled heavy white rightwards arrow 97 Tabelle 7.2 (9 von 10) Wingdings- dez hex 44 PUA 45 Zeichen Name des Zeichens 46 RIGHTWARDS BLACK CIRCLED WHITE ARROW 98 221 0xDD 61661 222 0xDE 61662 223 0xDF 61663 224 0xE0 61664 225 0xE1 61665 226 0xE2 61666 227 0xE3 61667 228 0xE4 61668 229 0xE5 61669 230 0xE6 61670 231 0xE7 61671 232 0xE8 61672 233 0xE9 61673 234 0xEA 61674 235 0xEB 61675 236 0xEC 61676 237 0xED 61677 238 0xEE 61678 239 0xEF 61679 240 0xF0 241 UPWARDS BLACK CIRCLED WHITE ARROW DOWNWARDS BLACK CIRCLED WHITE ARROW WIDE-HEADED LEFTWARDS LIGHT BARB ARROW WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW WIDE-HEADED UPWARDS LIGHT BARB ARROW WIDE-HEADED DOWNWARDS LIGHT BARB ARROW WIDE-HEADED NORTH WEST BARB ARROW WIDE-HEADED NORTH EAST BARB ARROW WIDE-HEADED SOUTH WEST BARB ARROW WIDE-HEADED SOUTH EAST BARB ARROW WIDE-HEADED LEFTWARDS HEAVY BARB ARROW Heavy wide-headed rightwards arrow HEAVY WIDE-HEADED UPWARDS ARROW HEAVY WIDE-HEADED DOWNWARDS ARROW HEAVY WIDE-HEADED NORTH WEST ARROW HEAVY WIDE-HEADED NORTH EAST ARROW HEAVY WIDE-HEADED SOUTH WEST ARROW HEAVY WIDE-HEADED SOUTH EAST ARROW Unicode Unicode (hex) (dez) Font U+2B8A 11146 Symbola U+2B89 11145 Symbola U+2B8B 11147 Symbola U+1F860 129120 Symbola U+1F862 129122 Symbola U+1F861 129121 Symbola U+1F863 129123 Symbola U+1F86C 129132 Symbola U+1F86D 129133 Symbola U+1F86F 129135 Symbola U+1F86E 129134 Symbola 1F878 129144 Symbola U+2794 10132 Arial Unicode 1F879 129145 Symbola 1F873 129139 Symbola 1F874 129140 Symbola 1F875 129141 Symbola 1F877 129143 Symbola 1F876 129142 Symbola Leftwards white arrow U+21E6 8678 Cambria 61680 Rightwards white arrow U+21E8 8680 Cambria 0xF1 61681 Upwards white arrow U+21E7 8679 Cambria 242 0xF2 61682 Downwards white arrow U+21E9 8681 Cambria 243 0xF3 61683 Left right white arrow U+2B04 11012 Cambria 244 0xF4 61684 Up down white arrow U+21F3 8691 Cambria Tabelle 7.2 (10 von 10) Wingdings- dez hex 44 PUA 45 Zeichen Name des Zeichens 46 Unicode Unicode (hex) (dez) Font (nicht ganz entsprechend) 245 0xF5 61685 NORTH WEST DOUBLE U+21D6 8662 Cambria Math U+21D7 8663 Cambria Math U+21D9 8665 Cambria Math U+21D8 8664 Cambria Math White rectangle U+25AD 9645 Cambria Math Times New Roman ARROW NORTH EAST DOUBLE 246 0xF6 61686 247 0xF7 61687 248 0xF8 61688 249 0xF9 61689 250 0xFA 61690 White small square U+25AB 9643 251 0xFB 61691 Ballot X U+2717 10007 Arial Unicode 252 0xFC 61692 Check mark U+2713 10003 Arial Unicode Ballot box with X (font-weight: bold) U+2612 9746 Arial Unicode X IN A RECTANGLE BOX U+2327 8999 Cambria U+2611 9745 Arial Unicode 253 0xFD 61693 ARROW SOUTH WEST DOUBLE ARROW SOUTH EAST DOUBLE ARROW 254 0xFE 61694 Ballot box with check (font-weight: bold) 255 0xFF Windows logo 61695 7.3.1 Auswertung der geeigneten Ersatz-Schriftarten für "Wingdings" Von den 224 Zeichen der Schriftart Wingdings lassen sich 156 Zeichen durch UnicodeZeichen ersetzen, die im Computer mit Word 2010 vorhanden sind: — 46 mit Cambria; — 6 mit Cambria Math (die nicht mit Cambria darstellbar sind); — 5 weitere Zeichen mit Times New Roman oder Arial, die nicht mit Cambria darstellbar sind; — 112 Zeichen mit Arial Unicode, davon 66 Zeichen, die nicht mit Cambria darstellbar sind (im Makro werden 60 Zeichen mit Arial Unicode wiedergegeben); — 30 Zeichen mit Segoe UI Symbol, die nicht mit den obigen Fonts darstellbar sind; Für den Ersatz von weiteren Wingdings-Zeichen ist, soweit Unicode-Entsprechungen existieren, ein zusätzlicher Font nötig wie "Symbola" [10], der aber im Internet zum kostenlosen Download angeboten wird. Bei Verwendung von "Symbola" wird übrigens "Segoe UI Symbol" überflüssig. Es lassen sich damit die meisten der noch fehlenden Wingdings-Zeichen ersetzen (in der obigen Tabelle 3.2 in roter Schrift). Für 22 Wingdings-Zeichen habe ich noch keine Ersatzzeichen gefunden. Ob es dazu überhaupt welche gibt, weiß ich nicht. 99 7.4 Einige gelöste Probleme 7.4.1 Erzeugung von Zeichen einer höherer Unicode-Ebene Der Makro-Befehl "Chr(#)" ist nur bis zum dezimalen Code 254 geeignet. Für Zeichen mit mit höherem Dezimalcode bis 65 535 ist der Befehl "ChrW(#)" geeignet. Für Zeichen aus höheren Unicode-Ebenen ist zu tricksen, dafür kann man in Word die sogenannten "Surrogate" nutzen. Tabelle 7.3: Einige Unicode-Bereiche Ebene Unicode (hexadezimal) 0 bis FF Unicode (dezimal) 0 bis 255 00 00 bis FF FF 0 bis 65535 Surrogat 1 (High Surrogates ) D8 00 bis DB FF 55 296 bis 56 319 Surrogat 2 (Low Surrogates ) DC 00 bis DF FF 56 320 bis 57 343 Unicode Blöcke ASCII-Bereich Ebene 0: BMP (Basic Multilingual Plane) Befehl Chr(#) ... 0 ChrW(#) ... 1 Ebene 1: SMP (Supplementary Multilingual Plane) 65 536 bis 1 00 00 bis 1 FF FF 131 071 ChrW(#) funktioniert hier nicht! Der Unicode-Wert wird in zwei 16-Bit-Codewerte, sogenannte "Surrogate", zerlegt. Dieses war in ISO/IEC 10646:2003, Anhang C 48, beschrieben. Ich programmierte hieraus eine Funktion "ChrXXL(#)". 7.4.2 Fehlende Freiheit zur Wahl der Schriftart bei einigen Zeichen seit der Installation des Kompatibilitäts-Pack Bei einigen Zeichen kann in Word die Schriftart nicht mehr frei gewählt werden. Möglicherweise ist das eine Folge der Installation des Kompatibilitäts-Pack für ".docx"Dateien in Word 2000. Am krassesten ist dies in Word 2000 bei "NEGATIVE CIRCLED DIGIT ZERO", wo Word 2000 zwangsweise Arial Unicode zugeordnet, obwohl Arial Unicode dieses Zeichen nicht hat (Stand: 10. August 2014), und selbst von Hand lässt sich hier keine andere Schriftart zuordnen (obwohl vier (4!) bei mir vorhandene Schriftarten dieses Zeichen haben und es auch bis Frühjahr 2014 funktionierte!). 48 100 Inzwischen ersetzt, aber in der Neuausgabe findet sich die Rechenformel nicht mehr in dieser Form. 139 0x8B 61579 NEGATIVE CIRCLED U+24FF DIGIT ZERO 9471 ⓿ Cambria; RomanCyrillic Std; Code 2000; Everson Bild 7.1: Auszug aus Tabellen 7.2: "NEGATIVE CIRCLED DIGIT ZERO" Jedoch auch in Word 2010 kann ich bei einigen Zeichen die Schriftart nicht mehr per Makro wählen. Es funktioniert dort immerhin noch die Zuweisung per Hand. Abhilfe: Schutz per Feldfunktion "Symbol-Feld" Sonderzeichen können mitsamt Schriftart und Schriftgröße mittels einer Feldfunktion gegen versehentliche Veränderungen von Schriftart und Schriftgröße geschützt werden, und es hilft auch, wenn Word bei einigen Sonderzeichen jetzt keine freie Wahl des Fonts mehr erlaubt (Stand August bis November 2014). ANMERKUNG: Die im Folgenden gezeigten Feld-Inhalte werden auf dem Bildschirm an der Cursorstelle jeweils mit Shift + F9 angezeigt oder mittels Anklicken mit rechter Maustaste und Wählen "Feldfunktion aus/ein". b) Feldergebnis, nach nochmaligem Drücken von Strg + F9: Das Zeichen Omega kann sein: Ω,Ω,Ω; bzw. mit Unicode: Ω,Ω, Ω. Bild 7.2: Screenshot von Buchstaben, die mit Feldfunktion geschützt sind Will man Unicode-Zeichen festlegen (d. h. Codes über dezimal 255 nach ISO/IEC 10646), ist im Feld zusätzlich der Schalter "\u" zu setzen. Verwendet man dabei hexadezimale Codes, ist "0x" vor den Zahlenwert zu setzen (siehe auch das Beispiel des letzten Omega in Bild 7.2). Die wichtigesten Schalter der Feldfunktion \f Der gewünschte Name der Schriftart, die das einzufügende Zeichen enthält. \s Die gewünschte Schriftgröße in Punkt (optional). \u Für Unicode nötiger Schalter (für alle Zeichen mit Codes über dezimal 255). Legt fest, dass Unicode-Zeichen verwendet werden. Man sieht im Bild oben, dass man für die Schriftart "Symbol" keinen Schalter "/u" setzt, weil diese kein Unicode ist. 101 7.4.3 Dokumentvorlage mit fertigen Makros und Buttons Die Makros aus Abschnitt 7.6 und aus Abschnitt 8 habe ich in meiner fertig downloadbaren Dokumentvorlage ergänzt, in dem ich bereits das Makro zur Analyse von Schrift- und Sonderzeichen untergebracht hatte, siehe [2] und Impressum. Das folgende Bild zeigt die Symbolleiste dieser Dokumentvorlage in Word 2000 und Word 2003. In Word 2007 und höher sind diese Symbolleisten über das Ribbon-Tab "AddIns" zugänglich. Bild 7.3: Screenshot der Dokumentvorlage "Unicode-Makros-kompakt.dot" Ich selbst verwende allerdings meistens lieber Tastenkürzel. 7.5 Problem bei fehlender Schriftart "Symbola" Wenn der Anwender eine der verwendeten Fonts (Schriftarten) nicht hat, muss er das Makro entsprechend abändern oder sich die Schriftart aus dem Internet downloaden. Um dem Anwender der fertigen Dokumentvorlage mit Makro (siehe 7.4.3) dessen Anwendung zu erleichtern, habe ich im Makro eine Abfrage eingebaut, so dass beim Fehlen der zu installierenden Schriftart "Symbola" keine Unicode-Zeichen erzeugt werden, die nur mit "Symbola" darstellbar sind. Nicht in Unicode darstellbare Zeichen werden entsprechend eingefärbt. Dafür habe ich in der Dokumentvorlage drei zusätzliche Unterprozeduren eingebaut: ' Wenn Symbola installiert, dieses verwenden: If Fkt_FontIsInstalled("Symbola") = True Then ''MsgBox "Es ist Symbola vorhanden." Call Wingdings_Symbola(ys) ' Unterprozedur für Ersatz mit Symbola ohne Segoe Else ''MsgBox "Es wird Segoe UI Symbol verwendet." Call Wingdings_Segoe(ys) ' Unterprozedur für Ersatz nur mit Segoe End If Private Function Fkt_FontIsInstalled(FontName As String) As Boolean ' Quelle: Mehrere Internet-Quellen (herber.de und ms-office-formum.net), ' Download 21.12.2014. Dim sFond As New StdFont sFond.Name = FontName Fkt_FontIsInstalled = StrComp(FontName, sFond.Name, vbTextCompare) = 0 End Function 102 7.6 Das fertige Makro zum Ersatz der Windows-Sonderschriftarten "Symbol" und "Wingdings" durch Unicode-Zeichen ' Makromodul "Symbol_Wingdings_in_Unicode" Option Explicit ' Makro zum Entfernen der Fonts "Symbol" und "Wingdings" für Word 2000 und höher. ' Dipl.-Ing. H. Chris Gast, Berlin (c) 2010/2011, neu August 2014, Stand 8. Juni 2015. ' http://www.siebener-kurier.de/chris-aufsaetze ' ' Funktioniert von Word 2000 bis Word 2010, Windows XP und Windows 7. ' Dieses Makro ersetzt gründlich alle Symbol- und die Wingdings-Zeichen, soweit möglich. ' ' Die ersetzen Symbol- und die Wingdings-Zeichen werden gelb markiert, ' die nicht-ersetzten werden rot markiert. ' Unerkannte Zeichen (zum Beipiel Webdings) und Windows-Sonderzeichen ' mit kombinierenden Zeichen werden dunkelrosa markiert. ' ' Dieses Makro erfasst auch Fälle von Word-Dokumenten, wo das bisherige Makro von 2009 versagte. ' ' Das vorübergehende Abschalten der Bildschirm-Aktalisierung beschleunigt das Makro. ' ' Zeitmessung, auf eine Stelle gerundet. ' ' "mü" und "Omega" werden je nach steil oder kursiv unterschiedlich ersetzt. ' ' Bei einigen ersetzten Zeichen habe ich jetzt die Schriftart (Font) durch Feldfunktion geschützt, ' weil bei diesen die Font-Zuweisung seit Installation des Kompatibilitätspack für ".docx" ' nicht mehr funktioniert (2014). Dies machte ich jedoch (noch) nicht in allen Fällen. ' ' Wenn es die Schriftart "Symbola" auf dem Computer gibt, wird diese beim Ersatz ' von Wingdingszeichen bevorzugt (Bezugsquelle: George Douros, http://users.teilar.gr/~g1951d). ' Private jSymbWingErsetztes As Integer ' ersetzte Windows-Sonderzeichen Private jNichtersetztes As Integer ' nicht-ersetzte Windows-Sonderzeichen Private jUnerkanntes As Integer ' unklare Zeichen Sub Symbol_Wingdings_in_Unicode_im_gesamten_Dokument() ' Dipl.-Ing Hanna-Chris Gast, 2011, neu August 2014, 23. November 2014, 8. Juni 2015. ' Rahmenprozedur, ruft alle Dokumentkomponenten auf ' (außer Kopf- und Fußzeilen in weiteren Sections). ' ******************************************************** Dim rng0 As Range ' Cursorposition vor Beginn des Makros Dim Ansichtstyp1 As Integer Dim Rng1 As Range ' jeweilige Dokumentkomponente ' ********************************************** ' Zeitmessen für die Makromodul-Dauer Dim Zeit1 As Single Dim Zeit2 As Single Dim Zeitdauer As Single Zeit1 = Timer ' ********************************************** ' Ursprüngliche Markierung merken: Set rng0 = Selection.Range ' ********************************************** StatusBar = " Bitte warten - das Makro läuft." ' ********************************************** ' Zur Beschleunigung Bildschirmaktualisierung während des Programms abstellen: 103 Application.ScreenUpdating = False Options.Pagination = False ' ********************************************** ' Zuerst die vorhandene Bildschirmansicht speichern und ggf. Bildschirm auf "Normalansicht" stellen: Ansichtstyp1 = (ActiveWindow.View.Type) If ActiveWindow.View.Type = wdNormalView = False Then ActiveWindow.View.Type = wdNormalView End If ' ********************************************** ''' Zuerst alle_Markierfarben beseitigen im Hauptteil, in Fußnoten und in Kopfzeilen usw. ''' (erfasst nicht Kopf- und Fußzeilen weiterer Sections). '' For Each Rng1 In ActiveDocument.StoryRanges '' Rng1.HighlightColorIndex = wdNoHighlight '' Rng1.Font.Shading.BackgroundPatternColor = wdColorAutomatic '' Rng1.Font.Color = wdColorAutomatic '' Next Rng1 ' ********************************************** ' Zählung der Kombinierten Zeichen auf Null stellen: jUnerkanntes = 0 jSymbWingErsetztes = 0 jNichtersetztes = 0 ' ********************************************** ' Aufruf der eigentlichen Suche in allen Dokumentkomponenten ' (Kopf- und Fußzeilen in weiteren Sections werden nicht erfasst): For Each Rng1 In ActiveDocument.StoryRanges Call Symbol_Wingdings_in_Cambria(Rng1) Next Rng1 ' ********************************************** ' In Hauptkomponente zurückkehren: ActiveDocument.StoryRanges(wdMainTextStory).Select If ActiveWindow.View.SplitSpecial <> wdPaneNone Then ActiveWindow.View.Type = wdPrintView End If ' ********************************************** ' Markierfarbe wieder zurückstellen: Options.DefaultHighlightColorIndex = wdYellow ' Alte Cursorposition wieder herstellen: rng0.Select ' Ansichtstyp zurückstellen, Seitenumbrüche und Bildschirm wieder anzeigen: ActiveWindow.View.Type = Ansichtstyp1 Options.Pagination = True Application.ScreenUpdating = True ' Alte Cursorposition wieder herstellen: rng0.Select ' ************************************ ' Im Suchen/Ersetzen-Menü alles zurückstellen Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With ' ************************************** ' Zeitmessen für die Makromodul-Dauer: 104 Zeit2 = Timer Zeitdauer = Format((Zeit2 - Zeit1), "##,##0.000") Zeitdauer = Round(Zeitdauer, 1) ' ************************************* ' Protokoll: If jUnerkanntes > 0 Then ' es gab Zeichen, die nicht erkannt wurden, etwa weitere Windows-Sonderschriftarten. MsgBox "Die " & jSymbWingErsetztes _ & " ersetzten Symbol- und Wingdings-Zeichen wurden gelb, " _ & vbCrLf & "die " & jNichtersetztes & " nicht ersetzten Zeichen wurden rot markiert." _ & vbCrLf & "Es gab " & jUnerkanntes & " unerkannte Zeichen (rosa gefärbt)." _ & vbCrLf & vbCrLf & "Die Rechenzeit betrug " & Zeitdauer & " Sekunden." Else ' alle Zeichen wurden erkannt. MsgBox "Die " & jSymbWingErsetztes _ & " ersetzten Symbol- und Wingdings-Zeichen wurden gelb, " _ & vbCrLf & "die " & jNichtersetztes & " nicht ersetzten Zeichen rot markiert." _ & vbCrLf & vbCrLf & "Die Rechenzeit betrug " & Zeitdauer & " Sekunden." End If End Sub ' --------------------------------------------------------------------------------------------------------- Sub Symbol_Wingdings_in_Unicode_nur_Markierten_Text() ' Dipl.-Ing Hanna-Chris Gast, 26. September 2014. Dim rng0 As Range Set rng0 = Selection.Range Call Symbol_Wingdings_in_Cambria(rng0) rng0.Select End Sub ' --------------------------------------------------------------------------------------------------------- Private Sub Symbol_Wingdings_in_Cambria(Rng1) ' Hanna-Chris Gast, 2011, neu August 2014, September 2014, 8. Juni + 3. August 2015. ' Im jeweiligen Range bzw. Markierung (und nur dort!) alle Symbol- und Wingdings-Zeichen ' durch Unicode-Zeichen soweit wie möglich durch Unicode ersetzen, ' ansonsten rot markieren. ' Unklare Zeichen werden dunkelrosa markiert. Dim chara As Variant Dim fs As String Dim ys As Long ' Vorab in allen Dokument-Komponenten Schriftart "SymbolPS" durch "Symbol" ersetzen ' (dies ist für Computer ohne diese Schriftart wichtig): Rng1.Find.ClearFormatting Rng1.Find.Font.NameAscii = "SymbolPS" Rng1.Find.Replacement.ClearFormatting Rng1.Find.Replacement.Font.Name = "Symbol" With Rng1.Find .Text = "" .Replacement.Text = "" .Forward = True '' .Wrap = wdFindContinue .Format = True ' Wichtig! .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Rng1.Find.Execute Replace:=wdReplaceAll ' ************************************ 105 ' Jedes einzelne Zeichen wird mit "Einfügen-Symbol" danach abgefragt, ' ob es ein Windows-Sonderzeichen ist: For Each chara In Rng1.Characters ' ****** If Asc(chara.Text) < 32 Then ' Steuerzeichen in einer normale Schriftart setzen(3. August 2015): chara.Font.Name = ActiveDocument.Styles(wdStyleNormal).Font.Name ElseIf chara.Text = "(" Or chara.Text Like "[" & ChrW(61472) & "-" & ChrW(61695) & "]" Then chara.Select With Dialogs(wdDialogInsertSymbol) fs = .Font ys = .charNum End With ' If fs <> "(normaler Text)" And fs <> "" _ Or ys < 0 And chara.Text = "(" Then ys = (ys + 4096 + 61440) If fs = "Symbol" Or fs = "SymbolPS" Then jSymbWingErsetztes = jSymbWingErsetztes + 1 Call Symbol_U(ys) ElseIf fs = "Wingdings" Then jSymbWingErsetztes = jSymbWingErsetztes + 1 Call Wingdings_U(ys) Else ' sonstige Windows-Sonderschriftart: '' chara.Font.Color = wdColorRed Selection.Range.HighlightColorIndex = wdPink jUnerkanntes = jUnerkanntes + 1 ''' Else ''' '' MsgBox "Achtung, unerkannte Schriftart!" ''' fs = "???" ''' Selection.Range.HighlightColorIndex = wdRed ' rot ''' jUnerkanntes = jUnerkanntes + 1 ''' ' ((färbte mir fälschlich alle "Klammer-Auf"-Zeichen!)) End If End If End If ' ****** Next chara ' ****************************************************************** ' Windows-Sonderzeichen mit einem diakritischen Unicode-Zeichen suchen und rot markieren ' (diese zusätzliche Abfrage ist nur ab Word 2003 nötig, da dort der obige ' Ersatz durch Unicode-Zeichen nicht funktioniert): Rng1.Select Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "?[" & ChrW(768) & "-" & ChrW(879) & "]" .Replacement.Text = "" .Highlight = False .Forward = True .MatchWildcards = True ' ist hier unbedingt nötig!!! Do While .Execute ' (tue, solange etwas gefunden wird) If InStr(Rng1, Selection) = 0 Then Exit Do If Dialogs(wdDialogInsertSymbol).Font <> "(normaler Text)" Then Selection.Range.HighlightColorIndex = wdPink ' wdRed jUnerkanntes = jUnerkanntes + 1 End If Loop End With ' ************************** ' und nun Windows-Sonderzeichen mit 2 diakritischen Zeichen (für Word 2003 aufwärts): 106 Rng1.Select Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "?[" & ChrW(768) & "-" & ChrW(879) & "][" & ChrW(768) & "-" & ChrW(879) & "]" .Replacement.Text = "" .Highlight = False .Forward = True .MatchWildcards = True ' ist hier unbedingt nötig!!! Do While .Execute ' (tue, solange etwas gefunden wird) If InStr(Rng1, Selection) = 0 Then Exit Do If Dialogs(wdDialogInsertSymbol).Font <> "(normaler Text)" Then Selection.Range.HighlightColorIndex = wdPink jUnerkanntes = jUnerkanntes + 1 End If Loop End With ' ************************** ' Restliche (unzulässige?) Zeichen in der Private-Use-Area rot markieren, ' aber keine normale "Klammer auf" wie in der Schleife oben: Rng1.Select Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "[" & ChrW(61473) & "-" & ChrW(61695) & "]" .Replacement.Text = "" .Highlight = False .Forward = True .MatchWildcards = True ' ist hier unbedingt nötig!!! Do While .Execute ' (tue, solange etwas gefunden wird) If InStr(Rng1, Selection) = 0 Then Exit Do fs = Dialogs(wdDialogInsertSymbol).Font ' Abfrage, ob Symbol, Wingdings oder sonstige Sonderschrift: ' Wenn Schriftart unklar, Fragezeichen setzen und rot markieren. If fs = "(normaler Text)" Or fs = "" Then '' MsgBox "Achtung!" fs = "???" Selection.Range.HighlightColorIndex = wdPink '' wdRed ' rot jUnerkanntes = jUnerkanntes + 1 End If Loop End With End Sub ' --------------------------------------------------------------------------------------------------------- Private Sub Symbol_U(ys) ' H. Chris Gast, April 2011, für Cambria August 2014, 23. November 2014, 8. Juni 2015. ' Mit dieser Unterprozedur werden Symbol-Zeichen durch Cambria-Zeichen ersetzt, ' soweit möglich, bei zwei Zeichen durch Times New Roman. ' Mit Feldfunktionen wird bei einigen Zeichen die Schriftart erzwungen. Select Case ys Case Is = 61472 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(160) ' NO-BREAK SPACE Case Is = 61473 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(33) ' EXCLAMATION MARK 107 Case Is = 61474 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8704) ' FOR ALL Case Is = 61475 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(35) ' NUMBER SIGN Case Is = 61476 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8707) ' THERE EXISTS Case Is = 61477 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(37) ' PERCENT SIGN Case Is = 61478 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(38) ' AMPERSAND Case Is = 61479 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8715) ' CONTAINS AS MEMBER Case Is = 61480 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(40) ' LEFT PARENTHESIS Case Is = 61481 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(41) ' RIGHT PARENTHESIS Case Is = 61482 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8727) ' ASTERISK OPERATOR Case Is = 61483 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(43) ' PLUS SIGN Case Is = 61484 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(44) ' COMMA Case Is = 61485 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8722) ' MINUS SIGN Case Is = 61486 Selection.Font.Name = "Cambria" 108 Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(46) ' FULL STOP Case Is = 61487 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(47) ' SOLIDUS Case Is = 61488 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(48) ' DIGIT ZERO Case Is = 61489 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(49) ' DIGIT ONE Case Is = 61490 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(50) ' DIGIT TWO Case Is = 61491 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(51) ' DIGIT THREE Case Is = 61492 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(52) ' DIGIT FOUR Case Is = 61493 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(53) ' DIGIT FIVE Case Is = 61494 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(54) ' DIGIT SIX Case Is = 61495 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(55) ' DIGIT SEVEN Case Is = 61496 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(56) ' DIGIT EIGHT Case Is = 61497 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(57) ' DIGIT NINE Case Is = 61498 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(58) 109 ' COLON Case Is = 61499 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(59) ' SEMICOLON Case Is = 61500 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(60) ' LESS-THAN SIGN Case Is = 61501 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(61) ' EQUALS SIGN Case Is = 61502 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(62) ' GREATER-THAN SIGN Case Is = 61503 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(63) ' QUESTION MARK Case Is = 61504 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8773) ' APPROXIMATELY EQUAL TO Case Is = 61505 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(913) ' GREEK CAPITAL LETTER ALPHA Case Is = 61506 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(914) ' GREEK CAPITAL LETTER BETA Case Is = 61507 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(935) ' GREEK CAPITAL LETTER CHI Case Is = 61508 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow ''Selection.TypeText Text:=ChrW(8710) ' GREEK CAPITAL LETTER DELTA oder INCREMENT ' Das Delta-Zeichen ist immer steil, ein Formelzeichen ist kursiv: If Selection.Font.Italic = True Then Selection.TypeText Text:=ChrW(916) ' GREEK CAPITAL LETTER OMEGA (als Formelzeichen kursiv) Else Selection.TypeText Text:=ChrW(8710) ' Das "Increment" ist stets steil. End If Case Is = 61509 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow 110 Selection.TypeText Text:=ChrW(917) ' GREEK CAPITAL LETTER EPSILON Case Is = 61510 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(934) ' GREEK CAPITAL LETTER PHI Case Is = 61511 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(915) ' GREEK CAPITAL LETTER GAMMA Case Is = 61512 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(919) ' GREEK CAPITAL LETTER ETA Case Is = 61513 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(921) ' GREEK CAPITAL LETTER IOTA Case Is = 61514 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(977) ' GREEK THETA SYMBOL Case Is = 61515 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(922) ' GREEK CAPITAL LETTER KAPPA Case Is = 61516 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(923) ' GREEK CAPITAL LETTER LAMDA Case Is = 61517 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(924) ' GREEK CAPITAL LETTER MU Case Is = 61518 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(925) ' GREEK CAPITAL LETTER NU Case Is = 61519 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(927) ' GREEK CAPITAL LETTER OMICRON Case Is = 61520 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(928) ' GREEK CAPITAL LETTER PI Case Is = 61521 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(920) ' GREEK CAPITAL LETTER THETA 111 Case Is = 61522 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(929) ' GREEK CAPITAL LETTER RHO Case Is = 61523 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(931) ' GREEK CAPITAL LETTER SIGMA Case Is = 61524 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(932) ' GREEK CAPITAL LETTER TAU Case Is = 61525 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(933) ' GREEK CAPITAL LETTER UPSILON Case Is = 61526 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(962) ' GREEK SMALL LETTER FINAL SIGMA Case Is = 61527 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow '' Selection.TypeText Text:=ChrW(937) ' GREEK CAPITAL LETTER OMEGA oder OHM SIGN, dez. 8486 ' Das Ohmzeichen ist immer steil, ein Formelzeichen kursiv: If Selection.Font.Italic = True Then Selection.Text = ChrW(937) ' GREEK CAPITAL LETTER OMEGA Else Selection.Text = ChrW(8486) ' OHM SIGN, dez. 8486 ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen End If Case Is = 61528 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(926) ' GREEK CAPITAL LETTER XI Case Is = 61529 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(936) ' GREEK CAPITAL LETTER PSI Case Is = 61530 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(918) ' GREEK CAPITAL LETTER ZETA Case Is = 61531 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(91) ' LEFT SQUARE BRACKET Case Is = 61532 Selection.Font.Name = "Cambria" 112 Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8756) ' THEREFORE Case Is = 61533 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(93) ' RIGHT SQUARE BRACKET Case Is = 61534 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8869) ' UP TACK Case Is = 61535 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(95) ' LOW LINE Case Is = 61537 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(945) ' GREEK SMALL LETTER ALPHA Case Is = 61538 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(946) ' GREEK SMALL LETTER BETA Case Is = 61539 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(967) ' GREEK SMALL LETTER CHI Case Is = 61540 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(948) ' GREEK SMALL LETTER DELTA Case Is = 61541 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(949) ' GREEK SMALL LETTER EPSILON Case Is = 61542 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(981) ' korrigiert, GREEK PHI SYMBOL Case Is = 61543 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(947) ' GREEK SMALL LETTER GAMMA Case Is = 61544 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(951) ' GREEK SMALL LETTER ETA Case Is = 61545 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(953) 113 ' GREEK SMALL LETTER IOTA Case Is = 61546 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(966) ' korrigiert, GREEK SMALL LETTER PHI Case Is = 61547 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(954) ' GREEK SMALL LETTER KAPPA Case Is = 61548 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(955) ' GREEK SMALL LETTER LAMDA Case Is = 61549 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow '' Selection.TypeText Text:=ChrW(956) ' GREEK SMALL LETTER MU, könnte auch MICRO SIGN, dez. 181, sein. ' Formelzeichen werden kursiv geschrieben, das Mikrozeichen steil: If Selection.Font.Italic = True Then Selection.TypeText Text:=ChrW(956) ' GREEK CAPITAL LETTER MU Else Selection.TypeText Text:="µ" End If Case Is = 61550 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(957) ' GREEK SMALL LETTER NU Case Is = 61551 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(959) ' GREEK SMALL LETTER OMICRON Case Is = 61552 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(960) ' GREEK SMALL LETTER PI Case Is = 61553 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(952) ' GREEK SMALL LETTER THETA Case Is = 61554 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(961) ' GREEK SMALL LETTER RHO Case Is = 61555 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(963) ' GREEK SMALL LETTER SIGMA Case Is = 61556 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(964) 114 ' GREEK SMALL LETTER TAU Case Is = 61557 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(965) ' GREEK SMALL LETTER UPSILON Case Is = 61558 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(982) ' GREEK PI SYMBOL Case Is = 61559 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(969) ' GREEK SMALL LETTER OMEGA Case Is = 61560 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(958) ' GREEK SMALL LETTER XI Case Is = 61561 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(968) ' GREEK SMALL LETTER PSI Case Is = 61562 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(950) ' GREEK SMALL LETTER ZETA Case Is = 61563 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(123) ' LEFT CURLY BRACKET Case Is = 61564 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(124) ' VERTICAL LINE Case Is = 61565 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(125) ' RIGHT CURLY BRACKET Case Is = 61566 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow ''Selection.TypeText Text:=ChrW(8764) ' ergibt fälschlich exotischen Font ' TILDE Operator wegen Gleichheit mit Letex ' eigentlich reicht die normale Tilde: Selection.Text = ChrW(126) ' *** Case Is = 61600 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8364) ' EURO SIGN, bzw. nicht definiert Case Is = 61601 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow 115 Selection.TypeText Text:=ChrW(978) ' GREEK UPSILON WITH HOOK SYMBOL Case Is = 61602 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow 'Selection.TypeText Text:=ChrW(8242) Selection.Text = ChrW(8242) Selection.Font.Name = "Cambria" ''If Selection.Font.Name <> "Cambria" Then MsgBox "!!!": End ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen ' PRIME Case Is = 61603 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.Text = ChrW(8804) ' LESS-THAN OR EQUAL TO ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen ' *** Case Is = 61604 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8260) ' FRACTION SLASH Case Is = 61605 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.Text = ChrW(8734) ' INFINITY ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen ' *** Case Is = 61606 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(402) ' LATIN SMALL LETTER F WITH HOOK Case Is = 61607 Selection.Font.Name = "Times New Roman" Selection.Range.HighlightColorIndex = wdTeal Selection.TypeText Text:=ChrW(9827) ' BLACK CLUB SUIT Case Is = 61608 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9830) ' BLACK DIAMOND SUIT Case Is = 61609 Selection.Font.Name = "Times New Roman" Selection.Range.HighlightColorIndex = wdTeal Selection.TypeText Text:=ChrW(9829) ' BLACK HEART SUIT Case Is = 61610 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9824) ' BLACK SPADE SUIT Case Is = 61611 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8596) 116 ' LEFT RIGHT ARROW Case Is = 61612 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8592) ' LEFTWARDS ARROW Case Is = 61613 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8593) ' UPWARDS ARROW Case Is = 61614 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8594) ' RIGHTWARDS ARROW Case Is = 61615 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8595) ' DOWNWARDS ARROW Case Is = 61616 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(176) ' DEGREE SIGN Case Is = 61617 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(177) ' PLUS-MINUS SIGN Case Is = 61618 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.Text = ChrW(8243) ' DOUBLE PRIME ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen Case Is = 61619 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow 'Selection.TypeText Text:=ChrW(8805) Selection.Text = ChrW(8805) ' GREATER-THAN OR EQUAL TO ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen Case Is = 61620 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(215) ' MULTIPLICATION SIGN Case Is = 61621 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8733) ' PROPORTIONAL TO Case Is = 61622 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8706) ' PARTIAL DIFFERENTIAL Case Is = 61623 117 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8226) ' BULLET Case Is = 61624 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(247) ' DIVISION SIGN Case Is = 61625 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8800) ' NOT EQUAL TO Case Is = 61626 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8801) ' IDENTICAL TO Case Is = 61627 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.Text = ChrW(8776) ' ALMOST EQUAL TO ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen ' *** Case Is = 61628 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8230) ' HORIZONTAL ELLIPSIS Case Is = 61629 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(124) ' Vertical line extension for arrows Case Is = 61630 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8212) ' horizontal line extension for arrows Case Is = 61631 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8629) ' DOWNWARDS ARROW WITH CORNER LEFTWARDS Case Is = 61632 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8501) ' ALEF SYMBOL Case Is = 61633 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8465) ' BLACK-LETTER CAPITAL I Case Is = 61634 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8476) ' BLACK-LETTER CAPITAL R 118 Case Is = 61635 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8472) ' SCRIPT CAPITAL P Case Is = 61636 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8855) ' CIRCLED TIMES Case Is = 61637 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8853) ' CIRCLED PLUS Case Is = 61638 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.Text = ChrW(8960) ' DIAMETER SIGN (es könnte auch EMPTY SET ChrW(8709), das Zeichen für leere Menge ' sein, für das Cambria ungeeignet ist. Case Is = 61639 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8745) ' INTERSECTION Case Is = 61640 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8746) ' UNION Case Is = 61641 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8835) ' SUPERSET OF Case Is = 61642 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8839) ' SUPERSET OF OR EQUAL TO Case Is = 61643 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8836) ' NOT A SUBSET OF Case Is = 61644 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8834) ' SUBSET OF Case Is = 61645 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8838) ' SUBSET OF OR EQUAL TO Case Is = 61646 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8712) ' ELEMENT OF Case Is = 61647 119 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8713) ' NOT AN ELEMENT OF Case Is = 61648 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8736) ' ANGLE Case Is = 61649 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8711) ' NABLA Case Is = 61650 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(174) ' REGISTERED SIGN,Serifenschrift Case Is = 61651 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(169) ' COPYRIGHT SIGN,Serifenschrift Case Is = 61652 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8482) ' TRADE MARK SIGN, Serifenschrift Case Is = 61653 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8719) ' N-ARY PRODUCT Case Is = 61654 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8730) ' SQUARE ROOT Case Is = 61655 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8901) ' DOT OPERATOR Case Is = 61656 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(172) ' NOT SIGN Case Is = 61657 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8743) ' LOGICAL AND Case Is = 61658 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8744) ' LOGICAL OR Case Is = 61659 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow 120 Selection.TypeText Text:=ChrW(8660) ' LEFT RIGHT DOUBLE ARROW Case Is = 61660 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8656) ' LEFTWARDS DOUBLE ARROW Case Is = 61661 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8657) ' UPWARDS DOUBLE ARROW Case Is = 61662 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8658) ' RIGHTWARDS DOUBLE ARROW Case Is = 61663 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8659) ' DOWNWARDS DOUBLE ARROW Case Is = 61664 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9674) ' LOZENGE Case Is = 61665 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9001) ' LEFT-POINTING ANGLE BRACKET ' (LESS-THAN SIGN = dez. 060) ' (MATHEMATICAL LEFT ANGLE BRACKET, dez. 10216) Case Is = 61666 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdTeal Selection.TypeText Text:=ChrW(174) ' REGISTERED SIGN,sans serif Case Is = 61667 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdTeal Selection.TypeText Text:=ChrW(169) ' COPYRIGHT SIGN,sans serif Case Is = 61668 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdTeal Selection.TypeText Text:=ChrW(8482) ' TRADE MARK SIGN, sans serif Case Is = 61669 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8721) ' N-ARY SUMMATION Case Is = 61670 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9115) ' LEFT PARENTHESIS UPPER HOOK Case Is = 61671 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow 121 Selection.TypeText Text:=ChrW(9116) ' LEFT PARENTHESIS EXTENSION Case Is = 61672 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9117) ' LEFT PARENTHESIS LOWER HOOK Case Is = 61673 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9121) ' LEFT SQUARE BRACKET UPPER CORNER Case Is = 61674 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9122) ' LEFT SQUARE BRACKET EXTENSION Case Is = 61675 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9123) ' LEFT SQUARE BRACKET LOWER CORNER Case Is = 61676 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9127) ' LEFT CURLY BRACKET UPPER HOOK Case Is = 61677 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9128) ' LEFT CURLY BRACKET MIDDLE PIECE Case Is = 61678 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9129) ' LEFT CURLY BRACKET LOWER HOOK Case Is = 61679 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9130) ' CURLY BRACKET EXTENSION Case Is = 61681 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9002) ' RIGHT-POINTING ANGLE BRACKET, ' (GREATER-THAN SIGN = dez. 62) ' (MATHEMATICAL RIGHT ANGLE BRACKET = dez. 10217) Case Is = 61682 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8747) ' INTEGRAL Case Is = 61683 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8992) ' TOP HALF INTEGRAL Case Is = 61684 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow 122 Selection.TypeText Text:=ChrW(9134) ' INTEGRAL EXTENSION Case Is = 61685 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8993) ' BOTTOM HALF INTEGRAL Case Is = 61686 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9118) ' RIGHT PARENTHESIS UPPER HOOK Case Is = 61687 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9119) ' RIGHT PARENTHESIS EXTENSION Case Is = 61688 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9120) ' RIGHT PARENTHESIS LOWER HOOK Case Is = 61689 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9124) ' RIGHT SQUARE BRACKET UPPER CORNER Case Is = 61690 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9125) ' RIGHT SQUARE BRACKET EXTENSION Case Is = 61691 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9126) ' RIGHT SQUARE BRACKET LOWER CORNER Case Is = 61692 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9131) ' RIGHT CURLY BRACKET UPPER HOOK Case Is = 61693 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9132) ' RIGHT CURLY BRACKET MIDDLE PIECE Case Is = 61694 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9133) ' RIGHT CURLY BRACKET LOWER HOOK Case Else ' nicht ersetztes Zeichen: Selection.Range.HighlightColorIndex = wdRed ' Nichtersetztes zählen: jSymbWingErsetztes = jSymbWingErsetztes - 1 ''jUnerkanntes = jUnerkanntes + 1 ' (geändert 8.6.2015) jNichtersetztes = jNichtersetztes + 1 End Select End Sub 123 ' --------------------------------------------------------------------------------------------------------- Private Sub Wingdings_U(ys) ' Erstellt von H. Chris Gast, 2011 + 2012, neu für Cambria August 2014, Stand 21. Dezember 2014. ' Mit dieser Unterprozedur werden Wingdings-Zeichen durch entsprechende Cambria-Zeichen ersetzt, ' soweit möglich. ' Bei einigen Zeichen wird Cambria per Feldfunktion erzwungen (November 2014) ' Weitere Zeichen mit Font "Symbola" ergänzt 18. Dezember 2014. ' Abfrage ergänzt, ob Font "Symbola" vorhanden ist, 21. Dezember 2014. ' ************************** ' Zeichen, die sich durch die Schriftart "Cambria" darstellen lassen: Select Case ys Case Is = 61472 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(32) ' Space = einfaches Leerzeichen Case Is = 61494 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8987) ' Hourglass Case Is = 61495 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9000) ' Keyboard Case Is = 61546 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(38) ' Ampersand, lower-case Case Is = 61547 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(38) ' Ampersand Case Is = 61556 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10731) ' Black lozenge Case Is = 61560 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8999) ' X in a rectangle box Case Is = 61561 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9043) ' APL functional symbol quad up caret Case Is = 61562 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8984) ' Place of interest sign Case Is = 61568 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.Text = ChrW(9450) 124 ' Circled digit zero ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen ' *** Case Is = 61569 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9312) ' Circled digit one Case Is = 61570 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9313) ' Circled digit two Case Is = 61571 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9314) ' Circled digit three Case Is = 61572 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9315) ' Circled digit four Case Is = 61573 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9316) ' Circled digit five Case Is = 61574 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9317) ' Circled digit six Case Is = 61575 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9318) ' Circled digit seven Case Is = 61576 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9319) ' Circled digit eight Case Is = 61577 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9320) ' Circled digit nine Case Is = 61578 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9321) ' Circled number ten Case Is = 61580 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10102) ' Dingbat negative circled digit one Case Is = 61581 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow 125 Selection.TypeText Text:=ChrW(10103) ' Dingbat negative circled digit two Case Is = 61582 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10104) ' Dingbat negative circled digit three Case Is = 61583 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10105) ' Dingbat negative circled digit four Case Is = 61584 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10106) ' Dingbat negative circled digit five Case Is = 61585 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10107) ' Dingbat negative circled digit six Case Is = 61586 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10108) ' Dingbat negative circled digit seven Case Is = 61587 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10109) ' Dingbat negative circled digit eight Case Is = 61588 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10110) ' Dingbat negative circled digit nine Case Is = 61589 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10111) ' Dingbat negative circled number ten Case Is = 61598 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(183) ' Middle dot Case Is = 61599 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8226) ' Bullet Case Is = 61601 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9675) ' White circle Case Is = 61604 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10687) ' CIRCLED BULLET oder "Sun", dez. 9737 126 Case Is = 61617 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8982) ' Position indicator Case Is = 61618 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10209) ' White concave-sided diamond Case Is = 61619 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8977) ' Square lozenge Case Is = 61654 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8998) ' Erase to the right Case Is = 61679 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8678) ' Leftwards white arrow Case Is = 61680 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8680) ' Rightwards white arrow Case Is = 61681 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8679) ' Upwards white arrow Case Is = 61682 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8681) ' Downwards white arrow Case Is = 61683 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11012) ' Left right white arrow Case Is = 61684 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8691) ' Up down white arrow Case Is = 61693 Selection.Font.Name = "Cambria" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8999) ' X in a rectangle box (bzw. Ballot box with x, dez. 9746) ' **************************************************** ' Zeichen,die sich mit "Cambria Math" darstellen lassen: Case Is = 61550 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9632) ' Black square 127 Case Is = 61579 With Selection .Font.Name = "Cambria" ''"Cambria Math" .Text = ChrW(9471) .Range.HighlightColorIndex = wdYellow .Font.Name = "Cambria" ''"Cambria Math" End With ' Negative circled digit zero ' Abhilfe, weil Word hier fälschlich exotische Fonts verwendet: Call Markiertes_mit_Feldfunktion_schuetzen ' *** Case Is = 61685 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8662) ' NORTH WEST DOUBLE ARROW, nicht ganz entsprechend Case Is = 61686 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8663) ' NORTH EAST DOUBLE ARROW Case Is = 61687 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8665) ' SOUTH WEST DOUBLE ARROW Case Is = 61688 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(8664) ' SOUTH EAST DOUBLE ARROW Case Is = 61689 Selection.Font.Name = "Cambria Math" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9645) ' White rectangle ' *************************************************** ' Zeichen, die sich durch die Schriftart "Times New Roman" darstellen lassen: Case Is = 61522 Selection.Font.Name = "Times New Roman" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9788) ' White sun with rays Case Is = 61548 Selection.Font.Name = "Times New Roman" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9679) ' Black circle Case Is = 61600 Selection.Font.Name = "Times New Roman" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9642) ' Black small square (etwas vergrößert) Case Is = 61607 Selection.Font.Name = "Times New Roman" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9642) ' Black small square Case Is = 61690 Selection.Font.Name = "Times New Roman" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9643) 128 ' White small square ' *************************************************** ' Zeichen, die sich durch die Schriftart "Arial Unicode" darstellen lassen: Case Is = 61473 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9999) ' Pencil Case Is = 61474 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9986) ' Black scissors Case Is = 61475 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9985) ' Upper blade scissors Case Is = 61480 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow ' Das schwarze Telefon sieht in "Arial Unicode" sonst zu klein aus: Selection.Font.Size = Selection.Font.Size + 3 Selection.TypeText Text:=ChrW(9742) ' Black telephone Case Is = 61481 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9990) ' Telephone location sign Case Is = 61482 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9993) ' Envelope Case Is = 61502 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9991) ' Tape drive Case Is = 61503 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9997) ' Writing hand Case Is = 61505 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9996) ' Victory hand Case Is = 61509 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9756) ' White left pointing index Case Is = 61510 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9758) ' White right pointing index Case Is = 61511 Selection.Font.Name = "Arial Unicode MS" 129 Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9757) ' White up pointing index Case Is = 61512 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9759) ' White down pointing index Case Is = 61514 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow 'Selection.TypeText Text:=ChrW(9786) ' es gab hier Probleme mit der Schriftart. Selection.Text = ChrW(9786) Selection.Font.Size = Selection.Font.Size + 4 ' etwas größer Selection.Font.Name = "Arial Unicode MS" ' White smiling face Case Is = 61516 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.Text = ChrW(9785) Selection.Font.Size = Selection.Font.Size + 4 ' etwas größer ' White frowning face Case Is = 61518 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9760) ' Skull and crossbones Case Is = 61521 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9992) ' Airplane Case Is = 61524 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10052) ' Snowflake Case Is = 61526 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10014) ' Shadowed white Latin cross Case Is = 61528 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10016) ' Maltese cross Case Is = 61529 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10017) ' Star of David Case Is = 61530 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9770) ' Star and crescent Case Is = 61531 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9775) ' Yin Yang 130 Case Is = 61532 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(2384) ' Devanagari Om Case Is = 61533 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9784) ' Wheel of Dharma Case Is = 61534 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9800) ' Aries Case Is = 61535 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9801) ' Taurus Case Is = 61536 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9802) ' Gemini Case Is = 61537 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9803) ' Cancer Case Is = 61538 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9804) ' Leo Case Is = 61539 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9805) ' Virgo Case Is = 61540 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9806) ' Libra Case Is = 61541 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9807) ' Scorpio Case Is = 61542 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9808) ' Sagittarius Case Is = 61543 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9809) ' Capricorn Case Is = 61544 Selection.Font.Name = "Arial Unicode MS" 131 Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9810) ' Aquarius Case Is = 61545 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9811) ' Pisces Case Is = 61549 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10061) ' Shadowed white circle Case Is = 61551 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9744) ' eigentlich "White square" (dez. 9633), besser passt "Ballot Box". Case Is = 61553 Selection.Font.Name = " Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10065) ' Lower right shadowed white square Case Is = 61554 Selection.Font.Name = " Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10066) ' Upper right shadowed white square Case Is = 61557 Selection.Font.Name = " Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9670) ' Black diamond Case Is = 61558 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10070) ' Black diamond minus white X Case Is = 61563 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10048) ' White florette Case Is = 61564 Selection.Font.Name = " Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10047) ' Black florette Case Is = 61565 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10077) ' Heavy double turned comma quotation mark ornament Case Is = 61566 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10078) ' Heavy double comma quotation mark ornament Case Is = 61567 Selection.Font.Name = "Segoe UI Symbol" '' "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9647) 132 ' (eventuell vergrößern, in Word 2000 wird Arial Unicode gewählt) ' White vertical rectangle Case Is = 61606 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10061) ' SHADOWED WHITE CIRCLE, nur ähnlich Case Is = 61608 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9723) ' White medium square Case Is = 61610 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10022) ' Black four pointed star Case Is = 61611 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9733) ' Black star Case Is = 61612 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10038) ' Six pointed black star Case Is = 61613 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10036) ' Eight pointed black star Case Is = 61614 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10041) ' Twelve pointed black star Case Is = 61615 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10037) ' Eight pointed pinwheel star Case Is = 61621 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10026) ' Circled white star Case Is = 61622 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10032) ' Shadowed white star Case Is = 61653 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9003) ' Erase to the left Case Is = 61656 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10146) ' Three-D top-lighted rightwards arrowhead 133 Case Is = 61660 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10162) ' Circled heavy white rightwards arrow Case Is = 61672 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10132) ' Heavy wide-headed rightwards arrow Case Is = 61691 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10007) ' Ballot X Case Is = 61692 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(10003) ' Check mark Case Is = 61694 Selection.Font.Name = "Arial Unicode MS" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9745) ' Ballot box with check ' ************************************************* Case Else ' ich empfehle, "Symbola" zu installieren, ansonsten ' in Word 2010 "Segoe UI Symbol" zu verwenden. ' Wenn Symbola installiert, dieses verwenden: If Fkt_FontIsInstalled("Symbola") = True Then ''MsgBox "Es ist Symbola vorhanden." Call Wingdings_Symbola(ys) ' Unterprozedur für Ersatz mit Symbola ohne Segoe Else ''MsgBox "Es wird Segoe UI Symbol verwendet." Call Wingdings_Segoe(ys) ' Unterprozedur für Ersatz nur mit Segoe End If End Select End Sub ' --------------------------------------------------------------------------------------------------------- Private Sub Wingdings_Segoe(ys) ' Zeichen, die sich durch die Schriftart "Segoe UI Symbol" darstellen lassen: Select Case ys Case Is = "61476" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128083) ' Eyeglasses Case Is = "61477" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128276) ' Bell Case Is = "61478" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128214) ' Open book Case Is = "61484" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" 134 Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128234) ' Closed mailbox with lowered flag Case Is = "61485" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128235) ' Closed mailbox with raised flag Case Is = 61488 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128193) ' File folder Case Is = "61489" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128194) ' Open file folder Case Is = "61490" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128196) ' Page facing up Case Is = "61498" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128187) ' Personal computer Case Is = "61500" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128190) ' Floppy disk Case Is = "61506" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128076) ' OK hand sign Case Is = "61507" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128077) ' Thumbs up sign Case Is = "61508" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128078) ' Thumbs down sign Case Is = "61515" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128528) ' Neutral face Case Is = "61517" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128163) ' Bomb Case Is = 61519 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9872) 135 ' White flag Case Is = "61523" Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128167) ' Droplet Case Is = 61602 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11093) ' Heavy large circle Case Is = 61623 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128336) ' Clock face one o clock Case Is = 61624 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128337) ' Clock face two o clock Case Is = 61625 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128338) ' Clock face three o clock Case Is = 61626 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128339) ' Clock face four o clock Case Is = 61627 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128340) ' Clock face five o clock Case Is = 61628 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128341) ' Clock face six o clock Case Is = 61629 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128342) ' Clock face seven o clock Case Is = 61630 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128343) ' Clock face eight o clock Case Is = 61631 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128344) ' Clock face nine o clock Case Is = 61632 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128345) ' Clock face ten o clock Case Is = 61633 136 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128346) ' Clock face eleven o clock Case Is = 61634 Selection.Font.Name = "Segoe UI Symbol" ' "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128347) ' Clock face twelve o clock ' ''''''''''''''''''''''''''''''''''''''''' Case Else Selection.Range.HighlightColorIndex = wdRed ' Nichtersetztes zählen: jSymbWingErsetztes = jSymbWingErsetztes - 1 jNichtersetztes = jNichtersetztes + 1 End Select End Sub ' --------------------------------------------------------------------------------------------------------- Private Sub Wingdings_Symbola(ys) ' Zeichen, die sich durch die Fonts "Segoe UI Symbol" oder "Symbola" darstellen lassen: Select Case ys Case Is = "61476" Selection.Font.Name = "Symbola" ' "Segoe UI Symbol" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128083) ' Eyeglasses Case Is = "61477" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128276) ' Bell Case Is = "61478" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128214) ' Open book Case Is = "61484" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128234) ' Closed mailbox with lowered flag Case Is = "61485" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128235) ' Closed mailbox with raised flag Case Is = 61488 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128193) ' File folder Case Is = "61489" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128194) ' Open file folder Case Is = "61490" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128196) 137 ' Page facing up Case Is = "61498" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128187) ' Personal computer Case Is = "61500" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128190) ' Floppy disk Case Is = "61506" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128076) ' OK hand sign Case Is = "61507" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128077) ' Thumbs up sign Case Is = "61508" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128078) ' Thumbs down sign Case Is = "61515" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128528) ' Neutral face Case Is = "61517" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128163) ' Bomb Case Is = 61519 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(9872) ' White flag Case Is = "61523" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128167) ' Droplet Case Is = 61602 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11093) ' Heavy large circle Case Is = 61623 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128336) ' Clock face one o clock Case Is = 61624 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128337) ' Clock face two o clock Case Is = 61625 138 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128338) ' Clock face three o clock Case Is = 61626 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128339) ' Clock face four o clock Case Is = 61627 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128340) ' Clock face five o clock Case Is = 61628 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128341) ' Clock face six o clock Case Is = 61629 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128342) ' Clock face seven o clock Case Is = 61630 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128343) ' Clock face eight o clock Case Is = 61631 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128344) ' Clock face nine o clock Case Is = 61632 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128345) ' Clock face ten o clock Case Is = 61633 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128346) ' Clock face eleven o clock Case Is = 61634 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128347) ' Clock face twelve o clock ' ************************************ ' Für die folgenden Zeichen gibt es in Word 2010 keine passenden Fonts; ' ich fand als freien Download den Font "Symbola" am besten geeignet: ' *********************************************** ' Font "Symbola"" Case Is = "61486" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128236) ' Open mailbox with raised flag Case Is = "61486" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow 139 Selection.TypeText Text:=ChrXXL(128236) ' Open mailbox with raised flag Case Is = "61479" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128367) ' CANDLE Case Is = "61483" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128387) ' STAMPED ENVELOPE Case Is = "61486" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128236) ' OPEN MAILBOX WITH RAISED FLAG Case Is = "61487" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128237) ' OPEN MAILBOX WITH LOWERED FLAG Case Is = "61491" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128463) ' PAGE Case Is = "61492" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128464) ' PAGES Case Is = "61520" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(127985) ' WHITE PENNANT Case Is = "61525" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128326) ' WHITE LATIN CROSS Case Is = "61527" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128328) ' CELTIC CROSS Case Is = "61552" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128912) ' BOLD WHITE SQUARE Case Is = "61603" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128903) ' HEAVY WHITE CIRCLE Case Is = "61605" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128907) ' TARGET 140 Case Is = "61609" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128960) ' LIGHT THREE POINTED BLACK STAR Case Is = "61620" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11217) ' UNCERTAINTY SIGN Case Is = "61635" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11184) ' RIBBON ARROW DOWN LEFT Case Is = "61636" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11185) ' RIBBON ARROW DOWN RIGHT Case Is = "61637" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11186) ' RIBBON ARROW UP LEFT Case Is = "61638" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11187) ' RIBBON ARROW UP RIGHT Case Is = "61639" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11188) ' RIBBON ARROW LEFT UP Case Is = "61640" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11189) ' RIBBON ARROW RIGHT UP Case Is = "61641" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11190) ' RIBBON ARROW LEFT DOWN Case Is = "61642" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11191) ' RIBBON ARROW RIGHT DOWN Case Is = "61645" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128597) ' TURNED SOUTH WEST POINTING LEAF Case Is = "61646" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128596) ' TURNED NORTH WEST POINTING LEAF Case Is = "61647" Selection.Font.Name = "Symbola" 141 Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128599) ' Leaf counterclockwise south east Case Is = "61648" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128598) ' Leaf counterclockwise north east Case Is = "61649" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128592) ' Leaf north west Case Is = "61650" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128593) ' Leaf south west Case Is = "61651" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128594) ' Leaf north east Case Is = "61652" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(128595) ' Leaf south east Case Is = "61659" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11144) ' LEFTWARDS BLACK CIRCLED WHITE ARROW Case Is = "61661" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11145) ' UPWARDS BLACK CIRCLED WHITE ARROW Case Is = "61662" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11147) ' DOWNWARDS BLACK CIRCLED WHITE ARROW Case Is = "61663" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129120) ' WIDE-HEADED LEFTWARDS LIGHT BARB ARROW Case Is = "61664" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129122) ' WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW Case Is = "61665" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129121) ' WIDE-HEADED UPWARDS LIGHT BARB ARROW Case Is = "61666" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129123) 142 ' WIDE-HEADED DOWNWARDS LIGHT BARB ARROW Case Is = "61667" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129132) ' WIDE-HEADED NORTH WEST BARB ARROW Case Is = "61668" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129133) ' WIDE-HEADED NORTH EAST BARB ARROW Case Is = "61669" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129135) ' WIDE-HEADED SOUTH WEST BARB ARROW Case Is = "61670" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129134) ' WIDE-HEADED SOUTH EAST BARB ARROW Case Is = "61671" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129144) ' WIDE-HEADED LEFTWARDS HEAVY BARB ARROW Case Is = "61673" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129145) ' HEAVY WIDE-HEADED UPWARDS ARROW Case Is = "61674" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129139) ' HEAVY WIDE-HEADED DOWNWARDS ARROW Case Is = "61675" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129140) ' HEAVY WIDE-HEADED NORTH WEST ARROW Case Is = "61676" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129141) ' HEAVY WIDE-HEADED NORTH EAST ARROW Case Is = "61677" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129143) ' HEAVY WIDE-HEADED SOUTH WEST ARROW Case Is = "61678" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrXXL(129142) ' HEAVY WIDE-HEADED SOUTH EAST ARROW Case Is = "61559" Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11045) ' BLACK MEDIUM DIAMOND Case Is = "61555" 143 Selection.Font.Name = "Symbola" Selection.Range.HighlightColorIndex = wdYellow Selection.TypeText Text:=ChrW(11047) ' BLACK MEDIUM LOZENGE ' ''''''''''''''''''''''''''''''''''''''''' Case Else '' Selection.Font.Color = wdColorRed Selection.Range.HighlightColorIndex = wdRed ' Nichtersetztes zählen: jSymbWingErsetztes = jSymbWingErsetztes - 1 jNichtersetztes = jNichtersetztes + 1 End Select End Sub ' --------------------------------------------------------------------------------------------------------- Private Function ChrXXL(Code2) As String ' Dipl.-Ing Hanna-Chris Gast, 2011. ' Unterfunktion für Zeichen höherer Ebenen, passend für Word 2000 und höher ' Berechnung nach nach ISO/IEC 10646:2003, Anhang C: Dim Surrogat1 Dim Surrogat2 Surrogat1 = Hex(Int((Code2 - 65536) / 1024) + 55296) Surrogat2 = Hex((Code2 - 65536) - (Int((Code2 - 65536) / 1024) * 1024) + 56320) ChrXXL = ChrW("&H" & Surrogat1) & ChrW("&H" & Surrogat2) End Function ' --------------------------------------------------------------------------------------------------------- Private Sub Markiertes_mit_Feldfunktion_schuetzen() ' H. Chris Gast, 20. November 2014. ' Manchmal wird statt "Cambria" eine exotische Schriftart zugewiesen. ' Dies kann mit einer Feldfunktion verhindert werden. Dim strX As String Dim IntAsc As Integer Dim aChr As Variant ' nicht "Characters"! ' *** For Each aChr In Selection.Range.Characters aChr.Select strX = Selection.Text IntAsc = AscW(strX) If IntAsc > 800 Then Selection.Text = "" Selection.Fields.Add Range:=Selection.Range, _ Type:=wdFieldEmpty, _ PreserveFormatting:=False Selection.Text = "SYMBOL " & IntAsc & " \f Cambria \u" Else Selection.Font.Name = "Cambria" End If Next aChr ActiveWindow.View.ShowFieldCodes = True ActiveWindow.View.ShowFieldCodes = False '' Selection.Range.HighlightColorIndex = wdTurquoise End Sub ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_FontIsInstalled(FontName As String) As Boolean ' Quelle: Mehrere Internet-Quellen (herber.de und ms-office-formum.net), ' Download 21.12.2014. Dim sFond As New StdFont 144 sFond.Name = FontName Fkt_FontIsInstalled = StrComp(FontName, sFond.Name, vbTextCompare) = 0 End Function ' --------------------------------------------------------------------------------------------------------- 145 8 Makro zum verbesserten Einfügen von "Nur Text" 8.1 Kurzbeschreibung für den Anwender von "Inhalt_einfügen" Es gibt in Word seit Word 2000 kein Tastenkürzel mehr für "Nur_den_Text_übernehmen" ("Inhalt-Einfügen") wie in Word 97. Dafür schrieb ich mir schon vor vielen Jahren ein Makro. Beim Befehl für "Inhalt-Einfügen" wird der Feste Bindestrich fälschlich durch ein Leerzeichen ersetzt, was nicht akzeptable ist. Anmerkung 1: Word verwendet für den Festen Bindestrich (NON-BREAKING HYPHEN) das Steuerzeichen mit dem dezimalen Code "30". Der Code des eigentlichen Unicode-Zeichens dafür hat den dezimalen Code 8209. Dieses ist aber mit den Standard-Schriftarten von Word wie Times New Roman, Arial oder Cambria nicht darstellbar. Ferner wird bei der Funktion "Inhalt-Einfügen" in Word 2010 der Silbentrennstrich (englisch: "Soft Hyphen") am Zeilenende durch durch einen normalen Bindestrich und ansonsten durch das "Nicht-Zeichen" (englisch "not sign", Code 0172) ersetzt, das auf dem Bildschirm zwar genauso aussieht wie der bedingte Silbentrennstrich, aber im Druckbild leider sichtbar bleibt ( ¬ ). Dies passiert sogar auch, wenn die Anzeige der Steuerzeichen abgeschaltet ist. Anmerkung 2: Word verwendet für den "Bedingten Bindestrich" (SOFT HYPHEN) das Steuerzeichen mit dem dezimalen Code "31". Der Code des eigentlichen Unicode-Zeichens hat den dezimalen Wert 173, dieser funktioniert aber in Word nicht. Weiterer Vorteil der neuen Makros: Ein einzelner Zeilenumbruch oder ein Seitenwechsel oder eine Absatzmarke lassen sich ebenfalls einfügen. Sie werden zu einer Absatzmarke mit der Formatierung des Zieles. Manko: Gegenüber der Text-Einfüge-Funktion von Word beginnen Aufzählungen bei den beiden Makros leider nach der Einfügung von vorne mit "a)" bzw. "1)". "Sub Inhalt_einfügen_korrigiert()", Tastenkürzel Strg + i) 49 Ich verbesserte das Makro zum Inhalt-Einfügen um die Funktion, dass "Feste Bindestriche" durch normale Bindestriche ersetzt werden und "Bedingte Trennstriche" ersatzlos gelöscht werden. Es werden ferner Zeichen der Windows-Sonderschriftarten zur Warnung dunkelrosa markiert, aber nicht alle (um Rechenzeit zu sparen). "Sub Inhalt_einfügen_erweitert()", Tastenkürzel Strg + Shift + i Es bietet sich an, dieses Einfüge-Makro mit dem Makro zum Ersatz von Symbol- und WingdingsZeichen zu verbinden. Beim "Inhalt-Einfügen" (bzw. Rechtsklick, "Einfügeoptionen: "Nur_den_Text_übernehmen") ist es sehr unpraktisch, wenn aus einem Alpha ein lateinisches "a" oder auch nur ein Kästchen wird. Nicht ersetzte Windows-Sonderzeichen werden dunkelrosa markiert. Ferner fand ich es unpraktisch, dass aus Zahlen wie "10 hoch 3" die Zahl "103" wird. Deshalb erweiterte ich das Makro zum Inhalt-Einfügen mit Erhalt von Exponenten und Indizes, Bei der Gelegentheit baute ich auch eine Unterprozedur ein, die UTF8-Codes aus Internetadressen großenteils decodiert. Aus "https://de.wikipedia.org/wiki/%C3%9Cbersetzung" wird dann " "https://de.wikipedia.org/wiki/Übersetzung" 49 146 Für Anwender englischer Office-Versionen beißt sich das mit dem dortigen Tastenkürzel für "italic". Diese Anwender müssen dem Makro halt ein anderes Tastenkürzel zuweisen. Einfaches Makro "Inhalte_einfügen" (Nachbildung der Funktion von Word): Nach Anleitung aus einer Computer-Zeitschrift. Gewähltes Tastenkürzel: Strg + i wie in Word 97. Sub Inhalte_einfügen() Selection.PasteSpecial Link:=False, DataType:=wdPasteText, _ Placement:=wdInLine, DisplayAsIcon:=False End Sub Wendet man das Makro an, ohne vorher nach dem Einschalten des Computers irgendetwas in die Zwischenablage kopiert zu haben, gibt es die Fehlermeldung 4605. Kopiert man vorher unsichtbaren Text ("ausgeblendet") in die Zwischenablage, gibt es den Fehler 4198. Hat man ein Bild in der Zwischenablage, gibt es den Fehler 5342. Dies könnte man, wenn man unbedingt will, durch eine Fehlerabfrage wie folgt umgehen (ich selbst brauche es nicht): Sub Inhalt_einfügen() ' Makro erweitert um Fehlerbehandlung am 7.Okt. 2012 On Error GoTo Fehlermeldung Selection.PasteSpecial DataType:=wdPasteText Fehlermeldung: If Err <> 0 Then MsgBox ("Die Zwischenablage enthielt keinen brauchbaren Text.") End If End Sub ************************************************************************** 8.2 Makros "Inhalt_einfügen_korrigiert" mit Tastenkürzel Strg + i Feste Bindestriche wie in "E-Modul" bleiben im Makro als normale Bindestriche erhalten, und Bedingte Trennstriche werden ersatzlos gelöscht. 50 Ansonsten ersetzt das Makro nur die normale Funktion von Inhalt-Einfügen. Der Inhalt von Fußnoten und Textfeldern geht verloren, ebenso Hoch- und Tiefstellungen sowie alle weiteren Formatierungen. ' Modul "Inhalt_einfuegen" ' Option Explicit Sub Inhalt_einfügen_korrigiert() ' Hanna-Chris Gast, 2010, 2014, Mai bis 25. August 2015, 14. + 23. September 2015. ' Inhalt einfügen, aber Feste Bindestriche als Bindestriche retten ' und Bedingte Trennstriche löschen. ' Funktioniert von Word 2000 bis Word 2010, Windows XP und Windows 7. ' Zugeordnetes Tastenkürzel: Strg + i. ' ' Neue Version mit ggf. unsichtbarer Zwischendatei, in der die Striche bearbeitet werden. ' Kein Flackern des Bildschirms mehr! 50 Bei gleichzeitiger Anwesenheit von OMML-Formeln wird auf diese Besonderheit zugunsten des Quelltextes der Formeln verzichtet. 147 ' ' Problem und Lösung: ' In Word 2000 geht der Bedingte Silbentrennstrich beim "Inhalt einfügen" verloren, ' in Word 2010 wird (Stand Mai 2015) der Silbentrennstrich durch falsche Zeichen ' ersetzt, teils durch normalen Bindestrich und teils durch das "Nicht-Zeichen (NOT SIGN)", ' Code 0172, das zwar auf dem Bildschirm genauso aussieht, aber im Druckbild völlig ' unakzeptabel ist. Das Makro löscht deshalb den Bedingten Silbentrennstrich ersatzlos. ' ' Die Zwischendatei ist unsichtbar, damit das Makro schneller läuft. ' Bei auftretenden Fehlern wird diese durch die Fehlerbehandlung geschlossen, ' da unsichtbare offene Dateien sonst lästig sind. ' ' Zeichen einiger Sonderschriftarten, die nicht Unicode-kompatibel sind, werden dunkelrosa gefärbt. ' ' Offenes Manko: ' Wenn Striche korrigiert werden, dann beginnen Nummerierungen in der Kopie mit a) bzw. 1) usw. ' statt mit der ursprünglichen Nummer. ' ' Kompromisslösung für OMML-Formeln: ' Um den Quelltext von OMML-Formeln anzeigen zu können, wird bei Vorhandensein solcher Formel ' auf die Korrektur von Strichen und auf den Hinweis auf Sonderzeichen verzichtet. ' ******************** Dim Dok1 As Word.Document Dim Dok2 As Word.Document Dim BlUmbruch As Boolean: BlUmbruch = False Dim B_Strich As Boolean: B_Strich = False Dim aField As Field Dim k As Integer: k = 0 ' ******************** WordBasic.DisableAutoMacros 1 ' Disables auto macros ' ******************** ' Lästiges "Flackern" des Bildschirms verhindern: StatusBar = "Bitte warten - das Makro läuft." Application.ScreenUpdating = False Options.Pagination = False ' *********************************************************************** ' Zwischen-Dokument erstellen: Set Dok1 = ActiveDocument Set Dok2 = Documents.Add(DocumentType:=wdNewBlankDocument, Visible:=False) Dok2.Activate ' Falls in der Normal-dot ein Briefkopf vorhanden ist, diesen löschen: Selection.WholeStory Selection.Delete ' **************** ' In neuem Zwischendokument Text aus Zwischenablage einfügen, ' dabei prüfen, ob die Zwischenablage nicht leer ist und auch Text enthält: On Error GoTo Zeile_Zwischenablage_leer Selection.Paste On Error GoTo Zeile_Fehler ' **************** ' Prüfen, ob etwas eingefügt wurde: Selection.WholeStory Selection.MoveEnd Unit:=wdCharacter, Count:=-1 If Len(Selection) = 1 And 10 <= Asc(Selection) And Asc(Selection) <= 14 Then BlUmbruch = True End If ' ************************************ ' Enhält der Text eine ehemalige Omml-Formel? If Val(Application.Version) >= 14 _ And Selection.Fields.Count > 0 Then For Each aField In Selection.Fields If aField.Code Like "*QUOTE " & ChrW(1) & "*" Then 148 ' Feldtyp ist 35 und enthält Grafik (18.9.2015). ''MsgBox "Rückkonvertiertes Word-2010-Bild!" k=k+1 End If Next aField ''MsgBox "Es gibt in der Markierung " & k & " in Grafik konvertierte Word-2010-Bild(er)." End If ' ************************************ ' Feste Bindestriche durch normales Bindestrich-Minus ersetzen: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^~" .Replacement.Text = "-" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll If Selection.Find.Found = True Then B_Strich = True ' ********************************************** ' Bedingte Silben-Trennstriche (Steuerzeichen) alle beseitigen ' (Word 2010 ersetzt sie sonst falsch durch das "Nicht-Zeichen 0172): Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = ChrW(31) .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 If Selection.Find.Found = True Then B_Strich = True ' *********************************************** ' Sonderschrift "BSsymb9" codieren: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Font.Name = "BSsymb9" .Text = "" .Replacement.Font.Name = "Arial" .Replacement.Text = "<!BSsymb9-Zeichen!>" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With 149 ' ' ' ' ' ' ' ' Selection.Find.Execute Replace:=wdReplaceAll If Selection.Find.Found = True Then B_Strich = True ****************************************************************** If B_Strich = False _ Or k > 0 Then ' Zwischendatei schließen: Dok2.Close (wdDoNotSaveChanges) ' Im ursprünglichen Ziel-Dokument bearbeiteten Text einfügen: Dok1.Activate Selection.PasteSpecial DataType:=wdPasteText GoTo Zeile_Schließen End If ****************************************************************** Alles in der Zwischendatei markieren und kopieren, dann als "Inhalt" in derselben Zwischensdatei einfügen, sofern brauchbarer Text vorhanden ist: Selection.WholeStory Selection.MoveEnd Unit:=wdCharacter, Count:=-1 '''''''''' If Selection.Type > 6 Then Application.Visible = True WordBasic.DisableAutoMacros 0 Dok2.Close (wdDoNotSaveChanges) Dok1.Activate MsgBox "Es ist nur ein Bild markiert, kein einfügbarer Text!" Set Dok1 = Nothing Set Dok2 = Nothing Exit Sub End If '''''''''' If Selection.Type = 1 Then ' Es ist nichts Sichtbares mehr vorhanden. Application.Visible = True WordBasic.DisableAutoMacros 0 Dok2.Close (wdDoNotSaveChanges) Dok1.Activate MsgBox "Es ist nichts Sichtbares zum Einfügen vorhanden." Set Dok1 = Nothing Set Dok2 = Nothing Exit Sub ElseIf BlUmbruch = False Then ' Markierung ausschneiden: Selection.Cut ' "Inhalt" einfügen in der Zwischendatei: Selection.PasteSpecial Link:=False, DataType:=wdPasteText, _ Placement:=wdInLine, DisplayAsIcon:=False Else Selection.TypeParagraph End If ***************************************************************** Nicht-ersetzte Zeichen der Windows-Sonderschriftarten in der "Private Use Area", (PUA), dunkelrosa färben: Options.DefaultHighlightColorIndex = wdPink ActiveDocument.Range.Select Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Replacement.Highlight = True .Replacement.Font.ColorIndex = wdAuto .Text = "[" & ChrW(57344) & "-" & ChrW(63743) & "]" ' Arial und Times New Roman enthalten in der Private Use Area ' einige Sonderzeichen, die hier sonst irreführen würden: 150 .Replacement.Font.Name = "Courier New" .Replacement.Text = "" .Forward = True ''.Wrap = wdFindContinue ' darf hier nicht sein!!! .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = True .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll Options.DefaultHighlightColorIndex = wdYellow ' ********************************************** ' BSsymb9-Warnung mit dunkelrosa Markierung versehen(1.8.2015): Options.DefaultHighlightColorIndex = wdPink Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "<!BSsymb9-Zeichen!>" .Replacement.Highlight = True .Replacement.Text = "" ''.Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll Options.DefaultHighlightColorIndex = wdYellow ' ********************************************** ' Alles in der Zwischendatei markieren und in die Zieldatei kopieren ' (außer Absatzmarke am Schluss): Selection.WholeStory Selection.MoveEnd Unit:=wdCharacter, Count:=-1 Selection.Copy ' Zwischendatei schließen: Dok2.Close (wdDoNotSaveChanges) ' Im ursprünglichen Ziel-Dokument bearbeiteten Text einfügen: Dok1.Activate Selection.Paste ' ********************************************** Zeile_Schließen: ' ********************************************** ' Automakros wieder zulassen: WordBasic.DisableAutoMacros 0 ' Im Suchen/Ersetzen-Menü alles zurückstellen Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False 151 End With ' Bildschirm wieder einschalten: Options.Pagination = True StatusBar = False Application.ScreenUpdating = True Application.DisplayStatusBar = True ' *********************************************** ' Angabe, wenn auf nötige Korrekturen verzichtet wurde ' (Warteschleife ist hier nötig): Dim tt As Single tt = Timer Do While Timer < tt + 0.1 'Sekunden DoEvents Loop ' *** If B_Strich = True _ And k > 0 Then MsgBox "Es wurde auf eine Korrektur von Strichen bzw. Sonderschriftarten verzichtet, " _ & "um den Quelltext der OMML-Formel(n) richtig anzuzeigen." End If ' Makro ist hier zuende: Exit Sub ' ******************************************************************* ' Fehlerroutinen: Zeile_Zwischenablage_leer: Application.Visible = True WordBasic.DisableAutoMacros 0 Dok2.Close (wdDoNotSaveChanges) Dok1.Activate MsgBox "Die Zwischenablage (Clipboard) ist leer!", vbExclamation '' Set Dok1 = Nothing '' Set Dok2 = Nothing Exit Sub ' ************************************ Zeile_Fehler: Application.Visible = True WordBasic.DisableAutoMacros 0 Dok2.Close (wdDoNotSaveChanges) Dok1.Activate MsgBox "Fehler in Sub Fehlerbehandlung" & vbCrLf & "Fehlernummer: " & Err.Number & _ vbCrLf & "Fehlerbeschreibung: " & Err.Description, vbCritical ' Für die Fehlersuche hier testweise die Fehlerstelle wieder aufsuchen: '' Resume End Sub ' --------------------------------------------------------------------------------------------------------- 152 8.3 Makro "Inhalt_einfügen_erweitert" mit Strg + Shift + i Feste Bindestriche wie in "E-Modul" bleiben als normale Bindestriche erhalten, und Bedingte Trennstriche werden ersatzlos gelöscht. Zusätzlich bleiben hier Hoch- und Tiefstellungen erhalten, und Höher- bzw. Tieferstellungen werden in Hoch- oder Tiefstellung umgewandelt. Textfelder werden in normalen Text umgewandelt. Der Inhalt von Fußnoten und Bildern sowie sonstiger Shapes geht verloren. Es wird aber in grüner Schrift in spitzen Klammern darauf hingewiesen. Besonderheit dieses Makros: UTF8-Codes werden decodiert. Sub Inhalt_einfügen_erweitert() ' Hanna-Chris Gast, 2010, 2014, Mai bis August 2015, 23. September 2015, 13. Oktober 2015. ' Version a012d8_Inhalt_einfügen_verbessert_und_UTF8_decodiert() ' Version mit unsichtbarer Zwischendatei, in der alle Befehle ablaufen. ' Funktioniert von Word 2000 bis Word 2010, Windows XP und Windows 7. ' Dies Makro wandelt Symbol- und Wingdingszeichen in Unicode um. ' Exponenten und Indizes bleiben erhalten. Dazu die Unterprozedur "c1" für ' krumme Höher-Tiefer-Position ergänzt 28. Juli 2015. ' Fußnoten verschwinden nicht mehr völlig ersatzlos. Es wird auf sie hingewiesen <!Fußnote!>. ' Feste Bindestriche werden zu Bindestriche, Bedingte Trennstriche werden gelöscht. ' Neu seit August 2015: UTF8-Codierungen in Internet-Adressen werden vom Makro decodiert. ' Neu seit Oktober 2015: Shapes werden umgewandelt in Text bzw. Bilder. ' ' Zugeordnetes Tastenkürzel: Strg + Shift + i. ' ' Durch Aufrufen eines anderen Makros werden Symbol- und Wingdings-Zeichen so weit wie möglich ' durch Unicode-Zeichen ersetzt. Der Rest dieser Zeichen und alle Zeichen in der "Private Use Area" ' (PUA) werden dunkelrosa markiert. ' ' Es hat sich als sinnvoll erwiesen, Exponenten und Indizes als solche zu erhalten, damit nicht ' aus "10 hoch 3" versehentlich "103" wird. Schließlich wird das "Inhalt-Einfügen" hauptsächlich ' benutzt, um lästige Formatvorlagen zu vermeiden, nicht wegen der Zeichenformatierungen. ' ' Beim einfachen "Inhalt einfügen" (...PasteSpecial...DataType:=wdPasteText...), geht in Word ' der "Geschützte Bindestrich" verloren, was nicht tolerierbar ist. In diesem Makro wird er ' durch einen einfachen Bindestrich ersetzt. ' ' In Word 2000 geht der Bedingte Silbentrennstrich beim "Inhalt einfügen" verloren, ' in Word 2010 wird (Stand Mai 2015) der Silbentrennstrich durch falsche Zeichen ' ersetzt, teils durch normalen Bindestrich und teils durch das "Nicht-Zeichen (NOT SIGN)", ' Code 0172, das zwar auf dem Bildschirm genauso aussieht, aber im Druckbild völlig ' unakzeptabel ist. Das Makro löscht deshalb den Bedingten Silbentrennstrich ersatzlos. ' ' Ich ersetze hier Tabstopps durch je drei Leerzeichen, ' dies kann vom Anwender gerne wieder zurückgeändert werden. ' ' Die Zwischendatei ist unsichtbar, damit das Makro schneller läuft. ' Bei auftretenden Fehlern wird diese durch die Fehlerbehandlung geschlossen, ' da unsichtbare offene Dateien sonst lästig sind. ' Es erfolgen keine Suchen-Ersetzen-Vorgänge mehr in der Zieldatei, wodurch das Makro ' etwas schneller läuft. ' ' Offenes Manko dieses Makros gegenüber der Word-eigenen Funktion "Inhalt-Einfügen": ' Nummerierungen beginnen in der Kopie neu mit a) bzw. 1) usw. ' ******************** 153 Dim Stelle1 As Long Dim rng1 As Range Dim Rng2 As Range Dim Dok1 As Word.Document Dim Dok2 As Word.Document Dim strUTF As String Dim BlUmbruch As Boolean: BlUmbruch = False ' ' Stelle im Zieldokument merken, wo Beginn der Einfügung sein wird: Stelle1 = Selection.Start ' '''''''''''''''''''''''''''''' ' 17.Juli 2015 WordBasic.DisableAutoMacros 1 ' Disables auto macros ' '''''''''''''''''''''''' ' Lästiges "Flackern" des Bildschirms verhindern: StatusBar = "Bitte warten - das Makro läuft." Application.ScreenUpdating = False Options.Pagination = False ' *************************************************************** ' Zeitmessen für die Makro-Dauer in Sekunden Dim Zeit1 As Single ' "Single" = Zahlen mit Dezimalen Dim Zeit2 As Single Dim Zeitdauer As Single Zeit1 = Timer ' *********************************************************************** ' Zwischen-Dokument erstellen: Set Dok1 = ActiveDocument Set Dok2 = Documents.Add(DocumentType:=wdNewBlankDocument, Visible:=False) Dok2.Activate ' Falls wie bei mir in der Normal-dot schon ein Briefkopf vorgesehen ist, ' diesen löschen: Selection.WholeStory Selection.Delete ' **************** ' In neuem Zwischendokument Text aus Zwischenablage einfügen, ' dabei prüfen, ob die Zwischenablage nicht leer ist und auch Text enthält: On Error GoTo Zeile_Zwischenablage_leer Selection.Paste ''On Error GoTo 0 On Error GoTo Zeile_Fehler ' **************** Selection.WholeStory ' Prüfen, ob etwas eingefügt wurde: Selection.WholeStory Selection.MoveEnd Unit:=wdCharacter, Count:=-1 If Len(Selection) = 1 And 10 <= Asc(Selection) And Asc(Selection) <= 14 Then BlUmbruch = True End If ' ************************************ ' alle vorhandenenFarbmarkierungen löschen: Selection.Range.HighlightColorIndex = wdAuto ' ************************************ Call Shapes_beseitigen ' ************************************ ' Seitenumbrüche, Abschnittswechsel usw. beseitigen ' dabei Formatvorlagen mit Nummerierung beseitigen: Selection.WholeStory Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^12" .Replacement.Text = "^p" 154 ' ' ' ' ' ' ' ' ' .Forward = True .Wrap = wdFindContinue .Format = False .Replacement.Style = ActiveDocument.Styles(wdStyleNormal) .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = "^14" .Replacement.Text = "^p" .Forward = True .Wrap = wdFindContinue .Format = False .Replacement.Style = ActiveDocument.Styles(wdStyleNormal) .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ************************************ Absatzmarken bezüglich hochtief resetten: Selection.WholeStory Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Font.Position = 0 Selection.Find.Replacement.Font.Subscript = False Selection.Find.Replacement.Font.Superscript = False With Selection.Find .Text = "^p" .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 ************************************ Aufzählungsfunktionen in Schriftzeichen umwandeln (die Beseitigung von Seitenumbrüchen musste davor erfolge): Selection.WholeStory Selection.Range.ListFormat.ConvertNumbersToText ************************************ Tabellen beseitigen: Dim aTable As Table If Selection.Tables.Count > 0 Then For Each aTable In Selection.Tables aTable.Rows.ConvertToText Separator:=wdSeparateByTabs, _ NestedTables:=True Next aTable End If ************************************ Feste Bindestriche durch normales Bindestrich-Minus ersetzen: 155 Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^~" .Replacement.Text = "-" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' ''' ''' ''' ''' ''' ''' ' ' ' ' In Word 2003 wird bei einigen Windows-Einstellungen der "Mittelpunkt" (en: "middle dot") fälschlich durch das Bullet-Zeichen ersetzt. Dies passiert auch bei "Suchen - Ersetzen", wenn man den "Mittelpunkt" nicht wie hier per Code "ChrW(183)" erzwingt. Dies wird in diesem Makro durch Codierung und Decodierung umgangen. Bei Word 2003 echte Bullet-Zeichen sichern durch Zwischentext: '' Selection.Find.ClearFormatting '' Selection.Find.Replacement.ClearFormatting '' With Selection.Find '' .Text = ChrW(8226) '' .Replacement.Text = "<Bullet!-!Operator!>" '' .Forward = True '' .Wrap = wdFindContinue '' .Format = False '' .MatchCase = False '' .MatchWholeWord = False '' .MatchWildcards = False '' .MatchSoundsLike = False '' .MatchAllWordForms = False '' End With '' Selection.Find.Execute Replace:=wdReplaceAll ****************************************************************** Makro für Ersatz von Symbol und Wingdings ohne Rahmenmakro aufrufen: Selection.WholeStory Application.Run MacroName:="Symbol_Wingdings_in_Unicode_nur_Markierten_Text" Problem: Windows-Sonderzeichen werden beim "Inhalt einfügen" falsch ersetzt. Bei Roter Markierung den Zeichencode eindeutig in den PUA-Bereich verschieben: Selection.Find.ClearFormatting Selection.Find.Highlight = True With Selection.Find .Text = "^?" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False Do While .Execute If Selection.Range.HighlightColorIndex = wdRed Then On Error Resume Next With Dialogs(wdDialogInsertSymbol) Selection.Text = ChrW(.charNum + 4096 + 61440) End With 156 Err.Clear Selection.Font.Name = "Courier New" Err.Clear ''On Error GoTo 0 On Error GoTo Zeile_Fehler End If Loop End With ' ****************************************************************** ' Exponenten und Indizes sollen erhalten bleiben: ' Zuerst Höher-tiefer durch hoch- und tiefstellen ersetzen: '' Call c0_hoeher_tiefer_3_Punkt_ersetzen ' Damit auch Höher- und Tieferstellungen mit krummen Werten funktionieren: Call c1_hoeher_tiefer_in_hochtief_Animation ' ************************************ ' Exponenten codieren: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Font.Superscript = True .Font.Subscript = False .Replacement.Text = "<<Exponent:^&zzzxxx>>" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' Indices codieren: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Font.Superscript = False .Font.Subscript = True .Replacement.Text = "<<Index:^&yyyxxx>>" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' ********************************************** ' Bedingte Silben-Trennstriche (Steuerzeichen) alle beseitigen ' (Word 2010 ersetzt sie sonst falsch durch das "Nicht-Zeichen 0172): Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = ChrW(31) .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True 157 ' ' ' ' ' ' ' ' ' .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ********************************************** Tabstopps durch je drei Leerzeichen ersetzen: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^t" .Replacement.Text = " " .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ********************************************** Fußnoten codieren: Dim aFoot As Footnote For Each aFoot In ActiveDocument.Footnotes aFoot.Reference.Select Selection.Text = "<!Fußnote!>" Next aFoot *********************************************** Sonderschrift "BSsymb9" codieren: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Font.Name = "BSsymb9" .Text = "" .Replacement.Font.Name = "Arial" .Replacement.Text = "<!BSsymb9-Zeichen!>" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ********************************************** Auf Formeln und Bilder hinweisen: Feste Bindestriche durch normales Bindestrich-Minus ersetzen: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^1" .Replacement.Text = "<!Formel oder Bild!>" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False 158 .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' ' ' ' ' ' ' ' ' ' ' ' ****************************************************************** ****************************************************************** Alles in der Zwischendatei markieren und kopieren, dann als "Inhalt" inderselben Zwischensdatei einfügen, sofern brauchbarer Text vorhanden ist: Selection.WholeStory Selection.MoveEnd Unit:=wdCharacter, Count:=-1 '''''''''' If Selection.Type > 6 Then '' If Len(Selection) <= 2 And Asc(Selection) < 2 Then Application.Visible = True WordBasic.DisableAutoMacros 0 Dok2.Close (wdDoNotSaveChanges) Dok1.Activate MsgBox "Es ist nur ein Bild markiert, kein einfügbarer Text!" Set Dok1 = Nothing Set Dok2 = Nothing Exit Sub End If '''''''''' If Selection.Type = 1 Then ' Es ist nichts Sichtbares zum Einfügen mehr vorhanden. Application.Visible = True WordBasic.DisableAutoMacros 0 Dok2.Close (wdDoNotSaveChanges) Dok1.Activate ''Set Dok1 = Nothing ''Set Dok2 = Nothing MsgBox "Es ist nichts Sichtbares zum Einfügen vorhanden." Exit Sub ElseIf BlUmbruch = False Then ' Ausschneiden: Selection.Cut ' "Inhalt" einfügen in der Zwischendatei: Selection.PasteSpecial Link:=False, DataType:=wdPasteText, _ Placement:=wdInLine, DisplayAsIcon:=False Else Selection.TypeParagraph End If ***************************************************************** ***************************************************************** Decodierungen: ********************************************** UTF8 decodieren: Selection.WholeStory strUTF = Fkt_UTF8_decodieren ********************************************** Set Rng2 = Dok2.Range ''' Multiplicationspunkte wiederherstellen: ''' Bei falscher (?) Kompatibilitäts-Einstellung von Windows entstehen ''' durch "Inhalt-Einfügen" Bullet-Zeichen statt Mittepunkt. ''' Dies muss korrigiert werden (aber nicht bei echten Bullet-Zeichen): '' Rng2.Find.ClearFormatting '' Rng2.Find.Replacement.ClearFormatting '' With Rng2.Find 159 ' ' ' ' '' .Text = ChrW(8226) '' .Replacement.Text = ChrW(183) ' Mittepunkt wiederhergestellt '' .Forward = True '' ' .Wrap = wdFindContinue/ = wdFindAsk/ = wdFindStop '' ' Es darf nur der markierte Bereich durchsucht werden! '' .Format = False '' .MatchCase = False '' .MatchWholeWord = False '' .MatchWildcards = False '' .MatchSoundsLike = False '' .MatchAllWordForms = False '' End With '' Rng2.Find.Execute Replace:=wdReplaceAll **************** ''' echte Bullet-Zeichen wieder herstellen: '' Rng2.Find.ClearFormatting '' Rng2.Find.Replacement.ClearFormatting '' With Rng2.Find '' .Text = "<Bullet!-!Operator!>" '' .Replacement.Text = ChrW(8226) ' echte Bullet-Zeichen wiederherstellen '' .Forward = True '' ''.Wrap = wdFindStop '' .Format = False '' .MatchCase = False '' .MatchWholeWord = False '' .MatchWildcards = False '' .MatchSoundsLike = False '' .MatchAllWordForms = False '' End With '' Rng2.Find.Execute Replace:=wdReplaceAll ********************************************** Hochstellung wieder decodieren: Rng2.Find.ClearFormatting Rng2.Find.Replacement.ClearFormatting With Rng2.Find .Text = "\<\<Exponent\:*zzzxxx\>\>" .Replacement.Text = "" .Replacement.Font.Superscript = True .Replacement.Font.Subscript = False .Forward = True '' .Wrap = wdFindAsk .Format = True .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Rng2.Find.Execute Replace:=wdReplaceAll Tiefstellung wieder decodieren: Rng2.Find.ClearFormatting Rng2.Find.Replacement.ClearFormatting With Rng2.Find .Text = "\<\<Index\:*yyyxxx\>\>" .Replacement.Text = "" .Replacement.Font.Superscript = False .Replacement.Font.Subscript = True .Forward = True '' .Wrap = wdFindAsk .Format = True .MatchCase = False .MatchWholeWord = False 160 .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Rng2.Find.Execute Replace:=wdReplaceAll ' Rng2.Find.ClearFormatting Rng2.Find.Replacement.ClearFormatting With Rng2.Find .Text = "yyyxxx>>" .Replacement.Text = "" .Forward = True '.Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Rng2.Find.Execute Replace:=wdReplaceAll Rng2.Find.ClearFormatting Rng2.Find.Replacement.ClearFormatting With Rng2.Find .Text = "zzzxxx>>" .Replacement.Text = "" .Forward = True '.Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Rng2.Find.Execute Replace:=wdReplaceAll ' With Rng2.Find .Text = "<<Exponent:" .Replacement.Text = "" .Forward = True ' .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Rng2.Find.Execute Replace:=wdReplaceAll With Rng2.Find .Text = "<<Index:" .Replacement.Text = "" .Forward = True ' .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With 161 Rng2.Find.Execute Replace:=wdReplaceAll ' ********************************************** ' Nicht-ersetzte Zeichen der Windows-Sonderschriftarten ' in der "Private Use Area", (PUA), dunkelrosa färben: Options.DefaultHighlightColorIndex = wdPink Rng2.Find.ClearFormatting Rng2.Find.Replacement.ClearFormatting With Rng2.Find .Replacement.Highlight = True .Replacement.Font.ColorIndex = wdAuto .Text = "[" & ChrW(57344) & "-" & ChrW(63743) & "]" .Replacement.Font.Name = "Courier New" ' Arial und Times New Roman enthalten in der Private Use Area ' einige Sonderzeichen, die hier sonst irritieren würden. .Replacement.Text = "" .Forward = True ''.Wrap = wdFindContinue ' darf hier nicht sein!!! .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = True .MatchSoundsLike = False .MatchAllWordForms = False End With Rng2.Find.Execute Replace:=wdReplaceAll Options.DefaultHighlightColorIndex = wdYellow ' ********************************************** ''' BSsymb9-Warnung mit dunkelrosa Markierung versehen(1.8.2015): '' Options.DefaultHighlightColorIndex = wdPink '' Rng2.Find.ClearFormatting '' Rng2.Find.Replacement.ClearFormatting '' With Rng2.Find '' .Text = "<!BSsymb9-Zeichen!>" '' .Replacement.Highlight = True '' .Replacement.Text = "" '' ''.Wrap = wdFindContinue '' .Format = True '' .MatchCase = False '' .MatchWholeWord = False '' .MatchWildcards = False '' .MatchSoundsLike = False '' .MatchAllWordForms = False '' End With '' Rng2.Find.Execute Replace:=wdReplaceAll '' Options.DefaultHighlightColorIndex = wdYellow '''''''''''''''''''''''''''''''''''''''''''''' ' Warnungen mit Markierung versehen: ''Options.DefaultHighlightColorIndex = wdYellow Rng2.Find.ClearFormatting Rng2.Find.Replacement.ClearFormatting With Rng2.Find .Text = "\<\!*\>" '.Replacement.Highlight = True .Replacement.Font.Color = wdColorGreen .Replacement.Text = "" ''.Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = True .MatchSoundsLike = False .MatchAllWordForms = False 162 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' End With Rng2.Find.Execute Replace:=wdReplaceAll ''Options.DefaultHighlightColorIndex = wdYellow ********************************************** Alles in der Zwischendatei markieren und in die Zieldatei kopieren (außer Absatzmarke am Schluss): Selection.WholeStory Selection.Font.Animation = wdAnimationNone Selection.MoveEnd Unit:=wdCharacter, Count:=-1 Selection.Copy Zwischendatei schließen: Dok2.Close (wdDoNotSaveChanges) Im ursprünglichen Ziel-Dokument bearbeiteten Text einfügen: Dok1.Activate Selection.Paste **** Das neu Eingefügte in der Ursprungsdatei mithilfe der Range-Funktion markieren: Set rng1 = Selection.Range rng1.SetRange Start:=Stelle1, End:=rng1.End rng1.Select ********************************************** 17.Juli 2015 WordBasic.DisableAutoMacros 0 ' Automakros wieder zulassen. ********************************************** Im Suchen/Ersetzen-Menü alles zurückstellen Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Bildschirm wieder einschalten: Options.Pagination = True StatusBar = False Application.ScreenUpdating = True Application.DisplayStatusBar = True ********************************************** Zeitmessen für die Makro-Dauer, Variante mit 2 Nachkommastellen: Zeit2 = Timer Zeitdauer = Format((Zeit2 - Zeit1), "##,##0.00") **************** ' Damit in Word 2010 die Messagebox nicht vor der letzten Aktualisierung angezeigt wird: Dim tt As Single '' Double tt = Timer Do While Timer < tt + 0.1 'Sekunden DoEvents Loop ' If Zeitdauer > 1# Or strUTF <> "" Then MsgBox "Die Rechenzeit für verbessertes Inhalt-Einfügen war " & Zeitdauer _ & " Sekunden." & strUTF End If *********************************************** '' Set Dok1 = Nothing 163 '' Set Dok2 = Nothing Exit Sub ' ******************************************************************* Zeile_Zwischenablage_leer: Application.Visible = True WordBasic.DisableAutoMacros 0 Dok2.Close (wdDoNotSaveChanges) Dok1.Activate MsgBox "Die Zwischenablage (Clipboard) ist leer!", vbExclamation '' Set Dok1 = Nothing '' Set Dok2 = Nothing Exit Sub ' ************************************ Zeile_Fehler: Application.Visible = True WordBasic.DisableAutoMacros 0 Dok2.Close (wdDoNotSaveChanges) Dok1.Activate MsgBox "Fehler in Sub Fehlerbehandlung" & vbCrLf & "Fehlernummer: " & Err.Number & _ vbCrLf & "Fehlerbeschreibung: " & Err.Description, vbCritical '' Set Dok1 = Nothing '' Set Dok2 = Nothing ' Für Testzwecke die Fehlerstelle wieder aufsuchen: '' Resume End Sub ' --------------------------------------------------------------------------------------------------------- Private Sub c0_hoeher_tiefer_3_Punkt_ersetzen() ' 3 Punkt höher- oder tiefergestelltes umwandeln: Selection.WholeStory ' Höhergestelltes durch hoch- und tiefstellen ersetzen: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Font.Position = 3 With Selection.Find.Replacement.Font .Position = 0 .Superscript = True .Subscript = False End With With Selection.Find .Text = "" .Replacement.Text = "" .Replacement.Highlight = True .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ' **** ' 3 Punkt Tiefergestelltes überall durch Tiefstellung ersetzen: Selection.Find.ClearFormatting Selection.Find.Font.Position = -3 Selection.Find.Replacement.ClearFormatting With Selection.Find.Replacement.Font .Position = 0 .Superscript = False 164 .Subscript = True End With With Selection.Find .Text = "" .Replacement.Text = "" .Replacement.Highlight = True .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 ' --------------------------------------------------------------------------------------------------------- Private Sub c1_hoeher_tiefer_in_hochtief_Animation() ' Dipl.-Ing. Hanna-Chris Gast, 21. Juli 2015. 24. Juni 2015. ' Auszug aus "Sub a91d" in Datei 120c, Januar 2013. ' Optimiert für Word 2000, funktioniert auch gut in Word 2010. ' ' Es werden vertikale Positionen auch mit Nicht-Ganzen-Zahlen erfasst. ' Funktionsweise: Es werden dazu erst alle Zeichen mit "Position = 0" mittels Animation markiert, ' und dann alle nicht-markierten Zeichen abgefragt. ' ' In der Testphase werden hier noch alle geprüften Zeichen unterschiedlich farbig markiert ' und die Rechenzeit ausgegeben. ' ****************************************** Dim i As Integer ' laufende Zählung (Inhaltsverzeichnisse). Dim j As Integer: j = 0 ' Anzahl der Exponenten. Dim k As Integer: k = 0 ' Anzahl der Indizes. Dim rng1 As Range ' Dokumentkomponenten. Dim rng0 As Range ' ursprüngliche Markierung merken. ' ********************************************* ' Ursprüngliche Markierung merken: Set rng0 = Selection.Range ' ******************************************* ' Für Testzwecke Animation anzeigen: '' ActiveWindow.View.ShowAnimation = True ' ******************************************** ' Auch die Fußnoten erfassen. For Each rng1 In ActiveDocument.StoryRanges If rng1.StoryType > 1 Then Exit For ' *************************************** Options.DefaultHighlightColorIndex = wdYellow ' ******************* ' ... ' ****************************************************** ' Für "Höher/Tiefer zuerst alle Zeichen mit Position = 0 ' durch Animation markieren: ' ****************************************************** rng1.Find.ClearFormatting rng1.Find.Replacement.ClearFormatting With rng1.Find .Font.Position = 0 .Text = "" .Replacement.Text = "" 165 .Replacement.Font.Animation = wdAnimationLasVegasLights .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With rng1.Find.Execute Replace:=wdReplaceAll ' Animation auf Einzelzeichen genau abgrenzen (spart Rechenzeit): rng1.Find.ClearFormatting rng1.Find.Replacement.ClearFormatting With rng1.Find .Font.Animation = wdAnimationNone .Font.Position = 0 .Text = "^?" .Replacement.Text = "" .Replacement.Font.Animation = wdAnimationLasVegasLights .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With rng1.Find.Execute Replace:=wdReplaceAll ' Alle Felder animieren; dies geht nur in der Feldcode-Ansicht: ActiveWindow.View.ShowFieldCodes = True rng1.Find.ClearFormatting rng1.Find.Replacement.ClearFormatting '' rng1.Find.Replacement.Highlight = True With rng1.Find .Text = "^d" .Replacement.Text = "" .Replacement.Font.Animation = wdAnimationLasVegasLights .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With rng1.Find.Execute Replace:=wdReplaceAll ' zurückstellen in die Feldergebnis-Ansicht: ActiveWindow.View.ShowFieldCodes = False ' ************************************************* ' Alle Höher-Tiefer-gestellten Zeichen umwandeln: rng1.Select Selection.Collapse ' "HomeKey Unit:=wdStory" würde auf Hauptkomponente springen. Zeile_Schleifenbeginn: ' *************** With Selection.Find .ClearFormatting .Text = "^?" ' dadurch werden nur noch Zeichen, nicht mehr Tabellenmarken abgefragt. .Replacement.Text = "" .Forward = True 166 .Wrap = wdFindStop .Format = True .Font.Animation = wdAnimationNone '' .Font.ColorIndex = wdAuto .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute ' ********* If Selection.Find.Found = True Then ' *********** ' Exponenten: ' ********** If Selection.Font.Position > 1 Then ' Höhergestellt, möglicherweise fehlerhaft von DKE: ' Größenanpassung und Zeichenformatvorlagen beseitigen! Selection.Font.Reset Selection.Font.Superscript = True Selection.Font.Subscript = False Selection.Font.Position = 0 '3 ' ***** j=j+1 Selection.Range.HighlightColorIndex = wdTurquoise Selection.Font.Animation = wdAnimationLasVegasLights ' nur so werden Endlosschleifen in geschachtelten Tabellen vermieden. Selection.Collapse wdCollapseEnd ' ********************************* ' Indizes: ' ******************************** ElseIf Selection.Font.Position < 1 Then ' Tiefer gesetzt, möglicherweise fehlerhaft von DKE: Selection.Font.Reset Selection.Font.Superscript = False Selection.Font.Subscript = True Selection.Font.Position = -0 ' **** k=k+1 Selection.Range.HighlightColorIndex = wdDarkYellow Selection.Font.Animation = wdAnimationLasVegasLights ' nur so werden Endlosschleifen in geschachtelten Tabellen vermieden. Selection.Collapse wdCollapseEnd Else ' Selection.Font.Position = 0 Selection.Range.HighlightColorIndex = wdRed Selection.Font.Animation = wdAnimationLasVegasLights Selection.Collapse wdCollapseEnd End If GoTo Zeile_Schleifenbeginn End If ' ********************************************************** ' Animation im ganzen StoryRange wieder beseitigen: rng1.Font.Animation = wdAnimationNone ' Alle Felder aktualisieren: rng1.Fields.Update ' **************************** ' Nächste Dokumentkomponente: Next rng1 ' ************************************ ' ************************************ 167 ' Zum Schluss aufräumen: ' ************************************ ' Alte Markierung wieder herstellen: rng0.Select ' Speicher für Suchen-Ersetzen zurückstellen: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Replacement.Text = "" End With Application.DisplayAlerts = wdAlertsAll '' Options.DefaultHighlightColorIndex = wdYellow ' ********************************** End Sub ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_UTF8_decodieren() As String ' H. Chris Gast, 10. Juni 2015, 2. + 24. + 27. Juli 2015, 12. + 26. + 27. August 2015. ' UTF8 in Internet-Dateinamen decodieren (erkennbar an den Prozentzeichen). ' Vierbyte-Code (beginnend mit "F") wird von dem Makro wegen der Seltenheit (noch) ' nicht erfasst. ' Es darf nur das jeweilige codierte Zeichen ersetzt werden, nicht Nachbarzeichen, ' die Windows-Sonderzeichen sein können. ''Dim Rng1 As Range Dim strCode As String Dim strErsatz As String Dim strText As String Dim i As Integer: i = 0 Dim k As Integer: k = 0 Dim strMisserfolg As String: strMisserfolg = "" Dim Rng2 As Range ' ********************************************** Selection.HomeKey Unit:=wdStory ' ********************************************** ' Schleife, um alle UTF-8-Zeichen in der Markierung (Rng1) zu erfassen: ' Zieladresse der Schleife: Zeile_Schleife_Weitermachen: ' ************************** ' Prozentzeichen suchen: Selection.Find.ClearFormatting With Selection.Find .Text = "%" .Replacement.Text = "" .Forward = True ' .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute If Selection.Find.Found = False Then GoTo Zeile_Ergebnis ' geht so oft nicht, sucht endlos weiter, deshalb auch mit "Rng1" abfragen: '' If Selection.Range.End > Rng1.End Then '' Rng1.Select '' ''Exit Sub '' GoTo Zeile_Ergebnis '' End If 168 ' ************************ Set Rng2 = Selection.Range ' Das Zeichen hinter dem ersten gefundenen "Prozent" markieren: Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend ' *************** ' 1. Buchstabe nach dem Prozentzeichen untersuchen: If UCase(Selection.Text) = "C" Or UCase(Selection.Text) = "D" Then ' Zwei-Byte-Code: Selection.MoveRight Unit:=wdCharacter, Count:=4, Extend:=wdExtend Rng2.SetRange Start:=Rng2.Start, End:=Selection.End strCode = Replace(Selection, "%", "") strErsatz = ChrW(Fkt_zweiByte_Sequenz(strCode)) 'strUTF_decodiert = Replace(strUTF_decodiert, "%" & Selection.Text, strErsatz) Rng2.Text = strErsatz Rng2.Font.Underline = True i=i+1 ElseIf UCase(Selection.Text) = "E" Then ' Drei-Byte-Code: Selection.MoveRight Unit:=wdCharacter, Count:=7, Extend:=wdExtend Rng2.SetRange Start:=Rng2.Start, End:=Selection.End strCode = Replace(Selection, "%", "") strErsatz = ChrW(Fkt_dreiByte_Sequenz(strCode)) ' strUTF_decodiert = Replace(strUTF_decodiert, "%" & Selection.Text, strErsatz) Rng2.Text = strErsatz Rng2.Font.Underline = True i=i+1 ElseIf UCase(Selection.Text) = "F" Then ' Vier-Byte-Code oder unzulässig: Selection.MoveRight Unit:=wdCharacter, Count:=10, Extend:=wdExtend Rng2.SetRange Start:=Rng2.Start, End:=Selection.End strCode = Replace(Selection, "%", "") strErsatz = ChrXXL(Fkt_vierByte_Sequenz(strCode)) If strErsatz = "" Then ' kein zulässiger UTF8-Code: MsgBox "unzulässiger UTF8-Code!", vbInformation k=k+1 Selection.Collapse Direction:=wdCollapseEnd Else Rng2.Text = strErsatz Rng2.Font.Underline = True i=i+1 End If ''''''''''''''''''''''''' Else ' einfaches ASCII-Zeichen: If UCase(Selection.Text) Like "[0-9,A-B]" Then Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend Rng2.SetRange Start:=Rng2.Start, End:=Selection.End '' MsgBox "1-Byte-Sequenz" strErsatz = ChrW(Val("&H" & Selection.Text & "&")) ''MsgBox "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ & ChrW(Val("&H" & Selection.Text & "&")) & "'." 'strUTF_decodiert = Replace(strUTF_decodiert, "%" & Selection.Text, strErsatz) Rng2.Text = strErsatz Rng2.Font.Underline = True i=i+1 Else ' kein UTF8-Code: k=k+1 '' GoTo Zeile_Ergebnis End If 169 End If '' MsgBox "Der UTF-Code ist: " & Replace(Selection, "%", " ") ' ************************** ' Schleife nach oben: Selection.Collapse Direction:=wdCollapseEnd GoTo Zeile_Schleife_Weitermachen ' ********************************************** Zeile_Ergebnis: If i > 0 Then ' für verbessertes Inhalt-Einfügen: Fkt_UTF8_decodieren = vbCrLf & vbCrLf _ & "Es wurden an " & i & " Stellen UTF8-Code decodiert (und unterstrichen)." & strMisserfolg Else Fkt_UTF8_decodieren = "" & strMisserfolg End If End Function ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_zweiByte_Sequenz(strCode As String) As Integer ' H. Chris Gast, Stand 2. Juli 2015. Dim Z As String Dim Y As String Dim x As String Dim strUCS As String Dim IntUCS As Long Z = UCase(Left(strCode, 2)) Y = UCase(Mid(strCode, 3, 2)) Dim i Dim strText Dim strÜberschrift strÜberschrift = "" ' ***************** ' Rechenformel nach ISO/IEC 10646:2003, Anhang D (nicht mehr in neueren Ausgaben!) IntUCS = (Val("&H" & Z & "&") - 192) * 64 + (Val("&H" & Y & "&") - 128) strText = "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ & ChrW(IntUCS) & "'." ''i = MessageBoxW(0, StrPtr(strText), StrPtr(strÜberschrift), 0) Fkt_zweiByte_Sequenz = IntUCS End Function ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_dreiByte_Sequenz(strCode As String) As Integer ' H. Chris Gast, Stand 2. Juli 2015. Dim Z As String Dim Y As String Dim x As String Dim strUCS As String Dim IntUCS As Long Z = UCase(Left(strCode, 2)) Y = UCase(Mid(strCode, 3, 2)) x = Mid(strCode, 5, 2) Dim i Dim strText Dim strÜberschrift strÜberschrift = "" ' ***************** ' Rechenformel nach ISO/IEC 10646:2003, Anhang D (nicht mehr in neueren Ausgaben!) IntUCS = (Val("&H" & Z & "&") - 224) * 4096 + (Val("&H" & Y & "&") - 128) * 64 _ + (Val("&H" & x & "&") - 128) strText = "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ 170 & ChrW(IntUCS) & "'." ''i = MessageBoxW(0, StrPtr(strText), StrPtr(strÜberschrift), 0) Fkt_dreiByte_Sequenz = IntUCS End Function ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_vierByte_Sequenz(strCode As String) As Long ' H. Chris Gast, 26. August 2015. Dim Z As String Dim Y As String Dim x As String Dim w As String Dim strUCS As String Dim IntUCS As Long Z = UCase(Left(strCode, 2)) Y = UCase(Mid(strCode, 3, 2)) x = UCase(Mid(strCode, 5, 2)) w = UCase(Mid(strCode, 7, 2)) Dim i Dim strText Dim strÜberschrift strÜberschrift = "" ' ***************** ' Rechenformel nach ISO/IEC 10646:2003, Anhang D (nicht mehr in neueren Ausgaben!) '' z = F0 .. F7; y; x; w; (z-F0)*2 hoch 18 + (y-80)*2 hoch 12 +(x-80)*2 hoch 6 + (w-80); '' nur bis "F4" gültig! '''''''''''''''''''''''''''' If Val("&H" & Z & "&") > 244 Then ''MsgBox "unzulässiger UTF8-Code!", vbInformation Fkt_vierByte_Sequenz = 0 Exit Function End If '' MsgBox "4-Byte-Sequenz.", vbInformation IntUCS = (Val("&H" & Z & "&") - 240) * 262144 + (Val("&H" & Y & "&") - 128) * 4096 _ + (Val("&H" & x & "&") - 128) * 64 + (Val("&H" & w & "&") - 128) ' ***************** Fkt_vierByte_Sequenz = IntUCS ' ****************** ' Nur für Testzwecke! '' strText = "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ & ChrXXL(IntUCS) & "'." '' i = MessageBoxW(0, StrPtr(strText), StrPtr(strÜberschrift), 0) '' MsgBox IntUCS End Function ' --------------------------------------------------------------------------------------------------------- Private Function ChrXXL(Code2) As String ' Dipl.-Ing Hanna-Chris Gast, 2011. ' Unterfunktion für Zeichen höherer Ebenen, passend für Word 2000 und höher ' Berechnung nach nach ISO/IEC 10646:2003, Anhang C: Dim Surrogat1 Dim Surrogat2 If Code2 = 0 Then ChrXXL = "" Exit Function End If Surrogat1 = Hex(Int((Code2 - 65536) / 1024) + 55296) Surrogat2 = Hex((Code2 - 65536) - (Int((Code2 - 65536) / 1024) * 1024) + 56320) ChrXXL = ChrW("&H" & Surrogat1) & ChrW("&H" & Surrogat2) End Function 171 ' --------------------------------------------------------------------------------------------------------- Private Sub Shapes_beseitigen() ' H. Chris Gast, September 2012, Januar 2013, Januar 2015, 13. + 14. Oktober 2015. ' Makro beseitigt störende Shapes und wandelt sie ggf. um in Frames und InlineShapes. ' Erfasst nicht alle Grafiken, wenn pdf mit Adobe X in Word umgewandelt wurde. Dim i As Integer Dim IntType As Integer For i = ActiveDocument.Shapes.Count To 1 Step -1 If ActiveDocument.Shapes(i).Type = msoTextBox Then ' 17 ' Textfelder umwandlen in Textrahmen (Textbox in Frame) ActiveDocument.Shapes(i).ConvertToFrame ElseIf ActiveDocument.Shapes(i).Type = msoPicture Then ' 13 ' frei positioniertes Bild (Picture) in normale Bildposition. ActiveDocument.Shapes(i).ConvertToInlineShape ElseIf ActiveDocument.Shapes(i).Type = msoLinkedPicture Then ' 11 ' frei positioniertes verknüpftes Bild (Linked Picture). On Error Resume Next IntType = ActiveDocument.Shapes(i).Type ActiveDocument.Shapes(i).ConvertToInlineShape If Err.Number > 0 Then ''ActiveWindow.ScrollIntoView Selection.Range ' Sonst sieht man nichts! 'Testweise: ActiveDocument.Shapes(i).Select ''Selection.Range.Paragraphs(1).Range.HighlightColorIndex = wdDarkRed ''MsgBox "Abbruch: Diese Grafik lässt sich nicht umwandeln!", vbCritical ActiveDocument.Shapes(i).Delete Selection.TypeText "<!Shape-Typ " & IntType & " gelöscht>" Err.Clear ''Exit Sub End If On Error GoTo 0 Else ' AutoForm, Zeichnungsobjekt oder sonstige Grafikobjekte löschen. IntType = ActiveDocument.Shapes(i).Type ActiveDocument.Shapes(i).Select ActiveDocument.Shapes(i).Delete Selection.TypeText "<!Shape-Typ " & IntType & " gelöscht>" End If Next i ' ****** End Sub ' --------------------------------------------------------------------------------------------------------- 172 8.4 Makro "Bereinigt_Einfügen" mit AltGr + j Hier werden neben "fett", "kursiv" und "unterstrichen" auch einige Absatz-Formatvorlagen erhalten. Auch Bilder, Felder und Fußnoten bleiben erhalten. Es werden Symbol- und Wingdings-Zeichen konvertiert, aber keine UTF8-Codes wie in 8.3. Es werden Textfelder ("Textbox") in normalen Text konvertiert, frei positionierte Bilder in normal positionierte Bilder umgewandelt. Bei den übrigen Shapes wird in grüner Farbe auf das Löschen hingewiesen. ' Makromodul "Bereinigt_einfuegen" ' Option Explicit Private Dok1 As Word.Document Private Blhochtief As Boolean Sub Bereinigt_einfügen() ' Dipl.-Ing. Hanna-Chris Gast, Juni bis August 2015, 14. September 2015, 13. Oktober 2015. ' Text mit Formaten und Bildern aus der Zwischenablage einfügen, ' jedoch mit begrenzter Anzahl von Styles. ' Funktioniert von Word 2000 bis Word 2010, Windows XP und Windows 7. ' ' Exponenten und Indizes mit Höher- und Tieferstellungen werden durch ' Hoch- und Tiefstellung ersetzt, mittels Unterprozedur c25 funktioniert ' dies auch bei Sonderstyles mit krummen Zahlen. ' ' Nur bei Überschriften und Anhangs-Titeln bleiben Nummerierungen erhalten, ' ansonsten werden sie eingefroren. ' ' Durch Aufrufen eines anderen Makros werden Symbol- und Wingdings-Zeichen so weit ' wie möglich durch Unicode-Zeichen ersetzt. ' Auch in Fußnoten werden jetzt Symbol- und Wingdingszeichen in Unicode umgewandelt. ' ' Rechenzeitbeschleunigung mittels unsichtbarem Zwischendokument. ' ' Schriftart und Zielschriftgrößen richten sich nach der Formatvorlage "Standard" im Zieldokument. ' Am Schluss per Absatz-Reset verbessertes Anpassung an Zieldokument. ' ' Shapes werden nach Möglichkeit in Bilder bzw. Text umgewandelt, ansonsten gelöscht. ' ************************************ ' (Dok1 und Blhochtief sind weiter oben definiert) Blhochtief = False Dim BlFormel As Boolean: BlFormel = False Dim Dok2 As Word.Document Dim astyle As Style Dim strStylesListe As String Dim Stelle1 As Long Dim rng1 As Range Dim k As Integer ' ************************************ ' Lästiges "Flackern" des Bildschirms verhindern: StatusBar = "Bitte warten - das Makro läuft." Application.ScreenUpdating = False Options.Pagination = False ' ************************************ ' Zeitmessen für die Makro-Dauer in Sekunden Dim Zeit1 As Single ' "Single" = Zahlen mit Dezimalen 173 Dim Zeit2 As Single Dim Zeitdauer As Single Zeit1 = Timer ' ************************************ ' Stelle im Zieldokument merken, wo Beginn der Einfügung sein wird: Stelle1 = Selection.Start ' ************************************ Set Dok1 = ActiveDocument ' ************************************ ' Automakros ausschalten, damit keine Zeit verloren wird durch Briefköpfe. WordBasic.DisableAutoMacros 1 ' Disables auto macros ' ****************************************************************** ' Zwischendokument erstellen: 'Set Dok2 = Documents.Add(DocumentType:=wdNewBlankDocument) Set Dok2 = Documents.Add(DocumentType:=wdNewBlankDocument, Visible:=False) Dok2.Activate Selection.WholeStory ' *********************** ' Beim Einfügen prüfen, ob die Zwischenablage nicht leer ist und auch Text enthält: On Error GoTo Zeile_Zwischenablage_leer Selection.Paste '' On Error GoTo 0 On Error GoTo Zeile_Fehler ' Alles markieren und Länge prüfen: Selection.WholeStory If Len(Replace(Selection, ChrW(13), "")) < 2 Then Dok2.Close (wdDoNotSaveChanges) Dok1.Activate Application.Visible = True WordBasic.DisableAutoMacros 0 MsgBox "Fehler, das Einfügen ergab nichts!" ''Set Dok1 = Nothing ''Set Dok2 = Nothing Exit Sub End If ' ************************************ ''' Felder beseitigen: '' Selection.Fields.Unlink ' gestrichen 6.August 2015. ' ************************************ ' Seitenumbrüche, Abschnittswechsel usw. beseitigen: Selection.WholeStory Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^12" .Replacement.Text = "^p" .Forward = True .Wrap = wdFindContinue .Format = False .Replacement.Style = ActiveDocument.Styles(wdStyleNormal) .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = "^14" .Replacement.Text = "^p" .Forward = True 174 ' ' ' ' ' ' ' ' ' ' .Wrap = wdFindContinue .Format = False .Replacement.Style = ActiveDocument.Styles(wdStyleNormal) .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ************************************ Absatzmarken bezüglich hoch- und tiefgestellt resetten: Selection.WholeStory Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Font.Position = 0 Selection.Find.Replacement.Font.Subscript = False Selection.Find.Replacement.Font.Superscript = False With Selection.Find .Text = "^p" .Replacement.Text = "^p" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ************************************ Vorhandene Farbmarkierungen beseitigen: ActiveDocument.Range.HighlightColorIndex = wdAuto ' Farbmarkierung beseitigen, die eine "Schattierung" ist: With ActiveDocument.Range.Font.Shading .Texture = wdTextureNone .ForegroundPatternColor = wdColorAutomatic .BackgroundPatternColor = wdColorAutomatic End With ' Farbmarkierung beseitigen, die auf Absatzeigenschaften beruht: With ActiveDocument.Range.ParagraphFormat.Shading .Texture = wdTextureNone .ForegroundPatternColor = wdColorAutomatic .BackgroundPatternColor = wdColorAutomatic End With ****************************************************************** Höher-tiefer-Gestelltes durch Hoch- und Tiefgestelltes ersetzen (krummen Zahlen für Höherstellungen, die nicht direkt gefunden werden können): Call c25_höher_tiefer_Animation_für_Word_2000 ****************************************************************** Änderungsverfolgung ausschalten: ActiveDocument.TrackRevisions = False Alle Änderungen annehmen: If ActiveDocument.Revisions.Count >= 1 Then _ ActiveDocument.Revisions.AcceptAll If ActiveDocument.Revisions.Count >= 1 Then _ ActiveDocument.AcceptAllRevisions ' Alle Kommentare löschen: Dim Kommentar As Comment For Each Kommentar In ActiveDocument.Comments Kommentar.Delete 175 Next ' ********************************************** ' Sonderschrift "BSsymb9" abfragen und beseitigen: Options.DefaultHighlightColorIndex = wdPink Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Font.Name = "BSsymb9" .Text = "" .Replacement.Font.Name = "Arial" .Replacement.Text = "<!BSsymb9-Zeichen!>" .Replacement.Highlight = True .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll Options.DefaultHighlightColorIndex = wdYellow ' ********************************************** ' Unzulässige Styles (Formatvorlagen) löschen, ' folgende Styles bleiben zulässig, auch für Nummerierungen: strStylesListe = "a2, a3, ANHANG, BesuchterHyperlink, " _ & "Biblio Entry, Bild-Titel, Erklärung-grün, Fußnotentext, Fußnotenzeichen, " _ & "Hyperlink, Literaturverzeichnis, Makrozeilen, Normale Tabelle, " _ & "Standard, Tabellen-Titel, Überschrift 0, Überschrift 1, Überschrift 2, " _ & "Überschrift 3, Überschrift 4, Equation, Formula, " _ & "Überschrift_3ohne, Verzeichnis 1, Verzeichnis 2, Verzeichnis 3, Verzeichnis 4, " _ & "Verzeichnis 9," ' Es werden trotzdem nicht alle Formatvorlagen gelöscht, ' aber Fehlermeldungen nützen hier nichts, ' Error inkaufnehmen und Warnmeldungen unterdrücken: On Error Resume Next Application.DisplayAlerts = False For Each astyle In ActiveDocument.Styles If astyle.InUse = True Then If InStr(strStylesListe, astyle.NameLocal) = 0 Then ' unzulässiger Style, muss gelöscht werden. Debug.Print astyle.NameLocal ' Rückwärts suchen, um Nummerierungen zu erhalten: ActiveDocument.Range.Select Selection.Collapse Direction:=wdCollapseEnd Selection.Find.ClearFormatting Selection.Find.Style = astyle ''Selection.Find.Highlight = False With Selection.Find .Text = "" .Replacement.Text = "" .Forward = False ''True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False ' ergänzt 13. 10.2014, um Nummerierungen zu erhalten: Do While .Execute 176 ' ' ' ' ' ''If Selection.Start < 2 Then Exit Do If Selection.Range.Style <> astyle Then Exit Do Selection.Range.ListFormat.ConvertNumbersToText ''Selection.Range.HighlightColorIndex = wdPink Selection.Style = ActiveDocument.Styles(wdStyleNormal) Selection.Collapse ''Selection.MoveLeft Loop End With ''' ***** ' "Standard" wird nicht gelöscht: If astyle.NameLocal <> "Standard" Then astyle.Delete End If ' ********* End If End If Next astyle Application.DisplayAlerts = True Err.Clear On Error GoTo Zeile_Fehler ************************************ Font teilweise (!) resetten: ' Alle überschüssigen Font-Eigenschaften resetten: With Dok2.Range.Font ''.Size = ActiveDocument.Styles(wdStyleNormal).Font.Size ''.Bold = False ''.Italic = False ''.Underline = wdUnderlineNone ''.UnderlineColor = wdColorAutomatic ''.StrikeThrough = False .DoubleStrikeThrough = False .Outline = False .Emboss = False .Shadow = False .Hidden = False ''.SmallCaps = False ''.AllCaps = False .Color = wdColorAutomatic .Engrave = False ''.Superscript = False ''.Subscript = False .Spacing = 0 .Scaling = 100 .Position = 0 .Kerning = 0 .Animation = wdAnimationNone '' .Ligatures = wdLigaturesNone '' .NumberSpacing = wdNumberSpacingDefault '' .NumberForm = wdNumberFormDefault '' .StylisticSet = wdStylisticSetDefault '' .ContextualAlternates = 0 ' (obiges ist unzulässig in Word 2000, in Word 2010 vielleicht wieder aktivieren) .Name = Dok1.Styles(wdStyleNormal).Font.NameAscii End With ************************************ In Fußnoten Font-Eigenschaften bereinigen: Font resetten außer hoch- und tiefgestellt: ' Alle überschüssigen Font-Eigenschaften resetten: If Dok2.Footnotes.Count > 0 Then With ActiveDocument.StoryRanges(2).Font '' .Size = ActiveDocument.Styles(wdStyleNormal).Font.Size 177 ' ' ' ' ' ' ' ' '' .Bold = False '' .Italic = False '' .Underline = wdUnderlineNone '' .UnderlineColor = wdColorAutomatic '' .StrikeThrough = False .DoubleStrikeThrough = False .Outline = False .Emboss = False .Shadow = False .Hidden = False '' .SmallCaps = False '' .AllCaps = False .Color = wdColorAutomatic .Engrave = False ''.Superscript = False ''.Subscript = False .Spacing = 0 .Scaling = 100 .Position = 0 .Kerning = 0 .Animation = wdAnimationNone ''.Ligatures = wdLigaturesNone ''.NumberSpacing = wdNumberSpacingDefault ''.NumberForm = wdNumberFormDefault ''.StylisticSet = wdStylisticSetDefault ''.ContextualAlternates = 0 .Name = Dok1.Styles(wdStyleNormal).Font.NameAscii End With End If ************************************ Alle Rahmen um Zeichen beseitigen: ActiveDocument.Range.Font.Borders(1).LineStyle = wdLineStyleNone Alle Shapes beseitigen: Call Shapes_beseitigen *************** Schriftgröße von normalem Text an Zieldokument anpassen: Es bleibt noch ein Problem bei "Anhang" On Error Resume Next Dim aPara For Each aPara In Dok2.Range.Paragraphs If aPara.Range.Style = ActiveDocument.Styles(wdStyleNormal) Then aPara.Range.Font.Size = Dok1.Styles(wdStyleNormal).Font.Size End If Next aPara Err.Clear On Error GoTo Zeile_Fehler ************************** Warnungen mit Markierung versehen: Selection.WholeStory ''Options.DefaultHighlightColorIndex = wdYellow Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "\<\!*\>" '.Replacement.Highlight = True .Replacement.Font.Color = wdColorGreen .Replacement.Text = "" ''.Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = True 178 ' ' ' ' .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll ''Options.DefaultHighlightColorIndex = wdYellow ******************************************************************* Alles in der Zwischendatei markieren und kopieren, diese dann ohne zu speichern schließen: Selection.WholeStory Selection.Copy Zwischendatei schließen: Dok2.Close (wdDoNotSaveChanges) ' ' Im ursprünglichen Ziel-Dokument bearbeiteten Text einfügen: Dok1.Activate Selection.Paste ' ****************************************************************** ' Das neu Eingefügte in der Ursprungsdatei mithilfe der Range-Funktion markieren: Set rng1 = Selection.Range rng1.SetRange Start:=Stelle1, End:=rng1.End rng1.Select ' Formatvorlagen resetten: Selection.ParagraphFormat.Reset Selection.Fields.Update ' Fußnoten aber wieder höhersetzen: If Selection.Range.Footnotes.Count > 0 Then '' Selection.Range.Footnotes.Reference.Range.Font.Superscript = True 'geht so nicht!!! '' Alle Fußnotenzeichen 3 Punkt höher und 2 Punkt kleiner: ' (Voerst nur wiederhochsetzen, kein Anpassen) Dim i As Integer For i = 1 To ActiveDocument.Footnotes.Count Set rng1 = ActiveDocument.Footnotes(i).Reference rng1.Style = ActiveDocument.Styles(wdStyleFootnoteReference) With rng1.Font .Position = 0 '3 .Superscript = True 'False .Subscript = False ''.Size = rng1.Paragraphs(1).Range.Style.Font.Size - 2 .ColorIndex = wdAuto .Bold = False .Italic = False End With Next i End If ' ****************************************************************** ' Im Suchen/Ersetzen-Menü alles zurückstellen Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With ' ************************************ WordBasic.DisableAutoMacros 0 ' Automakros wieder erlauben 179 ' ************************************ ' Bildschirm wieder einschalten: Options.Pagination = True StatusBar = False Application.ScreenUpdating = True Application.DisplayStatusBar = True ' Alles wieder sichtbar machen: Application.Visible = True ' ****************************************************************** ' Zeitmessen für die Makro-Dauer, Variante mit 2 Nachkommastellen und verzögerter MsgBox. Zeit2 = Timer Zeitdauer = Format((Zeit2 - Zeit1), "##,##0.00") ' ************************************ ' Protokoll: ' Warteschleife, damit in Word 2010 die Messagebox nicht vor der letzten Aktualisierung ' angezeigt wird: Dim tt As Single tt = Timer Do While Timer < tt + 0.1 'Sekunden DoEvents Loop Dim strWarnung1 As String: strWarnung1 = "" Dim strWarnung2 As String: strWarnung2 = "" '' If Blhochtief = True Then '' strWarnung1 = vbCrLf & vbCrLf _ '' & "Bitte vergessen Sie nicht den Button 'höher-tiefer' zur Nachbearbeitung." '' End If If BlFormel = True Then strWarnung2 = vbCrLf & vbCrLf & "Unzulässige alte Formeln sind rot markiert." End If ' If Blhochtief = True Or BlFormel = True Or Zeitdauer > 1# Then MsgBox "Die Rechenzeit war " & Zeitdauer & " Sekunden." & vbCrLf _ & strWarnung2 _ & strWarnung1 End If Exit Sub ' ****************************************************************** ' ****************************************************************** Zeile_Zwischenablage_leer: Application.Visible = True WordBasic.DisableAutoMacros 0 MsgBox "Die Zwischenablage (Clipboard) ist leer!", vbCritical Dok2.Close (wdDoNotSaveChanges) Dok1.Activate Exit Sub ' ************************************ Zeile_Fehler: ' Bei Abbruch wegen Fehler muss auch alles wieder sichtbar gemacht werden!!! Application.Visible = True WordBasic.DisableAutoMacros 0 MsgBox "Fehler in Sub Fehlerbehandlung" & vbCrLf & "Fehlernummer: " & Err.Number & _ vbCrLf & "Fehlerbeschreibung: " & Err.Description, vbCritical Dok2.Close (wdDoNotSaveChanges) Dok1.Activate ' Für die Fehlersuche probeweise die Fehlerstelle wieder aufsuchen: '' Resume End Sub ' --------------------------------------------------------------------------------------------------------- 180 Private Sub c25_höher_tiefer_Animation_für_Word_2000() ' H.-Chris Gast, 21. bis 26. Juli 2015, 2. + 3. August 2015. ' Ersatz von "höher- und tiefergestellt" durch "hoch-" und "tiefgestellt". ' für Word 2000 bis Word 2010. ' Auch in Fußnoten werden jetzt Symbol- und Wingdingszeichen in Unicode umgewandelt. ' ' Wegen Dateien der DKE, bei denen auch vertikale Positionen mit den krummen ' Zahlen "3,5" und "4,5" vorkommen, nach denen man nicht direkt suchen kann, ' werden hier alle Zeichen gesucht, deren Vertikale Position ungleich Null ist. ' ' Damit die Umwandlung von Windows-Sonderzeichen auch in Fußnoten erfolgt, wird hier die ' Prozedur dafür in jeder Story-Range aufgerufen (2.8.2015). ' ' Auszug aus "Sub a91d" in Datei 120c, 21. - 24. Juli 2015, gekürzt und beschleunigt. ' Dipl.-Ing. Hanna-Chris Gast, 23. August 2012, neu 14. Januar 2013, Stand 16. Januar 2013. ' ' Es werden vertikale Positionen mit Nicht-Ganzen-Zahlen erfasst und dabei die im DIN unzulässigen ' Zeichenformatvorlagen der DKE beseitigt. Funktionsweise: Es werden dazu erst alle Zeichen ' mit "Position = 0" mittels Animation markiert, und dann alle nicht-markierten Zeichen abgefragt. ' ' Die hier gelöschte Beschleunigung durch Wechsel in Normalansicht führte in Word 2010 zu Absturz. ' ****************************************** Dim i As Integer ' laufende Zählung (Inhaltsverzeichnisse). Dim j As Integer: j = 0 ' Anzahl der Exponenten. Dim k As Integer: k = 0 ' Anzahl der Indizes. Dim rng1 As Range ' Dokumentkomponenten. Dim aField As Field Dim Bxb As Boolean ' fett oder nicht fett Dim Bxc As Boolean ' kursiv oder nicht kursiv Dim Intxd As Integer ' unterstrichen oder nicht Dim F1 As String ' Font des höher/tiefergestellten Zeichens ' ******************************************** On Error GoTo Zeile_Fehler_c25 ' zuhause gab es die Meldung: "Diese Aktion kann nicht rückgängig gemacht werden" Application.DisplayAlerts = False ' Auch die Fußnoten erfassen, aber nicht Kopf- und Fußzeilen: For Each rng1 In ActiveDocument.StoryRanges If rng1.StoryType > 2 Then Exit For ' *************************************** Options.DefaultHighlightColorIndex = wdYellow ' ******************* ' ((hier gekürzt, Sonderzeichen ² und ³ werden hier nicht ersetzt) ' ************************************************************* ' Windows-Sonderzeichen in Haupttext, aber auch in Fußnoten umwandeln: rng1.Select '' Application.Run MacroName:= _ '' "Symbol_Wingdings_in_Unicode_nur_Markierten_Text" ' Makro in der "Template2" verwenden (3.August 2015): Application.Run MacroName:= _ "Symbol_Wingdings_in_Unicode_nur_Markierten_Text" ' Bei Roter Markierung den Zeichencode eindeutig in den PUA-Bereich verschieben: Selection.Find.ClearFormatting Selection.Find.Highlight = True With Selection.Find .Text = "^?" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False 181 .MatchSoundsLike = False .MatchAllWordForms = False Do While .Execute If Selection.Range.HighlightColorIndex = wdRed Then On Error Resume Next With Dialogs(wdDialogInsertSymbol) Selection.Text = ChrW(.charNum + 4096 + 61440) End With Selection.Font.Name = "Courier New" Err.Clear On Error GoTo 0 End If Loop End With ' ****************************************************** ' Für "Höher/Tiefer zuerst alle Zeichen mit Position = 0 ' durch Animation markieren: ' ****************************************************** rng1.Find.ClearFormatting rng1.Find.Replacement.ClearFormatting With rng1.Find .Font.Position = 0 .Text = "" .Replacement.Text = "" .Replacement.Font.Animation = wdAnimationLasVegasLights .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With rng1.Find.Execute Replace:=wdReplaceAll ' obiges reichte nicht, ' Animation auf Einzelzeichen genau abgrenzen (spart Rechenzeit): rng1.Find.ClearFormatting rng1.Find.Replacement.ClearFormatting With rng1.Find .Font.Animation = wdAnimationNone .Font.Position = 0 .Text = "^?" .Replacement.Text = "" .Replacement.Font.Animation = wdAnimationLasVegasLights .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With rng1.Find.Execute Replace:=wdReplaceAll ' alle Felder animieren(sie werden nicht bearbeitet): For Each aField In rng1.Fields aField.Result.Font.Animation = wdAnimationLasVegasLights Next aField ' ************************************************* ' Alle bereits vorhandenen höher- und tiefergestellte Zeichen ersetzen ' (das sind jetzt die Zeichen ohne Animation): 182 rng1.Select Selection.Collapse ' "HomeKey Unit:=wdStory" würde auf Hauptkomponente springen. ' *************** With Selection.Find .ClearFormatting .Text = "^?" ' dadurch werden nur noch Zeichen, nicht mehr Tabellenmarken abgefragt. .Replacement.Text = "" .Forward = True .Wrap = wdFindStop .Format = True .Font.Animation = wdAnimationNone '' .Font.ColorIndex = wdAuto .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False Do While .Execute ' **************************** If Selection.Font.Position > 1 Then ' Exponenten: ' *************************** ' Höhergestellte Zeichen, auch die der DKE mit Nicht-Ganzen Positionszahlen. ' Ggf. Zeichenformatvorlagen beseitigen und hochstellen statt höherstellen, ' hier werden "fett", "kursiv" und "unterstrichen" nach Löschen des Styles ' sowie Font wiederhergestellt: If Selection.Style.Type = wdStyleTypeCharacter Then ' höhergestelltes Zeichen gefunden: ' Weitere Zeicheneigenschaften sichern: Bxb = Selection.Font.Bold Bxc = Selection.Font.Italic Intxd = Selection.Font.Underline F1 = Selection.Font.Name ''''''''''''''''''''''''''''''''''' ''Selection.Style.Delete ''Selection.Style = ActiveDocument.Styles("Standard") ' funktionierte nicht! Selection.Font.Reset ''''''''''''''''''''''''''''''''''' ' Neuzuordnen von Eigenschaften: Selection.Font.Name = F1 Selection.Font.Bold = Bxb Selection.Font.Italic = Bxc Selection.Font.Underline = Intxd End If Selection.Font.Superscript = True Selection.Font.Subscript = False Selection.Font.Position = 0 '3 ''' If Selection.Font.Size >= 9 Then ''' Selection.Font.Size = Selection.Style.Font.Size - 2 ''' End If ' ***** j=j+1 Selection.Range.HighlightColorIndex = wdTurquoise Selection.Font.Animation = wdAnimationLasVegasLights ' nur so werden Endlosschleifen in geschachtelten Tabellen vermieden. Selection.Collapse wdCollapseEnd ' **************************** ElseIf Selection.Font.Position < -1 Then ' Indizes: ' **************************** ' Tiefer gesetztes Zeichen: If Selection.Style.Type = wdStyleTypeCharacter Then 183 ' Weitere Zeicheneigenschaften sichern: Bxb = Selection.Font.Bold Bxc = Selection.Font.Italic Intxd = Selection.Font.Underline F1 = Selection.Font.Name ''''''''''''''''''''''''''''''''''' 'Selection.Style.Delete ''Selection.Style = ActiveDocument.Styles("Standard") ' Funktioniert nicht. Selection.Font.Reset Selection.Font.Name = F1 ''''''''''''''''''''''''''''''''''' ' Neuzuordnen von Eigenschaften: Selection.Font.Name = F1 Selection.Font.Bold = Bxb Selection.Font.Italic = Bxc Selection.Font.Underline = Intxd End If Selection.Font.Superscript = False Selection.Font.Subscript = True Selection.Font.Position = 0 ''If Selection.Font.Size >= 9 Then '' Selection.Font.Size = Selection.Style.Font.Size - 2 ''End If ' **** k=k+1 Selection.Range.HighlightColorIndex = wdDarkYellow Selection.Font.Animation = wdAnimationLasVegasLights ' nur so werden Endlosschleifen in geschachtelten Tabellen vermieden. Selection.Collapse wdCollapseEnd Else ' vermutlich Fehler oder positioniertes grafisches Zeichen (Position -1 bis + 1): Selection.Font.Position = 0 Selection.Range.HighlightColorIndex = wdPink Selection.Font.Animation = wdAnimationLasVegasLights Selection.Collapse wdCollapseEnd End If Loop End With ' ******************************* ' Animation im ganzen StoryRange wieder beseitigen: rng1.Font.Animation = wdAnimationNone ' Alle Felder in StoryRange aktualisieren: rng1.Fields.Update ' ******************************* ' Nächste Dokumentkomponente: Next rng1 ' ************************************ ' Cursor muss wieder in die Hauptkomponente gestellt werden! ActiveDocument.StoryRanges(1).Select Selection.Font.Animation = wdAnimationNone ' Application.DisplayAlerts = True ' ************************************ ''' Protokoll: '' MsgBox "Die Rechenzeit der Version a013c25 'für Word 2000' war " _ '' & Zeitdauer & " Sekunden. " & vbCrLf _ '' & "Alle Exponenten und Indizes wurden unterschiedlich gefärbt. " & vbCrLf _ '' & "Es gibt " & j & " Exponenten und " & k & " Indizes. " ''' ************************************ If j + k > 0 Then Blhochtief = True Exit Sub ' ******************************************************** 184 Zeile_Fehler_c25: Application.Visible = True MsgBox "Fehler in Sub Fehlerbehandlung" & vbCrLf & "Fehlernummer: " & Err.Number & _ vbCrLf & "Fehlerbeschreibung: " & Err.Description, vbCritical '' Dok2.Close (wdDoNotSaveChanges) '' Dok1.Activate ''Set Dok1 = Nothing ''Set Dok2 = Nothing ' Für die Fehlersuche probeweise weiterversuchen(?): Resume End Sub ' --------------------------------------------------------------------------------------------------------- Private Sub Shapes_beseitigen() ' H. Chris Gast, September 2012, Januar 2013, Januar 2015, 13. + 14. Oktober 2015. ' Makro beseitigt störende Shapes und wandelt sie ggf. um in Frames und InlineShapes. ' Erfasst nicht alle Grafiken, wenn pdf mit Adobe X in Word umgewandelt wurde. Dim i As Integer Dim IntType As Integer For i = ActiveDocument.Shapes.Count To 1 Step -1 If ActiveDocument.Shapes(i).Type = msoTextBox Then ' 17 ' Textfelder umwandlen in Textrahmen (Textbox in Frame) ActiveDocument.Shapes(i).ConvertToFrame ElseIf ActiveDocument.Shapes(i).Type = msoPicture Then ' 13 ' frei positioniertes Bild (Picture) in normale Bildposition. ActiveDocument.Shapes(i).ConvertToInlineShape ElseIf ActiveDocument.Shapes(i).Type = msoLinkedPicture Then ' 11 ' frei positioniertes verknüpftes Bild (Linked Picture). On Error Resume Next IntType = ActiveDocument.Shapes(i).Type ActiveDocument.Shapes(i).ConvertToInlineShape If Err.Number > 0 Then ''ActiveWindow.ScrollIntoView Selection.Range ' Sonst sieht man nichts! 'Testweise: ActiveDocument.Shapes(i).Select ''Selection.Range.Paragraphs(1).Range.HighlightColorIndex = wdDarkRed ''MsgBox "Abbruch: Diese Grafik lässt sich nicht umwandeln!", vbCritical ActiveDocument.Shapes(i).Delete Selection.TypeText "<!Shape-Typ " & IntType & " gelöscht>" Err.Clear ''Exit Sub End If On Error GoTo 0 Else ' AutoForm, Zeichnungsobjekt oder sonstige Grafikobjekte löschen. IntType = ActiveDocument.Shapes(i).Type ActiveDocument.Shapes(i).Select ActiveDocument.Shapes(i).Delete Selection.TypeText "<!Shape-Typ " & IntType & " gelöscht>" End If Next i ' ****** End Sub ' --------------------------------------------------------------------------------------------------------- 185 Anhang A Weitere Verbesserungen für Word 2000 In diesem Anhang gebe ich einige für Word 2000 nützliche Makros an (die natürlich auch in neueren Word-Versionen funktionieren). Damit kann Word 2000 eigentlich alles, was ich brauche. Ich sehe keine Notwendigkeit, mich privat auf eine neue Word-Version umzustellen. Weitere Makros für Word siehe auch [6]. A.1 Beseitigen der bei Word 2000 lästigen Symbol-Leiste "Web" In Word 2000 tauchte beim Anklicken im Inhaltsverzeichnis oder beim Anklicken eines Querverweises jedes Mal die Symbolleiste "Web" wieder auf. In Google fand ich das Problem häufig gelistet, jedoch überwiegend nur mit der Fragestellung und fast gar nicht mit einer brauchbaren Lösung. Deshalb hier nun eine Lösung, die sich bei mir bewährte 51. In der Vorlage "Normal.dot" ist die folgende Datei Sub AutoExec() CommandBars("Web").Enabled = False End Sub im Ordner "ThisDocument" unterzubringen (siehe Bild B.1): Bild A.1: Screenshot des Makro-Explorer (Word 2000) Dieses Makro funktioniert nicht für die Symbol-Leiste des "PDFMaker" von Adobe. Diese kann erst unmittelbar beim Öffnen einer Datei deaktiviert werden. A.2 Tastenkürzel anpassen in Word 2000 Ich habe mir in Word 2000 den Befehl für "Seitenansicht" an Word 2003 (Alt + D, A ) und den Befehle für "Speichern unter" an Adobe (Strg + Shift + S ) angepasst (Zuordnung von Tastenkürzeln siehe [6]). Insgesamt finde ich den Umgang mit dem alten Word 2000 und dem zugehörigen Photo-Editor angenehmer als mit dem Nachfolge-Systeme Word 2003 bis Word 2010. 51 186 Hiermit sei A. Gumtow gedankt, der mir aus den hunderten von Google-Fundstellen die richtige herausgesucht hat. A.3 Tabellen auch in Word 2000 in "Raster 5" formatieren Bei dem Makro-Befehl "Gitternetz 5" in Word 2000 52 gehen die Textfarben sowie die Eigenschaften "kursiv" und "fett" verloren, egal wie man die Optionen ("Schalter") setzt. Soll in Word 2000 eine Tabelle nachträglich mit "Raster 5" formatiert werden, wie es sonst erst ab Word 2003 möglich ist, mit Erhalt von farbigem Text und Erhalt des Schriftschnitts "kursiv", kann das mit folgendem Makro erreicht werden. Sub Tabelle_formatieren_wie_Raster_5() ' von "http://www.schreibbuero-richter.de", 28. März 2012. Dim tbl As Word.Table Dim cel As Word.Cell ' Set tbl = Selection.Tables(1) ' ' automatische Größenänderung ausschalten If tbl.AllowAutoFit Then tbl.AllowAutoFit = False End If ' ' "Abstand zwischen Zellen" deaktivieren/auf 0 setzen If tbl.Spacing > 0 Then tbl.Spacing = 0 ' nur den Abstand auf 0 stellen, reicht leider nicht ' auch die Checkbox muss deaktiviert werden, ' dafür gibt es in VBA keinen Schalter, deswegen so: With Dialogs(1080) If .AllowSpacing <> 0 Then .AllowSpacing = 0 .Execute End If End With End If ' ' erst Innenlinien: With tbl.Borders(wdBorderHorizontal) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth075pt .Color = wdColorBlack End With With tbl.Borders(wdBorderVertical) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth075pt .Color = wdColorBlack End With ' ' dann Außenlinien: With tbl.Borders(wdBorderBottom) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth150pt .Color = wdColorBlack End With With tbl.Borders(wdBorderTop) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth150pt .Color = wdColorBlack End With 52 als Makrobefehl: "Selection.Tables(1).AutoFormat Format:=wdTableFormatGrid5,. . ." 187 With tbl.Borders(wdBorderLeft) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth150pt .Color = wdColorBlack End With With tbl.Borders(wdBorderRight) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth150pt .Color = wdColorBlack End With ' ' 1. Zeile/n zur Kopfzeile machen tbl.Range.Cells(1).Select Selection.Collapse wdCollapseStart Selection.SelectRow Selection.Rows.HeadingFormat = True End Sub ' --------------------------------------------------------------------------------------------------------- A.4 Befehl "Edit Field" auch für Word 2000 In Word 2000 fehlte noch die Funktion, dass man mit einem Mausklick rechts ein vorhandenes Feld bearbeiten kann. Das folgende Makro kann hier ein bisschen Abhilfe schaffen. Glücklicherweise funktioniert neuerdings (Stand: Sommer 2013) der SendKeys-Befehl in Word 2000 unter Windows XP, was bisher fast unmöglich war. Ein bisschen ist das immer noch eine etwas heikle Sache. Aber nur mit SendKeys kann man in den Word-Dialog für Felder den Feldtyp eingeben, soviel ich weiß. Der entscheidende Hinweis: SendKeys funktioniert bei Aufruf des Makros durch Tastenkürzel nur dann, wenn das Makro vor dem Sendkeys-Befehl eine Pause von 1 Sekunde macht! In Word 2010 funktioniert das folgende Makro gut bei Inhaltsverzeichnissen, ist aber nicht brauchbar bei anderen Feldern wie Datumsfeldern. 53 Für das folgende Makro habe ich mir ein Tastenkürzel festgelegt. Sub Feld_Dialog_halbgefüllt_öffnen_Word_2000() ' H. Chris Gast, 10. August 2013. ' Dieses Makro ersetzt teilweise den in Word 2000 noch fehlenden Befehl "Edit Field", ' der ab Word 2003 mit rechtem Mausklick wählbar ist. ' ' Inhaltsverzeichnis und Datumsangaben können so recht gut bearbeitet werden. Bei Querverweisen ' gehen die vorhandenen Einstellungen verloren und müssen neu gewählt werden. ' Die alten Schalter werden nicht ausgelesen. Das Makro ist aber in Word 2000 trotzdem hilfreich. ' **** Dim a1 As String ' der gesamte ausgelesene Feldcode Dim a2 As String ' der einfache Feldcode ohne Zusätze Dim b1 As String ' der Zusatz im Feldcode hinter dem Leerzeichen ' ************************************* ' Das Feld in oder an der markierten Stelle markieren: Selection.Expand Unit:=wdSentence 53 188 Version für Word 2010 auf Anfrage lieferbar. ' ' ' ' ' ' ' ' ' ' ' ' '' If Selection.Range.Fields.Count = 0 Then MsgBox "Es ist kein Feld markiert!" Exit Sub End If ' Beim Inhaltsverzeichnis ist unter Umständen nur eine Zeile mit Feldcode "Hyperlink" markiert; ' mit den folgenden 2 Befehlen wird die Markierung an den Beginn des Inhaltsverzeichnisses ' verschoben. ActiveDocument.Fields.ToggleShowCodes ActiveDocument.Fields.ToggleShowCodes ' Wenn nicht genug markiert ist, Markierung erweitern: If Selection.Range.Fields.Count = 0 Then Selection.Range.Words(1).Fields(1).Select Else Selection.Range.Fields(1).Select End If ****************************************** Feldcode-Stücke aus dem markierten Feld auslesen: a1 = Selection.Range.Fields(1).Code ' zum Beispiel a1 = "CREATEDATE \@ "d. MMMM yyyy" a2 = Trim(Left(a1, InStr(3, a1, " "))) ' zum Beispiel: a2 = "CreateDate" (ohne Leerzeichen) b1 = Trim(Mid(a1, InStr(3, a1, " ") + 4)) ' zum Beispiel: b1 = "d. MMMM yyyy" b1 = Replace(b1, ChrW(34), "") ' Gänsefüßchen entfernen! ****************************************** Je nach Feldtyp unterschiedliche Dialoge aufrufen: ****************************************** If UCase(a2) = "TOC" Then ' Inhaltsverzeichnis: With Dialogs(wdDialogInsertTableOfContents) If .Display = -1 Then ' User selected OK, remove old and insert new Selection.Delete .Execute End If End With Exit Sub ElseIf InStr(LCase(a1), "ref _ref") > 0 Then ' Querverweis auf andere Abschnitte: With Dialogs(wdDialogInsertCrossReference) If .Display = -1 Then ' User selected OK, remove old and insert new Selection.Delete .Execute Selection.Fields.Update End If End With Exit Sub End If ****************************************** Per Sendkey im Dialog "Dialogs(wdDialogInsertField)" den ermittelten Feldcode einfügen: ****************************************** Bei Start des Makros per Tastenkürzel vor SendKeys-Befehl 1 Sekunden warten (siehe auch "http://support.microsoft.com/kb/138624"): Dim tt As Double tt = Timer Do While Timer < tt + 1# ' 1,0 Sekunde DoEvents Loop ******************** Die SendKeys-Befehle sind je nach Word-Version unterschiedlich: If Val(Application.Version) = 9 Then ' Word-Version ist Word 2000. ' (die SendKey-Befehle werden am besten vor dem Dialog eingegeben): SendKeys "(%b)" ' Häkchen entfernen bei "Formatierung beibehalten" 189 SendKeys "(%n)" & a2 ' Codenamen einfügen If UCase(a2) = "REF" Then ' Verweisung auf Textmarke: '' b1 = Left(Mid(a1, InStr(2, a1, " ") + 1), InStr(6, a1, " ") - 6) SendKeys "(%o)(%m)(%n)" ' & b1 '', True ' & "(%z)" '' SendKeys "(%z)" Else ' Datumsangaben und anderes. SendKeys "(%o)" '' & b1 & "(%z)" ' es wurde hier die falsche Option eingefügt! End If With Dialogs(wdDialogInsertField) .Show End With ' ************** '' End If ActiveDocument.Fields(1).ShowCodes = False End Sub Zu beachten ist: Um SendKeys in einem Makro zu verwenden, das durch ein Tastenkürzel gestartet wird, muss man eine Warteschleife von einer Sekunde einbauen. Die SendKeys werden am besten vor die Zeile mit dem "WdDialog" gestellt. Ein "True" für "Warten" hinter die SendKeys-Befehle führte zu Fehlfunktionen. Zwischen "Sendkeys" und "WdDialog" darf keine Verzögerung eingebaut werden. A.5 Lösung zu dem Problem mit "Gehe zu Seite" in Word 2000 Bei "Gehe zu Seite" ist in Word 2000 das Eingabefeld nicht leer. Es steht darin die letzte Seiteneingabe. Ich muss dann diese erst löschen, bevor ich die neue Zielseitennummer eingeben kann. Endlich fand ich dafür eine Abhilfe. Ich programmiere ein Ersatzmakro für diesen Befehl: Sub GoTo_Eingabefeld() ' Erstellt von H. Chris Gast, 30. Juni 2011. ' Ruft Dialogfeld auf, ohne dass in Word 2000 fehlerhaft das Eingabefeld schon einen ' Zahlenwerte vom letzten Mal enthält. Dialogs(wdDialogEditGoTo).Show End Sub Es zeigte sich, dass bei diesem Makro das Eingabefeld stets leer ist. Ich wies diesem Makro das Tastenkürzel "Strg + G" zu. Statt des fehlerhaften eingebauten Befehls wird nun stets das neue Makro ausgeführt. Anmerkung: Ich weise die gewünschten Tastenkürzel lieber von Hand zu, nur bei der Übertragung in einen neuen Computer verwende ich wegen der Vielzahl der Tastenkürzel ein Formblatt mit Makros aller Tastenkürzel, siehe [6]. 190 A.6 Suche nach Text mit Farbschattierung in Word 2000 Mit dem folgenden zwei Makros kann man auch in Word 2000 nach einer oder mehreren Hintergrundsfarben suchen, was sonst mit dem normalen Suchbefehl nicht funktioniert. Sub Farbe_in_Text_suchen() ' H. Chris Gast, 11. Januar 2015. ' Suche die nächste Textstelle mit (irgendeiner) Farbe. ' Es wird nicht nach Tabellenschattierungen gesucht. ' Funktioniert auch bei Word 2000. ' Man kann in Word 2000 zwar nach "Highlight" suchen, aber die Suche nach "Shading" mit ' "Selection.Find.Font.Shading.BackgroundPatternColor = …" funktioniert nicht in Word 2000! ' Deshalb die folgende Lösung mit "For Each...Characters". ' Dabei wird auch gleichzeitig nach Schriftfarbe und nach "Highlight" gesucht. ' ********************* Dim aChr As Range Dim Rng0 As Range Set Rng0 = Selection.Range Rng0.SetRange Start:=Rng0.End, End:=ActiveDocument.Range.End ' For Each aChr In Rng0.Characters If aChr.HighlightColorIndex <> wdAuto _ Or aChr.Font.Shading.BackgroundPatternColor <> wdColorAutomatic _ Or aChr.Font.Shading.ForegroundPatternColor <> wdColorAutomatic _ Or aChr.Font.Color <> wdColorAutomatic Then aChr.Select ' ' Hier gegebenenfalls Abfragen nach einer bestimmten Farbe einfügen. MsgBox "Hier wurde eine farbige Text-Stelle gefunden!" Exit Sub End If Next aChr MsgBox "Keine (weiteren) farbigen Textstellen im Text." End Sub Sub hellrosa_Schattierung_suchen() ' H. Chris Gast, 11. Januar 2015. ' Suche die nächste Textstelle mit einer von zwei bestimmten hellrosa Farbschattierungen. ' Funktioniert auch bei Word 2000. ' Will man alle hellrosa-Töne finden, muss man den "ColorIndex = 5" abfragen, dann ' findet das Makro aber auch Farbtöne, die meines Erachtens eher lila aussehen. ' ********************* Dim aChr As Range Dim Rng0 As Range Set Rng0 = Selection.Range Rng0.SetRange Start:=Rng0.End, End:=ActiveDocument.Range.End ' For Each aChr In Rng0.Characters '' If Selection.Font.Shading.BackgroundPatternColorIndex = 5 Then If aChr.Font.Shading.BackgroundPatternColor = 16764159 _ Or aChr.Font.Shading.BackgroundPatternColor = wdColorRose Then aChr.Select MsgBox "Hier wurde eine hell-rosa Schattierung gefunden!" Exit Sub End If Next aChr MsgBox "Keine (weiteren) rosa Textstellen im Text." End Sub 191 A.7 Alle Bilder eines Ordners gleichzeitig in eine Datei einfügen Dieses Makro funktioniert auch in Word 2000, wo man sonst nur ein einziges Bild auf einmal einfügen kann. Wenn das gewählte Bild eine "jpg-Datei" ist, werden alle jpg-Bilder des Ordners (mit Dateiname als Bildtitel) eingefügt. Wenn das gewählte Bild ein "tif-Datei" ist, werden alle Tif-Bilder eingefügt usw. Sub a1_alle_Bilder_eines_Dateityps_einfügen_aus_wählbarem_Verzeichnis() ' H. Chris Gast, 16. Oktober 2012. ' nach verschiedenen Vorlagen aus dem Internet, kombiniert, verändert und erweitert. ' Dieses Makro fügt alle Bilder des gewählten Dateityps aus dem gewählten Ordner ' mit Dateiname als Bildtitel an der Markierung in die aktuelle Datei ein. ' Die Bilder werden beim Einfügen ggf. automatisch an die Spaltenbreite angepasst, ' was zum Beispiel für Spaltensatz günstig ist. ' Funktioniert in Word 2000 bis Word 2010. ' Offenes Problem: Die Reihenfolge der Bilder ist oft nicht wunschgemäß. ' Dim sBilddateiname As String Dim strPfad As String ' Pfad des Ordners mit den Bildern Dim strFullname As String Dim Endung As String ' ' Formateinstellungen merken: Selection.CopyFormat ' *********** MsgBox "Wählen sie im folgenden Menü ein beliebiges Bild des Ordners aus, " _ & "dessen Bilder einzufügen sind, und drücken Sie dort den Button ""Einfügen""." With Application.Dialogs(wdDialogInsertPicture) .Display strFullname = .Name End With If strFullname = "" Then MsgBox "Es wurde nichts ausgewählt!" Exit Sub End If strPfad = Left(strFullname, InStrRev(strFullname, "\") - 1) & Application.PathSeparator Endung = Right(strFullname, 3) ' Endung = "*." & Endung ' **************** sBilddateiname = Dir(strPfad & "*." & Endung) ' ********* ' Überschrift, zentriert und fett: Selection.TypeParagraph Selection.TypeText Text:="Der Ordner " & strPfad _ & " enthält folgende " & Endung & "-Bilder:" & vbCrLf 'Selection.MoveUp Unit:=wdLine, Count:=1, Extend:=wdExtend Selection.MoveUp Unit:=wdParagraph, Count:=1, Extend:=wdExtend ' Selection.Font.Bold = True Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter Selection.MoveDown Unit:=wdParagraph, Count:=1 Selection.Font.Bold = False Selection.Font.Size = 10 Selection.Font.Name = "Arial" ' **************** ' Zum Bildeinfügen Schleife über alle jpg-Dateien im gewählten Ordner: Do While sBilddateiname <> "" Selection.InlineShapes.AddPicture FileName:=strPfad & sBilddateiname, LinkToFile:=False, _ 192 SaveWithDocument:=True With Selection .ParagraphFormat.Alignment = wdAlignParagraphCenter ' wdAlignLeft .TypeText Text:=vbCrLf & sBilddateiname & vbCrLf & vbCrLf End With sBilddateiname = Dir() Loop ' ********* ' Absatzausrichtung zurückstellen und ggf. überflüssige Absatzmarke beseitigen: If Selection = ChrW(13) Then Selection.Delete Selection.PasteFormat Selection.Collapse End Sub Diese Makro verwende ich auch noch in Word 2010, wenn ich in einer Word-Datei die Bilder mit den Dateinamen als Bildtitel haben will. Bilder skalieren Bilder werden beim Einfügen nicht größer als der Satzspiegel. Wenn ich die Bilder beim Einfügen skaliert haben will, erzeuge ich vorher Spaltensatz im Text. Dann werden die Bilder nicht breiter als die Textspalten. Anschließend kann ich den Spaltensatz, wenn ich will, wieder beseitigen. 193 Anhang B Die Rechenformel zum Umrechnen von UTF8-Code in normale Zeichen B.1 Auszug aus: ISO/IEC 10646:2003, D.5 " Mapping from UTF-8 form to UCS-4 form" Table D.5 defines in mathematical notation the mapping from the UTF-8 coded representation form to the UCS-4 coded representation form. In the left column (UTF-8) the following notations apply: z is the first octet of a sequence. Its value determines the number of continuing octets in the sequence. y is the 2nd octet in the sequence. x is the 3rd octet in the sequence. w is the 4th octet in the sequence. v is the 5th octet in the sequence. u is the 6th octet in the sequence. The ranges of values applicable to these octets are shown in D.2 above, following Table D.1. NOTE - The algorithm for converting from UTF-8 to UCS-4 can be summarised as follows. For each coded character in UTF-8 the bits in the free bit positions are concatenated as a bit-string. The bits from this string, in increasing order of significance, are then distributed across the bit positions of a four-octet sequence, starting from the least significant bit position. The remaining bit positions of that sequence are filled with ZERO bits. Table D.5 - Mapping from UTF-8 to UCS-4 Sequence of octets in UTF-8 Four-octet sequences in UCS-4 z = 00 .. 7F; z; z = C0 .. DF; y; (z-C0)*26 + (y-80); (z-E0)*212 + (y-80)*26 + (x-80); (z-F0)*218 + (y-80)*212 +(x-80)*26 + (w-80); (z-F8)*224 + (y-80)*218 +(x-80)*212 + (w-80)*26 + (v - 80); (z-FC)*230 + (y-80)*224 +(x-80)*218 + (w-80)*212 + (v-80)*26 + (u-80); z = E0 .. EF; y; x; z = F0 .. F7; y; x; w; z = F8 ..FB; y; x; w; v; z = FC, FD; y; x; w; v; u; Meine Anmerkung dazu: Achtung! Die "80" ist ein Hexadezimaler Wert, = dezimal 128! Dagegen die Exponenten sind es nicht! 194 B.2 Zwei fertige Makros für die Umwandlung von Internet-Adressen mit UTF8 in normalen Text Option Explicit ' Für MsgBox mit Unicodezeichen: Private Declare Function MessageBoxW Lib "user32.dll" _ (ByVal hwnd As Long, _ ByVal lpText As Long, _ ByVal lpCaption As Long, _ ByVal uType As Long) As Long Sub UTF8_im_Text_decodieren() ' H. Chris Gast, 10. Juni 2015, 2. + 24. + 27. Juli 2015, 12. + 26. + 27. August 2015. ' UTF8 in Internet-Dateinamen decodieren (erkennbar an den Prozentzeichen). ' Vierbyte-Code (beginnend mit "F") wird von dem Makro wegen der Seltenheit (noch) nicht erfasst. ' Es darf nur das jeweilige codierte Zeichen ersetzt werden, nicht Nachbarzeichen, ' die Windows-Sonderzeichen sein können. ' ' Es wird auch der Text geändert, dekodierte Zeichen werden unterstrichen. ' *************************** Dim Rng1 As Range Dim strCode As String Dim strErsatz As String Dim strText As String Dim i As Integer: i = 0 Dim k As Integer: k = 0 Dim strInternetadresse As String Dim strAusgangstext As String Dim strMisserfolg As String: strMisserfolg = "" Dim Rng2 As Range Dim strEinschränkungstext ' ********************************************** '' Selection.HomeKey Unit:=wdStory ' Ganze Internetadresse markieren (Ganze Wörter erfassen): ' Den Beginn der Internet-Adresse erfassen (anhand Leerzeichen oder Umbrüche usw.): Selection.MoveStartUntil Cset:=" ,?;[]" & ChrW(1) & ChrW(31) & ChrW(30) & ChrW(12) _ & ChrW(7) & ChrW(31) & ChrW(13) & ChrW(160), Count:=wdBackward ' Das Ende der Internet-Adresse (anhand Leerzeichen oder Umbrüche usw.): Selection.MoveEndUntil Cset:=" ,?;[]" & ChrW(1) & ChrW(31) & ChrW(30) & ChrW(12) _ & ChrW(7) & ChrW(31) & ChrW(13) & ChrW(160), Count:=wdForward ' *** Set Rng1 = Selection.Range Rng1.SetRange Start:=Rng1.Start, End:=Rng1.End + 1 strAusgangstext = Selection.Text ' ************* Selection.Range.Fields.Unlink ' ********************************************** ' Schleife, um alle UTF-8-Zeichen in der Markierung (Rng1) zu erfassen: ' Zieladresse der Schleife: Zeile_Schleife_Weitermachen: ' ************************** ' Prozentzeichen suchen: Selection.Find.ClearFormatting With Selection.Find .Text = "%" .Replacement.Text = "" 195 .Forward = True ' .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute If Selection.Find.Found = False Then GoTo Zeile_Ergebnis ' geht so oft nicht, sucht endlos weiter, deshalb auch mit "Rng1" abfragen: If Selection.Range.End > Rng1.End Then Rng1.Select ''Exit Sub GoTo Zeile_Ergebnis Else Set Rng2 = Selection.Range End If ' ************************ ' Das Zeichen hinter dem ersten gefundenen "Prozent" markieren: Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend ' *************** ' 1. Buchstabe nach dem Prozentzeichen untersuchen: If UCase(Selection.Text) = "C" Or UCase(Selection.Text) = "D" Then ' Zwei-Byte-Code: Selection.MoveRight Unit:=wdCharacter, Count:=4, Extend:=wdExtend Rng2.SetRange Start:=Rng2.Start, End:=Selection.End strCode = Replace(Selection, "%", "") strErsatz = ChrW(Fkt_zweiByte_Sequenz(strCode)) 'strUTF_decodiert = Replace(strUTF_decodiert, "%" & Selection.Text, strErsatz) Rng2.Text = strErsatz Rng2.Font.Underline = True i=i+1 ElseIf UCase(Selection.Text) = "E" Then ' Drei-Byte-Code: Selection.MoveRight Unit:=wdCharacter, Count:=7, Extend:=wdExtend Rng2.SetRange Start:=Rng2.Start, End:=Selection.End strCode = Replace(Selection, "%", "") strErsatz = ChrW(Fkt_dreiByte_Sequenz(strCode)) ' strUTF_decodiert = Replace(strUTF_decodiert, "%" & Selection.Text, strErsatz) Rng2.Text = strErsatz Rng2.Font.Underline = True i=i+1 ElseIf UCase(Selection.Text) = "F" Then ' Vier-Byte-Code oder unzulässig: Selection.MoveRight Unit:=wdCharacter, Count:=10, Extend:=wdExtend Rng2.SetRange Start:=Rng2.Start, End:=Selection.End strCode = Replace(Selection, "%", "") strErsatz = ChrXXL(Fkt_vierByte_Sequenz(strCode)) If strErsatz = "" Then MsgBox "unzulässiger UTF8-Code!", vbInformation ' kein UTF8-Code: k=k+1 Selection.Collapse Direction:=wdCollapseEnd Else strInternetadresse = Replace(strInternetadresse, "%" & Selection.Text, strErsatz) Rng2.Text = strErsatz Rng2.Font.Underline = True i=i+1 End If 196 ''''''''''''''''''''''''' Else ' einfaches ASCII-Zeichen oder kein UTF8: If UCase(Selection.Text) Like "[0-9,A-B]" Then Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend Rng2.SetRange Start:=Rng2.Start, End:=Selection.End '' MsgBox "1-Byte-Sequenz" strErsatz = ChrW(Val("&H" & Selection.Text & "&")) ''MsgBox "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ & ChrW(Val("&H" & Selection.Text & "&")) & "'." 'strUTF_decodiert = Replace(strUTF_decodiert, "%" & Selection.Text, strErsatz) Rng2.Text = strErsatz Rng2.Font.Underline = True i=i+1 Else ' kein UTF8-Code: k=k+1 '' GoTo Zeile_Ergebnis End If End If '' MsgBox "Der UTF-Code ist: " & Replace(Selection, "%", " ") ' ************************** ' Schleife nach oben: Selection.Collapse Direction:=wdCollapseEnd GoTo Zeile_Schleife_Weitermachen ' ********************************************** Zeile_Ergebnis: strInternetadresse = Selection.Text 'Rng1.Text ' ****** strEinschränkungstext = "" If k > 1 Then strMisserfolg = vbCrLf & vbCrLf & _ "Der markierte Text enthält mindestens " & k & " Prozentzeichen, die keine UTF-8-Codes sind." strEinschränkungstext = "(soweit decodierbar)" ElseIf k = 1 Then strMisserfolg = vbCrLf & vbCrLf & _ "Der markierte Text enthält mindestens ein Prozentzeichen, das kein UTF-8-Code ist." strEinschränkungstext = "(soweit decodierbar)" End If If i > 0 Then strText = "Der markierte Text: " & vbCrLf & strAusgangstext & vbCrLf & vbCrLf & " enthält " & i _ & " UTF8-Codes und bedeutet " & strEinschränkungstext & ": " & vbCrLf _ & strInternetadresse & strMisserfolg i = MessageBoxW(0, StrPtr(strText), StrPtr("UTF8-Decodierung"), 0) Else MsgBox "Der markierte Text: " & vbCrLf & strAusgangstext & vbCrLf _ & " enthält keine decodierbaren UTF8-Codes." & strMisserfolg Exit Sub End If End Sub Sub UTF8_Decodierung_nur_als_MsgBox_ausgeben() ''Sub UTF8_decodieren() ' H. Chris Gast, 10.6.2015, 2. Juli 2015, 24. Juli 2015, 27. Juli 2015. ' UTF8 in Internet-Dateinamen decodieren (erkennbar an den Prozentzeichen): Dim Rng1 As Range Dim strCode As String Dim strInternetadresse As String Dim strAusgangstext As String Dim strFundstelle As String Dim strErsatz As String 197 Dim strText As String Dim i As Integer: i = 0 Dim k As Integer: k = 0 Dim strMisserfolg As String: strMisserfolg = "" ' ********************************************** ' Ganze Internetadresse markieren (Ganze Wörter erfassen): ' Den Beginn der Internet-Adresse erfassen (anhand Leerzeichen oder Umbrüche usw.): Selection.MoveStartUntil Cset:=" ,?;[]" & ChrW(1) & ChrW(31) & ChrW(30) & ChrW(12) _ & ChrW(7) & ChrW(31) & ChrW(13) & ChrW(160), Count:=wdBackward ' Das Ende der Internet-Adresse (anhand Leerzeichen oder Umbrüche usw.): Selection.MoveEndUntil Cset:=" ,?;[]" & ChrW(1) & ChrW(31) & ChrW(30) & ChrW(12) _ & ChrW(7) & ChrW(31) & ChrW(13) & ChrW(160), Count:=wdForward Set Rng1 = Selection.Range strAusgangstext = Selection.Text strInternetadresse = Selection.Text ' ********************************************** ' Schleife, um alle UTF-8-Zeichen in der Markierung (Rng1) zu erfassen: ' Zieladresse der Schleife: Zeile_Schleife_Weitermachen: ' ************************** ' Prozentzeichen suchen: Selection.Find.ClearFormatting With Selection.Find .Text = "%" .Replacement.Text = "" .Forward = True ' .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute If Selection.Find.Found = False Then GoTo Zeile_Ergebnis ' geht so oft nicht, sucht endlos weiter, deshalb auch mit "Rng1" abfragen: If Selection.Range.End > Rng1.End Then Rng1.Select ''Exit Sub GoTo Zeile_Ergebnis Else i=i+1 ' weitermachen End If ' ************************ ' Das Zeichen hinter dem ersten gefundenen "Prozent" markieren: Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend ' *************** ' 1. Buchstabe nach dem 1. Prozentzeichen untersuchen: If UCase(Selection.Text) = "C" Or UCase(Selection.Text) = "D" Then ' Zwei-Byte-Code: Selection.MoveRight Unit:=wdCharacter, Count:=4, Extend:=wdExtend strCode = Replace(Selection, "%", "") strErsatz = ChrW(Fkt_zweiByte_Sequenz(strCode)) strInternetadresse = Replace(strInternetadresse, "%" & Selection.Text, strErsatz) ''MsgBox StrInternetadresse ElseIf UCase(Selection.Text) = "E" Then ' Drei-Byte-Code: Selection.MoveRight Unit:=wdCharacter, Count:=7, Extend:=wdExtend strCode = Replace(Selection, "%", "") 198 strErsatz = ChrW(Fkt_dreiByte_Sequenz(strCode)) strInternetadresse = Replace(strInternetadresse, "%" & Selection.Text, strErsatz) ''MsgBox StrInternetadresse ElseIf UCase(Selection.Text) = "F" Then ' Vier-Byte-Code oder unzulässig: Selection.MoveRight Unit:=wdCharacter, Count:=10, Extend:=wdExtend strCode = Replace(Selection, "%", "") strErsatz = ChrXXL(Fkt_vierByte_Sequenz(strCode)) If strErsatz = "" Then ''MsgBox "unzulässiger UTF8-Code!", vbInformation ' kein UTF8-Code: k=k+1 Selection.Collapse Direction:=wdCollapseEnd Else i=i+1 strInternetadresse = Replace(strInternetadresse, "%" & Selection.Text, strErsatz) End If ''Exit Sub ''GoTo Zeile_Ergebnis Else ' einfaches ASCII-Zeichen: If UCase(Selection.Text) Like "[0-9,A-B]" Then Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend '' MsgBox "1-Byte-Sequenz" strErsatz = ChrW(Val("&H" & Selection.Text & "&")) ''MsgBox "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ & ChrW(Val("&H" & Selection.Text & "&")) & "'." strInternetadresse = Replace(strInternetadresse, "%" & Selection.Text, strErsatz) i=i+1 Else ' kein UTF8-Code: k=k+1 '' GoTo Zeile_Ergebnis End If End If ' ************************** ' Schleife nach oben: Selection.Collapse Direction:=wdCollapseEnd GoTo Zeile_Schleife_Weitermachen ' ********************************************** Zeile_Ergebnis: If k > 1 Then strMisserfolg = vbCrLf & vbCrLf & _ "Der markierte Text enthält mindestens " & k & " Prozentzeichen, die keine UTF-8-Codes sind." ElseIf k = 1 Then strMisserfolg = vbCrLf & vbCrLf & _ "Der markierte Text enthält mindestens ein Prozentzeichen, das kein UTF-8-Code ist." End If If i > 0 Then strText = "Der markierte Text: " & vbCrLf & strAusgangstext & vbCrLf & vbCrLf & " enthält " & i _ & " UTF8-Codes und bedeutet (soweit decodierbar): " & vbCrLf _ & strInternetadresse & strMisserfolg i = MessageBoxW(0, StrPtr(strText), StrPtr("UTF8-Decodierung"), 0) Else MsgBox "Der markierte Text: " & vbCrLf & strAusgangstext & vbCrLf _ & " enthält keine decodierbaren sUTF8-Codes." & strMisserfolg Exit Sub End If End Sub ' --------------------------------------------------------------------------------------------------------- 199 Private Function Fkt_zweiByte_Sequenz(strCode As String) As Integer ' H. Chris Gast, Stand 2. Juli 2015. Dim Z As String Dim Y As String Dim x As String Dim strUCS As String Dim IntUCS As Long Z = UCase(Left(strCode, 2)) Y = UCase(Mid(strCode, 3, 2)) Dim i Dim strText Dim strÜberschrift strÜberschrift = "" ' ***************** ' Rechenformel nach ISO/IEC 10646:2003, Anhang D (nicht mehr in neueren Ausgaben!) IntUCS = (Val("&H" & Z & "&") - 192) * 64 + (Val("&H" & Y & "&") - 128) strText = "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ & ChrW(IntUCS) & "'." ''i = MessageBoxW(0, StrPtr(strText), StrPtr(strÜberschrift), 0) Fkt_zweiByte_Sequenz = IntUCS End Function ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_dreiByte_Sequenz(strCode As String) As Integer ' H. Chris Gast, Stand 2. Juli 2015. Dim Z As String Dim Y As String Dim x As String Dim strUCS As String Dim IntUCS As Long Z = UCase(Left(strCode, 2)) Y = UCase(Mid(strCode, 3, 2)) x = Mid(strCode, 5, 2) Dim i Dim strText Dim strÜberschrift strÜberschrift = "" ' ***************** ' Rechenformel nach ISO/IEC 10646:2003, Anhang D (nicht mehr in neueren Ausgaben!) '' z = E0 .. EF; y; x; (z-E0)*2hoch12 + (y-80)*2hoch6 + (x-80); IntUCS = (Val("&H" & Z & "&") - 224) * 4096 + (Val("&H" & Y & "&") - 128) * 64 _ + (Val("&H" & x & "&") - 128) strText = "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ & ChrW(IntUCS) & "'." ''i = MessageBoxW(0, StrPtr(strText), StrPtr(strÜberschrift), 0) Fkt_dreiByte_Sequenz = IntUCS End Function ' --------------------------------------------------------------------------------------------------------- Private Function Fkt_vierByte_Sequenz(strCode As String) As Long ' H. Chris Gast, 26. August 2015. Dim Z As String Dim Y As String Dim x As String Dim w As String Dim strUCS As String Dim IntUCS As Long Z = UCase(Left(strCode, 2)) Y = UCase(Mid(strCode, 3, 2)) x = UCase(Mid(strCode, 5, 2)) 200 w = UCase(Mid(strCode, 7, 2)) Dim i Dim strText Dim strÜberschrift strÜberschrift = "" ' ***************** ' Rechenformel nach ISO/IEC 10646:2003, Anhang D (nicht mehr in neueren Ausgaben!) '' z = F0 .. F7; y; x; w; (z-F0)*2 hoch 18 + (y-80)*2 hoch 12 +(x-80)*2 hoch 6 + (w-80); '' nur bis "F4" gültig! '''''''''''''''''''''''''''' If Val("&H" & Z & "&") > 244 Then ''MsgBox "unzulässiger UTF8-Code!", vbInformation Fkt_vierByte_Sequenz = 0 Exit Function End If '' MsgBox "4-Byte-Sequenz.", vbInformation IntUCS = (Val("&H" & Z & "&") - 240) * 262144 + (Val("&H" & Y & "&") - 128) * 4096 _ + (Val("&H" & x & "&") - 128) * 64 + (Val("&H" & w & "&") - 128) ' ***************** Fkt_vierByte_Sequenz = IntUCS ' ****************** ' Nur für Testzwecke! '' strText = "Der UTF-8-Code '" & Selection.Text & "' bedeutet '" _ & ChrXXL(IntUCS) & "'." '' i = MessageBoxW(0, StrPtr(strText), StrPtr(strÜberschrift), 0) '' MsgBox IntUCS End Function ' --------------------------------------------------------------------------------------------------------- Private Function ChrXXL(Code2) As String ' Dipl.-Ing Hanna-Chris Gast, 2011. ' Unterfunktion für Zeichen höherer Ebenen, passend für Word 2000 und höher ' Berechnung nach nach ISO/IEC 10646:2003, Anhang C: Dim Surrogat1 Dim Surrogat2 If Code2 = 0 Then ChrXXL = "" Exit Function End If Surrogat1 = Hex(Int((Code2 - 65536) / 1024) + 55296) Surrogat2 = Hex((Code2 - 65536) - (Int((Code2 - 65536) / 1024) * 1024) + 56320) ChrXXL = ChrW("&H" & Surrogat1) & ChrW("&H" & Surrogat2) End Function ' --------------------------------------------------------------------------------------------------------- 201 Anhang C Abstract in English "Extension of Word 2000 for the implementation and analysis of Unicode characters in Higher Planes like Hieroglyphs and other archaic characters; Macro for Word 2000 to Word 2010 for Analysing all kind of characters in a Word text with showing off the English character names according to ISO/IEC 10646". This book offers macros for the extension of Word 2000 to make it able to handle Unicodes of ) and other archaic characters. higher Unicode-planes like Hieroglyphs (e. g. Chapter 6 contains a Macro for Analysing characters in all versions of Word (Word 2000 to Word 2010) which analyses up to 120 characters in a Word-document with only one key combination (AltGr + C). It gives out the Unicode numbers (code point) of the marked characters and can also display their English names according ISO/IEC 10646. For example: When marking with the cursor for example "Unicode.org" and starting the macro (I have assigned to the macro the key-combination "Control + Alt + C"), I will get the codes (see Fig. C.1, left hand side). In most cases this result is enough. When pressing "Ja" ('yes'), the macro looks up the English names of the characters in the Internet on the webpage of Unicode.org (see Fig. C.1, right hand side): Fig. C.1 Screenshot of the analysis 202 This also works for unknown characters like: " ☎", and also when some letters cannot be presented correctly d lack of fonts in the computer, which hasn't the font "Cardo" (see Fig. C.2). The macro gives the also the meanings of Symbol and Wingding characters. Perhaps here I should press " Ja " to get the name of all characters in the marked sample . Fig. C.2: Screenshots for the analysis of unknown characters The analysing macro recognises characters with diacritical marks (see Fig. C.3). The advantage in comparison to Word (even Word 2010) is that the macro always analyses the character and the combining accent together. There is no more danger of analysing only one part of the combined letter. Fig. C.3: Screenshot of the analysis of a small letter Alpha with acute 203 Fig. C.4 shows the analysis of two Hieroglyphs as an example of a higher Unicode-plane: Fig. C.4: Two Hieroglyphs as a sample for a higher Unicode plane The macro can also handle combination from left to right like Latin characters and from right to left like Arabic and Hebrew characters (see Fig. C.5): Fig. C.5: A Hebrew letter with Latin letters in the same line 204 Last not lease the analysing macro also recognizes special marks (signs) like NoBreakSpace, NoBreakHyphen, Soft Hyphen, Tabulator, Paragraph, etc. even when they are only Control characters in Word, see Fig. C.6 ( - - - ). Fig. C.6: Special marks The limitation of my analyzing macro for Word is that it cannot give you the names of Chinese, Japanese or Korean syllable-characters. If you cannot recognize a character in a website or in a pdf-document, just copy it into a word-file and analyse it with this macro. The macro also works well, if you only see "blank boxes" like "" or "�"or maybe other "blank place-holders" like "�" on the screen. This booklet can be downloaded: Hanna-Chris Gast: "Word-Makros für Unicode, Analyse von Schrift- und Sonderzeichen, Ersatz von Symbol- und Wingdingszeichen durch Unicode, sowie ein verbessertes InhaltEinfügen"; Berlin 2015; http://www.siebener-kurier.de/chris-aufsaetze/Unicode_Word-Makros.pdf; The macro for analysing characters can be downloaded (among the other macros of this booklet) in a ready-to-use-word-template (within a Zip-File): http://www.siebener-kurier.de/chris-aufsaetze/Unicode-Makros.zip. The macro for Analysing therein has the shortcut "AltGr + C". Unfortunately this book is only available in German language. Further booklets with macros for word see also http://www.siebener-kurier.de/chris-aufsaetze Hanna-Chris Gast 205 Literaturhinweise ISO/IEC 8859-1:1998, Information technology - 8-bit single-byte coded graphic character sets - Part 1: Latin alphabet No. 1. ISO/IEC 8859-7:2003, Information technology - 8-bit single-byte coded graphic character sets - Part 7: Latin/Greek alphabet. ISO/IEC 8859-15:1999, Information technology - 8-bit single-byte coded graphic character sets Part 15: Latin alphabet No. 9. ISO/IEC 10 646, Information technology - Universal Coded Character Set (UCS); http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html; In diesem Aufsatz habe ich die veraltete Ausgabe von 2003 verwendet: ISO/IEC 10 646:2003, Information technology - Universal Multiple-Octet Coded Character Set (UCS); veraltet, aber für französische Namen noch von Interesse sowie für die Umrechnung von Codes. [1] Unicode-Consortium, (die Schriftzeichen nach ISO/IEC 10646). The Unicode Consortium, P.O. Box 391476, Mountain View, CA 94039-1476, U.S.A., http://www.unicode.org/charts/, und http://www.unicode.org/Public/UNIDATA (Stand: Version Unicode 6.0, Stand 21. Oktober 2010) oder http://www.unicode.org/Public/UNIDATA/UnicodeData.txt (Stand: 17. Aug. 2010); Französische Bezeichnungen für Unicodes, soweit vorhanden, siehe http://www.unicode.org/fr/charts, (Stand: 28. Juni 2007). [2] Hanna-Chris Gast: Fertige Dokumentvorlage zum Download mit Makros für die Analyse von Unicode- und Sonderzeichen, für die Konvertierung von Symbol und Wingdings in Unicode und für das verbesserte "Inhalt-Einfügen"; Stand 2015; http://www.siebener-kurier.de/chris-aufsaetze/Unicode-Makros.zip. [3] Hanna-Chris Gast: "Kyrillische Schrift für den Computer - Benennung der Buchstaben, Vergleich der Transkriptionen in Bibliotheken und Standesämtern, Auflistung der Unicodes sowie Tastaturbelegung für Windows XP"; Shaker Verlag, Aachen 2010; Im Internet als Download unter http://www.siebener-kurier.de/chris-aufsaetze/Kyrillische_Schrift_Computer.pdf [4] Hanna-Chris Gast: "Griechische Schrift für den Computer - Auflistung sämtlicher griechischen Zeichen mit Unicode, Tastenbelegung für Windows, Vergleich der Transkriptionen in Bibliotheken und Standesämtern", 2. erweiterte Auflage (mit geändertem Titel), Selbstverlag, Berlin 2011; ISBN 978-3-00-036684-0 Im Internet unter: http://www.siebener-kurier.de/chris-aufsaetze [5] Hanna-Chris Gast: "Schrift- und Sonderzeichen in Word", Broschüre im Selbstverlag, Stand 2015; im Internet als Download unter: http://www.siebener-kurier.de/chris-aufsaetze/Word-Schriftzeichen.pdf.. [6] Hanna-Chris Gast: "Einige Makros für Word (und deren Installation)"; Stand 2016; Download: http://www.siebener-kurier.de/chris-aufsaetze/Word-Makros.doc [7] Hanna-Chris Gast: "Formblatt mit Makros zur Übertragung von Tastenkürzel und AutoKorrekturen für Word"; Berlin 2011, Stand 2015; Als Download: http://www.siebener-kurier.de/chris-aufsaetze/Formblatt-Tastenkuerzel+Autokorrekturen_uebertragen.doc. [8] Wikipedia, Wikimedia Foundation Inc., P.O. Box 78350, San Francisco, CA 94107-8350, USA; - Wikimedia Deutschland, Gesellschaft zur Förderung Freien Wissens e. V., Postfach 30 32 43, 10729 Berlin; Download zuletzt 12. März 2010: https://en.wikipedia.org , https://de.wikipedia.org , https://fr.wikipedia.org [9] FileFormat.Info, Andrew Marcuse, 317 Buck Lane, Suite 853, Haverford, Pennsylvania 19041, USA, http://www.fileformat.info (10. April 2010), 206 [10] "Symbola", Unicode Fonts for Ancient Scripts", http://users.teilar.gr/~g1951d, "fonts designed by George Douros" 2009, TEI, Technological Educational Institution of Larissa (Λάρισα), Download zuletzt 26. September 2014 (Symbola, version 7.17, Juli 2014). [11] RomanCyrillic_Std.ttf, Prof. Dr. Sebastian Kempgen, Universität Bamberg, Slavische Sprachwissenschaft, An der Universität 5, 96047 Bamberg, http://kodeks.unibamberg.de/AKSL/Schrift/RomanCyrillicStd.htm, Abruf zuletzt 27. August 2015. [12] Code2001.ttf, James Kass; 2807 Erskine Creek Road Space 93; Lake Isabella, California 93240, U.S.A.; http://www.fontspace.com/james-kass/code2001.. Abruf zuletzt 27. August 2015. [13] Gardiner.otf, in: "Unicode Fonts for Ancient Scripts", http://users.teilar.gr/~g1951d, "fonts designed by George Douros" 2009, TEI, Technological Educational Institution of Larissa (Λάρισα), (8. Mai 2010). [14] Cardo.ttf, David J. Perry, Fonts for Scholars, Rye High School, Rye, New York USA, Version April 2011. Anmerkung: Brauchbare kostenlose Schrift für Griechische Schriftzeichen. [15] UTF-8-Codetabelle mit Unicode-Zeichen, Tomas Schild, Lange Furche 31, 72072 Tübingen, http://www.utf8-zeichentabelle.de (25. April 2010). [16] Internet Society (ISOC) sowie deren Untergruppe Internet Engineering Task Force (IETF), welche die betreffenden Codier-Regeln festgelegt, https://www.ietf.org: RFC 3491 (Nameprep, siehe https://tools.ietf.org/html/rfc3491); RFC 3492 (Punycode, siehe https://tools.ietf.org/html/rfc3492 ). RFC 3629 (UTF-8), siehe http://tools.ietf.org/html/rfc3629; Download 7. bis 21. Februar 2010. [17] EURid, The European Registry of Internet Domain Names (europäisches Register für Internetdomänennamen), http://www.eurid.eu/de, Download 7. Februar 2010. [18] Philipp Stephani, "Unicode", in AktiveVB, Kraichgaustraße 2, 76698 Ubstadt-Weiher; http://www.activevb.de/rubriken/kolumne/kol_20/unicode.html (26. Juni 2010). [19] FORTH (Foundation for Research and Technology - Hellas), Institute of Computer Science (ICS), N. Plastira 100, Vassilika Vouton, GR-700 13 Heraklion, Crete, GRIECHENLAND, https://grweb.ics.forth.gr, (Abruf zuletzt 9. Okt. 2011). [20] Adobe-Liste: http://unicode.org/Public/MAPPINGS/VENDORS/ADOBE/symbol.txt, Stand: 30. März 1999; Download 29. März 2010. [21] Apple-Tabelle: http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/SYMBOL.TXT; Stand: 5. April 2005, Abruf zuletzt 6. Februar 2011. [22] Alan Wood: "Wingdings character set and equivalent Unicode characters", Stand 26. Januar 2011, http://www.alanwood.net/demos/wingdings.html, sowie "Wingdings 2 character set and equivalent Unicode characters", Stand 14. Jan. 2010, http://www.alanwood.net/demos/wingdings-2.html; Anmerkung: Alan Wood bietet auch Unicode-Entsprechungen für einige Wingdings 2Zeichen an (Stand 9/2014). [23] Unicode-Erklärung zum Phi-Symbol, Unicode Technical Report #25, UNICODE SUPPORT FOR MATHEMATICS, Revision 11:2001-2008, http://unicode.org/reports/tr25/#_Toc231, Abruf 2. Januar 2011. [24] Microsoft, http://www.microsoft.com/typography/fonts/family.aspx?FID=32 (8/2014). [25] Windows-Zeichentabelle, C:\WINDOWS\system32\charmap.exe. 207 Vorgänger-Versionen dieses Aufsatzes [26] (veraltet) Hanna-Chris Gast: "Erweiterung von Word 2000 zur Erzeugung von Schriftzeichen höherer Unicode-Ebenen sowie Erstellung eines Makros für Word 2000 bis Word 2010 zur Analyse von Schrift- und Sonderzeichen mit Ausgabe des Schriftzeichen-Namens nach ISO/IEC 10646"; Gedruckt als Beilage zum Siebener-Kurier Nr. 60 (August 2010); ISSN 09486089; Erweiterte Auflage als Sonderdruck des Siebener-Kuriers, Juni 2011; Stand April 2015; http://www.siebener-kurier.de/chris-aufsaetze/Word-Erweiterung-Unicode-Makros.pdf; Das Analysemakro aus diesem Aufsatz ist in einer fertigen Dokumentvorlage downloadbar, siehe [2]. [27] (veraltet) Hanna-Chris Gast: "Word-Makro zur Umcodierung von Symbol- und Wingdingszeichen in Unicode Zeichen"; Gedruckt als Beilage zum Siebener-Kurier Nr. 61 (August 2011), ISSN 0948-6089 Neue veränderte Ausgabe 2014 unter Berücksichtigung von Cambria; (veraltet) http://www.siebener-kurier.de/chris-aufsaetze/Symbol+Wingdings-in-Unicode.pdf; Die Makros aus diesem Aufsatz sind in einer fertigen Dokumentvorlage downloadbar, siehe [2] Impressum © Dipl.-Ing. Hanna-Chris Gast Bergstr.1 14109 Berlin http://www.siebener-kurier.de/chris-aufsaetze E-Mail: hcgast "ät" siebener-kurier.de (dabei "ät" durch "@" ersetzen). Abdruck und Zitate nur mit Quellenangabe! Gast, Hanna-Chris: "Word-Makros für Unicode, Analyse von Schrift- und Sonderzeichen, Ersatz von Symbol- und Wingdingszeichen durch Unicode sowie ein verbessertes InhaltEinfügen"; Selbstverlag, Teilweise seit 2010 veröffentlicht; Neu-Auflage, Berlin 2015. Im Internet als Download unter: http://www.siebener-kurier.de/chris-aufsaetze/Unicode_Word-Makros.pdf. Die Makros aus diesem Aufsatz sind weitgehend in einer fertigen Dokumentvorlage downloadbar unter: http://www.siebener-kurier.de/chris-aufsaetze/Unicode-Makros.zip. Stand: Freitag, 6. Januar 2017. 208