Schreibbüro Richter

Automatische Nummerierung mit Einbeziehung der aktuellen Kapitelnummer in Word mit den Feldfunktionen StyleRef und Seq

In langen Dokumenten mit automatischer Gliederung möchte man gern innerhalb eines Kapitels eine weitere automatische Nummerierung erstellen, die die Kapitelnummer einbezieht. Dafür kann man allerdings keine eigene Gliederungsebene von Word verwenden. Einmal ist deren Anzahl auf 9 begrenzt. Zum anderen soll die Nummerierung unabhängig von der Gliederungsebene funktionieren, also jeweils im aktuellen Kapitel eine Unternummerierung darstellen. Und schließlich soll diese Nummerierung natürlich auch nicht ins automatische Inhaltsverzeichnis aufgenommen werden. Aus diesen Gründen scheidet eine eigene Gliederungsebene aus.

Automatische Nummerierung unterhalb der Gliederung

StyleRef-Feld und Seq-Feld zur automatischen Absatznummerierung in Word

In der Oberfläche von Word lässt sich dafür ein StyleRef-Feld mit anschließendem Seq-Feld verwenden. Feldcode für das Beispiel:

{ STYLEREF  "Überschrift 4" \n  \* MERGEFORMAT }.{ SEQ a\* Arabic\n  \* MERGEFORMAT }

Den Feldcode kann man einmal erstellen und dann jeweils vor den betreffenden Absätzen einfügen, dann die Felder aktualisieren lassen.

StyleRef-Feld und Seq-Feld mit VBA ermitteln und einfügen

Um sich das Hangeln durch die Menüs zum Einfügen der Feldfunktionen zu ersparen und trotzdem jeweils auf die aktuelle Überschrift (also die letzte vorhandene) zu verweisen, kann man mit VBA die letzte Überschrift ermitteln und beide Felder mit dem Makro RefNummerierungKapitel einfügen lassen.

Damit die Prozeduren auch unter Word 97 laufen, werden die Feldfunktionen versionsabhängig bestückt (in Word 97 waren die Feldnamen noch ins Deutsche übersetzt).


Sub RefNummerierungKapitel()  
' fügt eine Nummerierung (Seq-Feld) im "aktuellen" Kapitel ein  
' (das auf die "aktuelle" Überschrift verweist)  
' © Schreibbüro Richter 2008  

    Dim rng As Word.Range
    Dim myFeld As Word.Field
    Dim strEbene As String
    Dim strNummer As String
    Dim strStyleref As String
    Dim strArabic As String

    Set rng = Selection.Paragraphs(1).Range
    Do
        rng.Collapse wdCollapseStart
        rng.MoveStart Unit:=wdParagraph, Count:=-1
    Loop Until InStr(1, rng.Paragraphs(1).Style, "Überschrift", vbTextCompare) > 0

    If Val(Application.Version) < 9 Then    'In Word 97 sind die Feldfunktionen deutsch  
        strStyleref = "FVREF"
        strArabic = "Arabisch"
    Else
        strStyleref = "STYLEREF"
        strArabic = "Arabic"
    End If

    strEbene = rng.Paragraphs(1).Style
    strEbene = strStyleref & "  " & Chr(34) & strEbene & Chr(34) & " \n "
    Selection.Font.Reset
    Set myFeld = Selection.Fields.Add(Range:=Selection.Range, _
        Type:=wdFieldEmpty, _
        Text:=strEbene)
    strNummer = myFeld.Result
    If Right$(strNummer, 1) <> "." Then     'falls die Nr. nicht mit Punkt endet  
        Selection.Collapse wdCollapseEnd
        Selection.TypeText "."
    End If

    Set myFeld = Selection.Fields.Add(Range:=Selection.Range, _
        Type:=wdFieldEmpty, _
        Text:="SEQ a\* " & strArabic & "\n ")
    myFeld.Update
    Selection.TypeText "."               'abschließender Punkt  

    Set myFeld = Nothing
    Set rng = Nothing

End Sub  

Nummerierung mit Makro neu starten

Um die Zählung des Seq-Feldes an bestimmten Stellen gezielt wieder mit 1 (oder einer anderen Startnummer) beginnen zu lassen, gibt es die kleine Prozedur StartnummerNeuSetzen.


Sub StartnummerNeuSetzen()  
' setzt die Startnummer eines solchen Seq-Feldes neu  
' (z. B. falls zuvor eine Überschrift eingefügt wurde)  

    Dim rng As Word.Range
    Dim strCode As String
    Dim intPos As Integer
    Dim intAnzahl As Integer

    Set rng = Selection.Range
    If rng.Fields.Count < 1 Then
        MsgBox "Es ist kein Feld markiert."
        Exit Sub  
    End If
    strCode = rng.Fields(1).Code.Text
    intPos = InStr(1, strCode, "\n", vbBinaryCompare)
    If intPos > 0 Then
        intAnzahl = Len(strCode)
        strCode = Mid$(strCode, 1, intPos) & "r1" & _
            Mid$(strCode, intPos + 2, intAnzahl - intPos + 2)
        rng.Fields(1).Code.Text = strCode
        ActiveDocument.Fields.Update
    End If
    Set rng = Nothing

End Sub  

So ordnen Sie den Prozeduren eine Schaltfläche in der Menüleiste oder einen Shortcut zu: → Makro mit Shortcut verwenden oder in der Menüleiste unterbringen.