Search code examples
c#vb.netoffice-interopvisio

How do I programmatically drop a Milestone onto a Block Timeline in Visio


I'm trying to programmatically create a timeline and markers using the Visio 2010 COM Interops. My code is based off of Chris Castillo's 2 part blog posting (Part 1, Part 2), which is the only semi-complete example I've been able to find on how to do this. However his blog (from 2004) doesn't seem to work right. The milestones are not really connected to the timeline, and updating their date does not get them to move to the right place.

Any suggestions or fixes?

enter image description here

Imports Microsoft.Office.Interop.Visio
Imports System.Diagnostics.CodeAnalysis
Imports System.Runtime.InteropServices

...

Dim VisioApp As New Application

Dim myDoc As Document = VisioApp.Documents.Add("")
Dim myPage As Page = myDoc.Pages.Item(1)

Dim TimelineStencils As Document =
    VisioApp.Documents.Add("Timeline Shapes.vss")

Dim theTimeline As Shape
Dim theMilestone As Shape

VisioApp.AlertResponse = 1

theTimeline = myPage.Drop(
    TimelineStencils.Masters.ItemU("Block timeline"), 5.610236, 5.511811)

theTimeline.CellsU("User.visBeginDate").FormulaU = _
        VisioApp.ConvertResult(
            "1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

theTimeline.CellsU("User.visEndDate").FormulaU = _
    VisioApp.ConvertResult(
        "12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

VisioApp.Addons("ts").Run("/cmd=3")

theMilestone = myPage.Drop( _
    TimelineStencils.Masters.ItemU("Line milestone"), _
    5.610236, 5.511811)

theMilestone.CellsU("User.visMilestoneDate").FormulaU = _
    VisioApp.ConvertResult(
        "7/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)

VisioApp.AlertResponse = 0

Solution

  • So I found a much better walk-through of programmatically adding visio objects that @JohnGoldsmith linked to in some of his other answers to related questions, and found a better way of creating the stencils and page, and it's working!

    Dim VisioApp As New Application
    
    Dim myDoc As Document = VisioApp.Documents.Add("Timeline.vst")
    Dim myPage As Page = myDoc.Pages.Item(1)
    
    Dim TimelineStencilName As String = "TIMELN_M.VSS"
    Dim TimelineStencilDoc As Document
    
    For Each Doc As Document In VisioApp.Documents
        If Doc.Name = TimelineStencilName Then
            TimelineStencilDoc = Doc
            Exit For
        End If
    Next
    
    Dim TimelineMaster As Master =
        TimelineStencilDoc.Masters.ItemU("Block timeline")
    
    Dim MilestoneMaster As Master =
        TimelineStencilDoc.Masters.ItemU("Line milestone")
    
    Dim theTimeline As Shape
    Dim theMilestone As Shape
    
    theTimeline = myPage.Drop(TimelineMaster, 5.610236, 5.511811)
    
    theTimeline.CellsU("User.visBeginDate").FormulaU = _
        VisioApp.ConvertResult(
                "1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
    
    theTimeline.CellsU("User.visEndDate").FormulaU = _
        VisioApp.ConvertResult(
            "12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
    
    theMilestone = myPage.Drop( _
        MilestoneMaster, _
        5.610236, 5.511811)
    
    theMilestone.CellsU("User.visMilestoneDate").FormulaU = _
        VisioApp.ConvertResult(
            "10/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)