Aktuelle Seite:
/vba/vbpformularformatieren2.htm
Letzte Änderung: 25.02.2011

Getestet unter Word2000Getestet unter WordXPGetestet unter Word2003Einschränkungen unter (Word2007)Einschränkungen unter (Word2010)  
VBA-Code verfügbar: ja
Beispiel anzeigen
Makro/Datei speichern
Print

Da die Originalbefehle bei gesetztem Formularschutz nicht zur Verfügung stehen, die Funktion aber weiterhin per Tastenkombination zur Verfügung stehen soll (funktioniert bis Word2003 - Word2007 sperrt dann auch die Tastenkombination), muss zuerst der Originalbefehl abgefangen werden.
Für die Funktion "Fett" ist das die Prozedur: Sub Bold()

In dieser Prozedur wird zuerst überprüft, ob der Formularschutz gesetzt ist und in diesem Fall die neue Funktion BoldNeu aufgerufen. Ohne Formularschutz muss aber die Originalfunktion zur Verfügung stehen, was in diesem Fall entweder über die passende Dialogs(45)-Konstante oder durch Umschalten der Font-Eigenschaft .Bold = NOT CBool(.Bold) erreicht werden kann. Danach wird der Schaltflächenstatus in der neuen Symbolleiste gesetzt.

Sub Bold()  
' Originalbefehl: Fett  
If ActiveDocument.ProtectionType = wdAllowOnlyFormFields Then
  BoldNeu
Else
  Dialogs(45).Execute
  'Symbolleisten-Status setzen  
  cbar_CTL("Fett") = Selection.Font.Bold
End If
End Sub 

In der Formularfunktion BoldNeu wird dann wieder zuerst der Formularschutz überprüft und anschließend der markierte Text in einem Property gespeichert.

' Markierten Text speichern  
TextSelect = Selection.Range

Dazu wird der Wert über die Property Get- und Property Let-Prozeduren im Property "TextSelect" zwischengespeichert und wieder ausgelesen:

Property Let TextSelect(sText As Range)  
' Aktuelle Markierung speichern  
Set rngText = sText
End Property  
Property Get TextSelect() As Range ' Markierung wieder herstellen Set TextSelect = rngText End Property

Anschließend wird überprüft, ob Text markiert ist, da sich Word da mitunter unterschiedlich verhält: mal wird nur für die nächste Eingabe die Formatierung gesetzt, mal für das Wort, in dem die Eingabemarke steht.

    ' Fett umschalten  
    ' Wenn kein Text markiert ist das aktuelle Wort formatieren  
    If Len(TextSelect) = 0 Then
      Selection.Words(1).Font.Bold = Not CBool(Selection.Words(1).Font.Bold)
      bBold = CBool(Selection.Words(1).Font.Bold)
    Else
      Selection.Font.Bold = Not CBool(Selection.Font.Bold)
      bBold = CBool(Selection.Font.Bold)
    End If

Danach wird der Schaltflächen-Status (gedrückt/nicht gedrückt) über die Hilfsfunktion cbar_CTL(Tag) auf der Symbolleiste gesetzt:

    'Schaltflächen-Status setzen  
    cbar_CTL("Fett") = bBold

Achtung
Standardmäßig ist es in Formularfeldern aber so, dass immer das gesamte Feld markiert wird, wenn man in ein Formularfeld wechsel. Im normalen Textbereich erfolgt dieses Verhalten nicht, wodurch sich folgendes Problem ergibt:
Beim abschließenden Setzen der Markierung TextSelect wird zwar sowohl im Formularfeld als auch im normalen Text die Markierung korrekt wieder hergestellt, jedoch geht dabei im normalen Textbereich die Information über die Formatierung verloren, wenn kein Text markiert ist.

Aus diesem Grund muss für den ungeschützten Bereich überprüft werden, ob ein Text markiert ist Len(TextSelect) bevor ggf. die Markierung wieder gesetzt wird.
Versucht man dieses Verhalten auch auf den Text im Formularfeld anzuwenden, wird, wenn kein Text markiert ist, beim Einschalten des Formularschutzes wieder das gesamte Formularfeld markiert und die eigentliche Funktion (z.B. mit Fett weiterschreiben) deaktiviert. Aus diesem Grund ergibt sich z.Z. ein etwas unterschiedliches Verhalten der Formatierungsbefehle, je nachdem auf welchen Text sie angewandt werden.


<< Zurück

Weiter >>


 www.chf-online.de/vba/vbpformularformatieren2.htm © 2001-11 Christian Freßdorf (Zaphod-Systems)