pat.bat
Goto Top

VBA Word - dynamische Textformatierung mittels vba in Bausteinkatalogelementen

Hallo zusammen,

ich arbeite derzeit an einem Skript, das beim öffnen des Dokuments alle ContentControls sucht und diese farblich markiert. Selektiert der Nutzer nun ein CC, dann wird die Markierung gelöscht. Soweit so gut.

Nun habe ich auch Baustein-Katalog Elemente, wo der Benutzer dann einen Schnellbaustein zu seinem Dokument hinzufügen kann. Diese Schnellbausteine haben aber auch ContentControl-Elemente.
Wie kann ich diese nun auch noch farblich markieren, wenn der Benutzer eins eingefügt hat?

Anbei mal das Skript soweit:

Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl)
    ContentControl.Range.Shading.BackgroundPatternColorIndex = wdNoHighlight
End Sub



Private Sub Document_Open()
'DoEvents  
Dim cc As ContentControl
For Each cc In ActiveDocument.ContentControls
If cc.Type = wdContentControlDropdownList Or cc.Type = wdContentControlBuildingBlockGallery Or cc.Type = wdContentControlDate Or cc.Type = wdContentControlText Then
    cc.Range.Select
    Selection.Range.Shading.BackgroundPatternColorIndex = wdYellow
Else
    cc.Range.Select
    Selection.Range.Shading.BackgroundPatternColorIndex = wdNoHighlight
End If
Next
Selection.HomeKey wdStory
End Sub

Ist dies überhaupt in Word möglich oder muss ich die Formatierung, also das highlighten der CCs im Schnellbaustein manuell vornehmen und der Benutzer muss dann die Formatierung wieder manuell "löschen"?


Vielen Dank im Voraus

Content-Key: 568409

Url: https://administrator.de/contentid/568409

Ausgedruckt am: 29.03.2024 um 12:03 Uhr

Mitglied: 143728
Lösung 143728 29.04.2020 aktualisiert um 12:12:36 Uhr
Goto Top
Einfach den Range der den Baustein einfügt erneut im entsprechenden Event auf ContentControls prüfen und markieren
Private Sub Document_BuildingBlockInsert(ByVal Range As Range, ByVal Name As String, ByVal Category As String, ByVal BlockType As String, ByVal Template As String)
    Dim cc As ContentControl
    For Each cc In Range.ContentControls
        HiglightContentControl cc
    Next
End Sub

Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl)
    ContentControl.Range.Shading.BackgroundPatternColorIndex = wdNoHighlight
End Sub

Private Sub Document_Open()
    Dim cc As ContentControl
    For Each cc In ThisDocument.ContentControls
        HiglightContentControl cc
    Next
End Sub

Sub HiglightContentControl(ByVal cc As ContentControl)
    If cc.Type = wdContentControlDropdownList Or cc.Type = wdContentControlBuildingBlockGallery Or cc.Type = wdContentControlDate Or cc.Type = wdContentControlText Then
        cc.Range.Shading.BackgroundPatternColorIndex = wdYellow
    Else
        cc.Range.Shading.BackgroundPatternColorIndex = wdNoHighlight
    End If
End Sub
Du kannst das ganze natürlich so weiter treiben bis der Arzt kommt in dem FAll würde ich das das ganze dann in eine rekursive Funktion packen wenn du in den Bausteinen noch weitere Verschachtelungen berücksichtigen willst.
Mitglied: Pat.bat
Pat.bat 29.04.2020 um 13:37:43 Uhr
Goto Top
@143728

vielen Dank, das sieht sehr gut aus.

ich musste nur das ThisDocument zu ActiveDocument ändern, da er im Dokument sonst nicht alles markiert hat, warum auch immer. Und wenn ich den Schnellbaustein hinzufüge, dann gibt es in meinem Beispiel 3 CCs, davon wird aber nur das 3. markiert. Dabei handelt es sich um 2x Type Text und das 3. um den Type Datum.

Noch etwas zum Aufbau der Dokumente. Der User arbeitet mit einem docx Dokument, dieses ist mit einer Dokumentenvorlage (dotm) auf einem Netzwerkpfad verknüpft. Und in diesem dotm sind die Schnellbausteine und das VBA hinterlegt.
Mitglied: 143728
143728 29.04.2020 aktualisiert um 14:03:59 Uhr
Goto Top
Zitat von @Pat.bat:

@143728

vielen Dank, das sieht sehr gut aus.

ich musste nur das ThisDocument zu ActiveDocument ändern, da er im Dokument sonst nicht alles markiert hat, warum auch immer.
Nicht "warum auch immer" die Unterschiede zwischen ThisDocument und ActiveDocument sind dokumentiert, gerade wenn du mit Templates arbeitest kommt das zum tragen! Denn "ThisDocument" verweist wenn es eine Vorlage ist, auf die Vorlage selbst nicht das davon erzeugte neue Dokument.

Und wenn ich den Schnellbaustein hinzufüge, dann gibt es in meinem Beispiel 3 CCs, davon wird aber nur das 3. markiert. Dabei handelt es sich um 2x Type Text und das 3. um den Type Datum.
Klappt hier einwandfrei.
Noch etwas zum Aufbau der Dokumente. Der User arbeitet mit einem docx Dokument, dieses ist mit einer Dokumentenvorlage (dotm) auf einem Netzwerkpfad verknüpft. Und in diesem dotm sind die Schnellbausteine und das VBA hinterlegt.
Dann ist klar das du mit ActiveDocument arbeiten musst s. Hinweis oben.
Bei Verwendung von Vorlagen muss dann auch das Document.New Ereignis statt des Open Ereignisses benutzt werden weil der Default beim Doppelklick auf eine Vorlage die Erzeugung eines neuen Dokuments aus dieser Vorlage ist nicht das Öffnen der Vorlage selbst.
Mitglied: Pat.bat
Pat.bat 29.04.2020 aktualisiert um 14:21:00 Uhr
Goto Top
Hallo,

danke für den Hinweis. Aber wenn ich das Event von Open auf New umstelle, dann markiert er wieder nicht alles im Dokument. Mit Open funktioniert das jetzt schon wie gewollt, allerdings noch nicht beim hinzufügen vom Schnellbaustein über das CC "Baustein-Katalog Inhaltssteuerelement"

@143728

ich verstehe nicht warum er in dem hinzugefügten Schnellbaustein, das letzte CC markiert und die ersten beiden nicht. D.h. er looped ja über alle 3, aber markiert nur das letzte, was ein Datum CC ist. Die Text-CCs mag er nicht.
Mitglied: 143728
143728 29.04.2020 aktualisiert um 15:19:56 Uhr
Goto Top
Zitat von @Pat.bat:
@143728

ich verstehe nicht warum er in dem hinzugefügten Schnellbaustein, das letzte CC markiert und die ersten beiden nicht. D.h. er looped ja über alle 3, aber markiert nur das letzte, was ein Datum CC ist. Die Text-CCs mag er nicht.
Debugger nehmen und Variablen prüfen, vor allem ob die Type Werte mit deiner IF übereinstimmen. Klappt hier problemlos, muss also ein Problem bei deinen Bausteinen sein, wir haben ja dein Dokument nicht vorliegen.