Word reports the .BaseStyle of styles inaccurately
Word styles cascade. Out of the box, a few styles have no parent, but most are based on another style. In the object model, this is controlled through the
One of the rules is that a style can only be based on another style of the same type. So, a Character style can only be based on another Character style. A Table style can only be based on another Table style. And so on.
.BaseStyle of a Style routinely returns nonsense. Open a document and try something like this:
Sub TestBaseStyles() Dim sty As Word.Style For Each sty In ActiveDocument.Styles 'In a clean document, this produces nonsense Debug.Print sty.NameLocal, sty.BaseStyle Next sty End Sub
Style object has been 'primed' in some way, reading the
.BaseStyle property produces unmitigated nonsense:
- Word 2003 reports that most styles are based on Normal style. Clearly character styles, table styles and list styles can't be based on Normal, since it's a paragraph style.
- Word 2007 and Word 2010 seem to report a random style as the
.BaseStyle. Table styles might tell you they're based on character styles. Character styles might tell you they're based on paragraph styles.
The best way I've found to work around this is to read the
.Description property before reading the
.BaseStyle property. This somehow 'primes' the Style object and thereafter it will report the
So something like this works perfectly well:
Sub TestBaseStyles() Dim sty As Word.Style For Each sty In ActiveDocument.Styles Debug.Print sty.NameLocal, sty.Description, sty.BaseStyle Next sty End Sub
You don't have to output the
.Description in any way. Just reading it and assigning to a variable will do. Something like this:
Sub DoSomethingWithMyStyle() Dim sty As Word.Style Dim sDescription as String For Each sty In ActiveDocument.Styles '"Prime" the style sDescription = sty.Description 'Now we can read the .BaseStyle MsgBox sty.BaseStyle Next sty End Sub
There are some other properties of a style that will coerce a style into reporting the correct
.BaseStyle. That's why this problem does not appear very often: your code may already have read one of the properties that settle the style down. Reading the
.Linked property of a paragraph style, for example, is enough to force Word to report the
The advantage of using the
.Description property is that it appears to be innocuous and applies to every style type, so it's easy to get into the habit of reading the
.Description before reading the