I was previously wondering how to link a VBA project to HTML Help (that is, linking to a page in a .chm file). I’m thinking of the Help as pages in a User Manual, not control-level Help (“The Delete button deletes the current item”, etc).
Having got some compiled Help (a CHM file), we need to link into it. The simplest way seems to be to use the Application.Help method. This takes a path to a CHM file, and a numerical key – for example:
Application.Help “C:\…….\myhelp.chm”, 1002
There are a couple of issues with this. The first is that each call to this method (on the same file) opens a new Help Viewer window. I haven’t found a way round this. The second issue is that the numerical keys have to be defined in a header file prior to compilation – something like this:
#define VBA_Creating_a_Widget 1001
#define VBA_Filtering_Widgets 1002
where the names are those of the topic files in the HTML Help project (minus the .html suffix). This mapping is compiled into the help project to produce the CHM file. However, generation from DITA (XML) source goes straight to the compiled CHM, so there’s no chance of adding in a map. (You could decompile the CHM and then add the map before recompiling).
Fortunately, it doesn’t matter, because there’s another way of linking to the Help from VBA. This is to use a more general function, HtmlHelp, available from the Help OCX (HHCtrl.ocx).
You need to declare this function in a public module:
Declare Function HtmlHelp Lib "HHCtrl.ocx" _ Alias "HtmlHelpA" _ (ByVal hwndCaller As Long, _ ByVal pszFile As String, _ ByVal uCommand As Long, _ dwData As Any) As Long
You also need a couple of constants (just to give us meaningful names):
Const HH_DISPLAY_TOPIC = &H0 Const HH_HELP_CONTEXT = &HF
The constant declarations need to be in each module that calls the function.
We can now call the function from a Command button handler, or whatever:
Private Sub HelpCommand_Click() Call HtmlHelp (0, Dotslash("myhelp.chm"), _ HH_DISPLAY_TOPIC, ByVal "VBA_Filtering_Widgets.html") End Sub
The zero argument is to do with the windowing – the Help opens in a sibling window. Note the ByVal passing of the string (because it’s to an external library). Dotslash is just my shorthand for an absolute path (which is recommended):
Public Function Dotslash(filename As String) As String Dotslash = ActiveWorkbook.Path + "\" + filename End Function
The other mode argument, HH_HELP_CONTEXT, is for the mapped-id lookup, which is what Application.Help does.
This is just scratching the surface. There’s more information on MSDN.