Category Archives: 12354

Styles AIn’t What They Used To Be

 

Everybody knows that if you are going to create a meaningful document in Word, you use Styles. Excel has styles as well, but how many of us use these built-in styles, or add to them with our own custom styles?

I have been building a styles utility recently, so I have delved deeply into this functionality. Clearly, one of the principal aims of such a utility would be the ability to edit styles. Being a rational coder, I don’t want to re-invent the wheel, so I decided to use the built-in styles editor. This is easily called using dialogs

 

Application.Dialogs(xlDialogApplyStyle).Show

 

From here, the style can be tailored to your needs, a new style can be added, or a style can be deleted. This dialog defaults to the Normal style, but you can pre-load the style by passing it as an argument

 

Application .(xlDialogApplyStyle).Show “myParticularStyle”

 

So far so good. This all looks ideal.

Unfortunately, things are never that simple. The following is a code snippet that should create a new style called NFx1Dec and open the styles edit dialog for that style.

 

Const StyleName As String = “NFx1Dec”

    On Error Resume Next
    ActiveWorkbook.Styles(StyleName).Delete
    On Error GoTo 0

    Activecell.Style = “Normal”
    ActiveWorkbook.Styles.Add StyleName, Activecell
    Application.Dialogs(xlDialogApplyStyle).Show ActiveWorkbook.Styles(StyleName)



If you call this dialog from VBA as shown above, select your style to work with, and then click the Modify button, you are presented with a series of tabs to adjust the particular style properties. From here, select the Patterns tab and you see a colour palette, a pattern dropdown, and a sample preview box.

So, you want to change the fill colour. Simple, just select a colour from the colour palette. Of course, it is not simple, otherwise I wouldn’t be writing this. Select the colour, and nothing happens. You do not see that colour in the Sample box (as you would if you were modifying this style in Excel), and when you exit, that style does not have that fill colour.

You can force it by selecting the pattern option to say solid, but you don’t have to do this in Excel, so you shouldn’t have to just because it is being invoked from VBA. You can also force it by selecting your colour, then select No Colour, then select you desired colour again (what!).

I tried various things to try and force the pattern to be solid before invoking the tab, such as

 

    ActiveWorkbook.Styles(StyleName).Interior.Pattern = xlSolid
    ActiveWorkbook.Styles(StyleName).Interior.PatternColorIndex = xlAutomatic



but no joy. So, a  real failing on using what is a useful function of Excel from within VBA.

I was discussing this with Jan Karel Pieterse, a Dutch Excel MVP. Jan Karel also has an interest in styles; he has a page about using styles on his website http://www.jkp-ads.com/Articles/styles00.asp. Jan Karel came up with the following workaround

 

Const StyleName As String = “NFx1Dec”
Dim CB As CommandBar
Dim sMenuKeys As String
Dim sMenuCap As String
    
    Set CB = Application.CommandBars(“Worksheet Menu Bar”)
    sMenuCap = CB.FindControl(Id:=30006, recursive:=True).Caption
    sMenuKeys = “%” & Mid(sMenuCap, InStr(sMenuCap, “&”) + 1, 1)
    sMenuCap = CB.FindControl(Id:=254, recursive:=True).Caption
    sMenuKeys = sMenuKeys & Mid(sMenuCap, InStr(sMenuCap, “&”) + 1, 1)
   
    On Error Resume Next
    ActiveWorkbook.Styles(StyleName).Delete
    On Error GoTo 0

    Activecell.Style = “Normal”
    ActiveWorkbook.Styles.Add StyleName, Activecell
    SendKeys sMenuKeys & ActiveWorkbook.Styles(StyleName)



Although this uses the dreaded SendKeys, it does seem to work. As a stand-alone procedure, it does work, but when embedded in an application, it had some serious problems.


… to be continued