Forums Neueste Beiträge
 

Dynamische Symbolleisten

02/04/2009 - 10:13 von alexander.kerensky | Report spam
Hallo Gruppe,

ich hab ein Problem mit meiner per Makro erstellten Symbolleiste in
einer Vorlage in Word XP.
Die Symbolleiste soll nur in der Vorlage und in den daraus
erstellten .docs verfügbar sein.
Mein erster Versuch sah so aus(Auszug):

Sub AutoOpen()
...

If CbExists("Symbolleiste") = false Then

Set SB = ActiveDocument.CommandBars.Add(Name:="Symbolleiste")
With SB
.Visible = True
.Top = 400
.Left = 70
.Position = msoBarTop
.RowIndex = msoBarRowLast
.Left = 0
End With

Set SB = ActiveDocument.CommandBars("Symbolleiste")

Set SBC = SB.Controls.Add(msoControlButton)
With SBC
.Caption = "Button1"
.Style = msoButtonIconAndCaption
.FaceId = 4
.TooltipText = "Button1"
.OnAction = "clickButton1"
End With

Nachteil: Die Leiste ist in jeder Instanz sichtbar. Erst wenn Word
komplett geschlossen ist, verschwindet die Leiste. Ausserdem schreibt
er die Leiste irgendwann aus unbekannten Gründen direkt in die
Normal.dot so dass man diese löschen muss um die Leiste wieder
loszuwerden.

Durch googlen bin ich dann auf CustomizationContext gekommen.
Allerdings bin ich mir nicht sicher, ob ich das richtig handhabe.
Wenn ich CustomizationContext = ActiveDocument oder
ActiveDocument.AttachedTemplate setze, ist die Leiste nur in der
Instanz sichtbar wie es sein soll. ABER wenn ich VORHER ein komplett
anderes Dokument ohne Makro offen hab und dann die Vorlage mit dem
Makro starte, hab ich plötzlich 2 Leisten selben Namens: einmal die
richtige und einmal eine komplett ohne Buttons und unpositioniert!?

Mein nàchster Versuch sah so aus dass ich jedes Mal beim Öffnen die
Leiste komplett lösche und neu erstelle:

For Each cmdbar In ActiveDocument.CommandBars
If cmdbar.Name = "Symbolleiste" Then
ActiveDocument.CommandBars("Symbolleiste").Delete
End If
Next cmdbar

Set SB = ActiveDocument.CommandBars.Add(Name:="Symbolleiste")
With SB
.Visible = True
.Top = 400
.Left = 70
.Position = msoBarTop
.RowIndex = msoBarRowLast
.Left = 0
End With

...

Irgendwie scheint er dabei aber zu denken dass er noch im Kontext der
Vorlage ist. Denn wenn ich die Vorlage offen hab und ein Dokument aus
der Vorlage erstelle, löscht er die Symbolleiste in der Vorlage und
erstellt dort eine neue Leiste.
Mittlerweile weiß ich nicht mehr weiter. Es muss doch eine Best
Practise Lösung geben.
 

Lesen sie die antworten

#1 Thomas Gahler
02/04/2009 - 10:50 | Warnen spam
Hallo alexander


ich hab ein Problem mit meiner per Makro erstellten Symbolleiste in
einer Vorlage in Word XP.
Die Symbolleiste soll nur in der Vorlage und in den daraus
erstellten .docs verfügbar sein.


Zuerst mal die Frage, muss denn die Symbolleiste wirklich dynamisch erzeugt
werden?

Ich stelle immer mal wieder fest, dass x-Zeilen Code geschrieben werden um
eine Symbolleite zu erzeugen, die eigentlichnur einmal aufgebaut wird.
Falls nur 1x aufbauen, dann ist Extras / Anpassen die Lösung.



Sub AutoOpen()


Bei AutoOpen wird jedesmal wenn eine Datei basierend auf der Dokumentvorlage
oder beim öffnen der Dokumentvorlage selber der Code ausgeführt.

Arbeitet denn deine Funktion CbExists() sauber?


Durch googlen bin ich dann auf CustomizationContext gekommen.


Der ist absolut wichtig, sonst wird die Symbolleiste irgendwo (meistens in
der Normal.ot) angelegt. Und ndihct vergessen, den CustomizationContext zu
merken und wieder zurück zusetzen


Makro starte, hab ich plötzlich 2 Leisten selben Namens: einmal die
richtige und einmal eine komplett ohne Buttons und unpositioniert!?


Mach doch mal eine MsgBox in dein Makro rein, dann siehst du wie oft das
AutoOpen ausgeführt wird, vielleicht bekommst du da Erkenntnisse



Zuhause sollte ich noch eine kleine Code-Sequenz haben, die kann ich ja am
Abend (heute oder morgen) hier noch posten...





Thomas Gahler
MVP für Word
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP3), Office XP (SP3)

Ähnliche fragen