Automatically Create Table of Contents in Visio

NOTE: this is way out of date...

I use Visio to create wireframe documents, and as updating Tables of Contents in Visio is very dull, I wrote a macro (a small program) that automatically generates a Table of Contents list for a Visio document. It is stored in a Stencil.

The Table of Contents format is:
1 First Page
2 Another Page
3 Etc Page

(Where the page title comes from the page title seen in the tabs at the bottom of the page.)

How to use:

  • Set Security to Medium (to allow Visio to run Macros)

  • Close Visio
  • Open a Visio Document
  • Select a text box that you want to put the table of contents in
  • Open the Table_of_contents_creator_macro.vss stencil
  • Choose to enable macros
  • Select the text box you want the Table of Contents to appear in (or it will create a new box)
  • Select Tools > Macros > Table_of_contents_creator_macro > Module1 > Table_of_contents_creator
  • That's it!

Here is the code itself (you would write this in the visual basic editor in Microsoft Visio)

Sub table_of_contents_creator()
'this macro creates a table of contents in a visio document by
'going through the pages in the document and adds the page number and page title

'by stephen turbek [email protected]
'written for use in microsoft visio 2003 SP1

'adapted from
'I added allowing user to select a text box and replace the contents, rather than build lots of little boxes
'this way you can style the text easily, and simply replace the contents when you update the doc
'note: this is my first VB script

' define a shape to use for the Table of Contents (TOC)
Dim TOCEntry As Visio.Shape

'get selection
Dim selectedShapes As Selection
Set selectedShapes = ActiveWindow.Selection

'is any shape selected to put the ToC in?
If selectedShapes.Count > 0 Then
'take the selected shape to put the table of contents in
Set TOCEntry = ActiveWindow.Selection.Item(1)
'nothing is selected, create a shape
Set TOCEntry = ActiveDocument.Pages(1).DrawRectangle(1, 1, 7.5, 10)

TOCEntry.Cells("VerticalAlign").Formula = "0" 'make text box top vertically aligned
TOCEntry.Cells("Para.HorzAlign").Formula = visHorzLeft 'make text box left aligned

End If

'clear out the shape's text
TOCEntry.Text = ""

'a variable to hold the page array
Dim PageToIndex As Visio.Page

' loop through all the pages
For Each PageToIndex In Application.ActiveDocument.Pages

'exit when it hits the first background page (don't want those in the ToC)
If PageToIndex.Background Then Exit For

'append the page number, a tab, the page name, and a return to the ToC text shape
TOCEntry.Text = TOCEntry.Text + CStr(PageToIndex.Index) + vbTab + PageToIndex.Name + vbNewLine


End Sub