Private Sub QuotationMarks(Optional simple As Boolean, _
Optional clear As Boolean) 'MH 09.09.05
'Meine Version des Anführungszeichen-Einfügens: _
fragt nach der Art der Anf.zeichen; speichert diese Auswahl im Dokument selbst (damit der Benutzer bei jedem Doc einmal seinen Stil wählen kann und nicht jedes Mal gefragt wird); fügt zwei Anführungszeichen ein oder umschließt die Markierung. Kann die gespeicherte Auswahl auch wieder löschen, wobei ich bewußt auf eine Rückfrage verzichte.
On Error Resume Next
'0. Fehlerquellen ausschließen
If Documents.Count = 0 Then 'schneller Ausstieg, keine Datei offen
Application.StatusBar = " Wäre ein Dokument aktiv, " & _
IIf(clear, "würde jetzt die gespeicherte Auswahl gelöscht", _
"würden jetzt " & IIf(simple, "einfache ", "doppelte ") & _
"Anführungszeichen eingefügt.")
Exit Sub
End If
If ActiveWindow.View.Type = 4 Then Exit Sub '4=wdPrintPreview. _
Zwar läuft das Makro in der Seitenansicht, aber man sieht nicht, was passiert, deshalb raus.
With ActiveDocument
'0. Speicherung eventuell löschen (bei DokVar-Namen auf 1.a) achten) und raus
If clear = True Then
.Variables("QuotationMarksDouble").Delete
.Variables("QuotationMarksSimple").Delete
Application.StatusBar = " Gespeicherte Anführungszeichen-Auswahl gelöscht"
Exit Sub
End If
'1. Vorarbeiten: Variablen, DokVarName, Meldungstitel definieren, Array füllen
Dim quots() 'Array mit 1) Anführungszeichen, 2) Erläuterungstext
Dim varName$ 'Name der DokVar mit der Art der Anführungszeichen
Dim msg$, t$ 'Meldungstext und Ergebnis, Meldungstitel
Dim vbTab$ 'Folge von Leerzeichen für Abstand in Meldungstexten
vbTab = Space(5)
Dim i% 'Schleifenzähler und Auswahlergebnis
'a) Variablenname und Meldungstitel
'Da doppelte Gänsefüßchen weitaus häufiger sind als einfache, _
belege ich doppelte vor und ändere nur bei simple = true ab.
varName = "QuotationMarksDouble"
t = "Doppelte"
If simple = True Then
varName = "QuotationMarksSimple"
t = "Einfache"
End If
t = " " & t & " Anführungszeichen einfügen"
'b) Array füllen
'Der Erläuterungstext wird mit Apostrophen gemacht, weil die MsgBox typographische Anführungszeichen als schwarze Striche darstellt. Sonst hätte ich alle Erläuterungen so wie quots(4,1) gemacht.
If simple = False Then
ReDim quots(1 To 5, 1 To 2)
quots(1, 1) = Chr(187) & "abc" & Chr(171): quots(1, 2) = quots(1, 1) & vbTab & "französische (Guillemets)"
quots(2, 1) = Chr(132) & Chr(147): quots(2, 2) = ",,abc´´" & vbTab & "typographische, oben und unten"
quots(3, 1) = Chr(148) & Chr(147): quots(3, 2) = "``abc´´" & vbTab & "typographische, beide oben"
quots(4, 1) = Chr(34) & "abc" & Chr(34): quots(4, 2) = quots(4, 1) & vbTab & "normale (Hochkommata)"
quots(5, 1) = Chr(171) & "abc" & Chr(187): quots(5, 2) = quots(5, 1) & vbTab & "Guillemets für fremdsprachl. Texte"
Else
ReDim quots(1 To 2, 1 To 2)
quots(1, 1) = Chr(146) & Chr(145): quots(1, 2) = "`abc´" & vbTab & "typographische, beide oben"
quots(2, 1) = Chr(39) & "abc" & Chr(39): quots(2, 2) = quots(2, 1) & vbTab & "normale"
End If
'2. Was will der User?
'a) Abfrage, wenn bisher noch keine Wahl getroffen
msg = .Variables(varName).Value 'Speicherung auslesen
If Err.Number = 5825 Then 'keine Wahl gespeichert
msg = vbNullString
'a) Art der Anführungszeichen abfragen
For i = LBound(quots()) To UBound(quots())
msg = msg & CStr(i) & vbTab & quots(i, 2) & vbCr
Next i
msg = Left(msg, Len(msg) - 1) 'letztes vbCr aus der Schleife weg
msg = "Bitte die Art auswählen. Es gibt:" & vbCr & msg & vbCr & _
"Bitte gewünschte Nummer eingeben. " & vbCr & vbCr & _
"- Dann wird das gewählte Paar Anführungszeichen eingefügt oder die Markierung damit umschlossen." & vbCr & _
"- Ihre Wahl wird für jedes einzelne Dokument gespeichert." & vbCr & _
"- Beim nächsten Mal kommen die gleichen Anführungszeichen ohne vorherige Abfrage." & vbCr & _
"- Nach " & Chr(187) & "Speicherung löschen" & Chr(171) & " (im Menü Einfügen - Anführungszeichen) können Sie wieder neu wählen. "
i = CLng(Fix(InputBox(msg, t, 2)))
'b) Abfrageergebnis prüfen, bei Fehler aussteigen
If i < LBound(quots()) Or i > UBound(quots()) Then
msg = "Falsche Eingabe, deshalb abgebrochen."
If i = UBound(quots()) + 1 Then msg = "Abbruch durch Benutzer." ' _
unter W98, WW97 ist i beim Abbruch der InputBox immer 1 höher _
als die Obergrenze des Array. Geht aber nur mit OnErrorResumeNext _
zusammen. Merkwürdig, aber praktisch.
MsgBox msg, , t
Exit Sub
End If
'Auswahl speichern
.Variables.Add varName, CStr(i) 'DokVar-Inhalt ist jetzt geprüft
Else
i = CLng(msg) 'Benutzerauswahl/DokVar-Inhalt auslesen
End If
On Error GoTo 0 'OnErrorResumeNext aufheben
End With 'ActiveDocument
'3. Abfrage umsetzen
msg = quots(i, 1) 'evtl. schneller - und i wird frei
With Selection
Select Case .Type
Case 1 'Cursor ist Strich
.InsertAfter Left(msg, 1) & Right(msg, 1) 'Probetext weg
.Collapse 0 'wdCollapseEnd
.MoveLeft 1, 1, 0 'um 1 Zeichen, nicht erweitern
Case 2 'Cursor markiert Text
If Right(.Range, 1) = " " Then .MoveEnd 1, -1 '1=wdCharacter. Wenn _
rechtes Ende der Markierung Leerzeichen, dies entmarkieren (wdMove=-1)
.InsertBefore Left(msg, 1)
.InsertAfter Right(msg, 1)
.Collapse 0 'wdCollapseEnd
Case Else
MsgBox "Diese Art der Markierung (Selection.Type " & CStr(.Type) & ") " & _
vbCr & "kann Word nicht in Anführungszeichen setzen.", , t
Exit Sub
End Select
End With 'Selection
Erase quots
End Sub 'QuotationMarks