The simplest way, using VBA, to reset part of a style definition (e.g. the font name), so it inherits the definition of the style it is based on

Article contributed by Henk van Boeijen

In Word, styles can be (and usually are) based on other styles. If you create a new style, Word bases it on the style of the paragraph that is currently selected, unless you explicitly change this in the Modify Style dialog. The style it is based on is called its base style (or sometimes, the parent style).


If it's a paragraph style, the new style will inherit (in an object-oriented fashion) all of its font and paragraph properties from its base style, and will be defined by Word only as the definition of the base style plus anything you have defined to be different from the base style.

So in the Format + Style dialog, you will see definitions like: Normal + Indent: Hanging 0.25", Space After 6 point.

In this example, only the Indent and the Space After setting are held in the style definition. So if you change the Font in the Normal style, the font in the child style will automatically change, too. But if you change the Space After property of the Normal style, the Space After property of the child style will not change, because that property is stored in the child style's definition and so is not inherited.

Similarly,  if you see a definition like: Normal + Font Arial in the Format + Style dialog, then nothing but the font name is stored in the style definition. So if you change the Font of your Normal style, the font in the child style will not change; but if you change the  Space After property of the Normal style, the Space After property of the child style will change.


Character styles behave similarly except that only font properties are defined or inherited. So you will see character style definitions in the Format + Style dialog like Default Paragraph Font + Font color: Dark Blue. In this example, nothing is stored in the character style definition except the font colour. Everything else is inherited from the underlying paragraph style of whichever paragraph you happen to have applied the character style to.

So a style can be based on another style which in turn is based on another style, and so on. In this way you can form an hierarchy tree of styles. Each member in that tree inherits the formatting options of its parent and adds its own specific options to it. Used sensibly, this mechanism is absolutely essential to your ability to maintain complex documents and templates.

Another example

Style "Normal":
 - Font.Name = "Times New Roman"
 - Font.Size = 11
 - Font.Bold = False

Style "Special":
 - this style is based on "Normal"
 - Font.Size = 9

Style "MoreSpecial"
 - this style is based on "Special"
 - Font.Bold = True

All three styles share the same font name. The font name is defined in Normal and is inherited by Special and MoreSpecial. When the font name in Normal is changed to Arial, this change also applies to Special and MoreSpecial.

The font size is only shared by Special and MoreSpecial: 9 points is defined in Special. It overrides the font size setting of Normal which is 11 points. MoreSpecial inherits 9 points from Special.

If the font size of Normal is changed to 12 points, this setting will not be inherited by Special or MoreSpecial.

In some cases you may want to delete formatting properties in a style's definition, in order that it should inherit those properties from its parent (or base) style. 

To do this in VBA, use the following logic:

Dim oStyle As Style
Set oStyle = ActiveDocument.Styles("Special")
oStyle.Font.Name = oStyle.BaseStyle.Font.Name

After running this code, the font name will no longer be stored in the style definition of the Special style, but will now be inherited from the Normal style.

If you need to do this more than once, you could make your life easier by calling a  subroutine like the following, which clears the font name of a given style. It accepts a style name (of type String) or a WdBuiltinStyle constant, or a style object, as its argument. So you could call it like this:

ClearStyle "List Number"

or like this:

ClearStyle wdStyleListNumber

or like this:

ClearStyle ActiveDocument.Styles("List number")

If the style is not based on another style, the routine exits without generating an error.

Public Sub ClearStyleFont(oStyle As Variant)

Dim oBaseFont As Font
With ActiveDocument.Styles(oStyle)
    If .BaseStyle = "" Then
        'There is no base style, nothing to clear
        Set oBaseFont = .BaseStyle.Font
        With .Font
            .Name = oBaseFont.Name
            'Add other font properties here if needed
        End With
        Set oBaseFont = Nothing
    End If
End With

End Sub

You could use exactly the same logic to clear paragraph properties from a style definition, so that they are inherited from the base style.

If you wanted to clear all font and paragraph properties from a style definition, (including any list numbering, language and borders definitions, although unfortunately, not including Frames definitions), in order that you can start defining your own properties for the style knowing that you are starting with a clean slate, you could use the following subroutine.

Public Sub ClearStyle(oStyle As Variant)

With ActiveDocument.Styles(oStyle)
        If .BaseStyle <> "" Then
            .Font = .BaseStyle.Font
            .ParagraphFormat = .BaseStyle.ParagraphFormat
        End If
    End With

End Sub