Applying Selected DataGraphic to the Whole Document

A recent newsgroup question asked if there is a way to apply a DataGraphic to all pages in a document.  Well, there is no built-in option in Visio 2007 (or Visio 2010), but it can be done with a little bit of VBA.  This blog presents a macro that can be used in most cases.

The specific use case was for an Organization Chart that has many pages, and it can be really tedious to make each page active, select all the shapes, then apply a DataGraphic, so I have written a macro that allows you to apply the required DataGraphic to a single shape, then you select that shape; run the macro to apply the same DataGraphic to all shapes in the document that has a Shape Data row with the same name as the the first Shape Data row in the selected shape.

The screenshots are from the Visio 2010 Beta, but the code will work for Visio 2007 Professional edition too.

image

Before

So, here is the macro that achieves the desired result:

   1: Option Explicit
   2:  
   3: Public Sub ApplyDataGraphicToDocument()
   4: Dim mstDG As Visio.Master
   5: Dim shp As Visio.Shape
   6: Dim pag As Visio.Page
   7: Dim firstProp As String
   8:  
   9:     If Visio.ActiveWindow.Selection.Count = 0 Then
  10:         MsgBox "Please select a shape which already has data graphics"
  11:         Exit Sub
  12:     Else
  13:         Set shp = Visio.ActiveWindow.Selection.PrimaryItem
  14:         If shp.DataGraphic Is Nothing Then
  15:             MsgBox "Please select a shape which already has data graphics"
  16:             Exit Sub
  17:         Else
  18:             'Get the shapes DataGraphic master
  19:             Set mstDG = shp.DataGraphic
  20:             'Get the name of the first Shape Data row
  21:             firstProp = "Prop." & _
  22:                 shp.CellsSRC(Visio.visSectionProp, 0, 0).RowNameU
  23:         End If
  24:     End If
  25:     
  26:     For Each pag In Visio.ActiveDocument.Pages
  27:         If pag.Type = visTypeForeground Then
  28:             For Each shp In pag.Shapes
  29:                 'Check that the named Shape Data row exists
  30:                 If shp.CellExistsU(firstProp, Visio.visExistsAnywhere) Then
  31:                     'Set the DataGraphic
  32:                     shp.DataGraphic = mstDG
  33:                 End If
  34:             Next
  35:         End If
  36:     Next
  37:  
  38: End Sub

image

After

visViewer Update

Microsoft recently retired Visio Viewer 2002 and 2003, and forced a security patch of Visio Viewer 2007 (see http://blogs.msdn.com/visio/archive/2009/12/28/updates-regarding-the-visio-viewer.aspx for more details).  This affected my free visViewer wrapper application.  Therefore, I have updated my visViewer application, which you can download from http://www.bvisual.net/Products/visViewer.aspx .

image

And yes, I will soon be creating a 3rd edition to work with Visio Viewer 2010!

Follow

Get every new post delivered to your Inbox.

Join 209 other followers