Visio 2010 Validation Rules (part 1)

The Microsoft Visio team recently blogged about Creating custom validation rules for Visio 2010 (see, in which it was suggested that we can use Visual Basic for Applications to interact with the new validation API.  I thought, there’s a challenge … so I will develop a VBA project to do just that.  I will upload the code soon, but, as it is only half developed today, I will demonstrate how to understand why a rule has been broken.

In the following BPMN diagram, I have failed to connect a Task to the End Event.  I have made it obvious here but it could be easy to overlook in a larger diagram.  In fact, I know of one company who were advised by a “consultant” that there must be something wrong when the end of a connector goes red therefore you should move it away from the shape until it goes green!  The result was that the company had over 300 flow diagrams without a single valid connection!  That company is no more!


The new UI in Visio 2010 has a new Process tab, which has a button to Check Diagram and a tick box display the Issues Window.  This shows that two rules have been broken, but it does not give you any more than the rule Description and Category.  Now, you may assume that Microsoft have the BPMN rules modelled correctly, but if you are creating your own rule sets, then you need to understand exactly why they have been broken, therefore I have constructed a basic VBA dialog that displays the Issues and Rules in a selected document.


So, when an Issue is read from the new document.Validation.Issues collection

Issue 1 has the rule with the description An End Event must have incoming Sequence Flow. has the name NoSequenceFlowToEndEvent , and the category of End Events .

Issue 2 has the rule with the description The flow must have a source and target. has a name NoTargetOrSource, and a category list of Sequence Flow, Message Flow .




The Name, Description and Category of the Rule, cannot be sufficient to define what the rule is, so we must explore the Rules of the active RuleSet in the document.  In this case it is the BPMN RuleSet, which contains many Rules, and using my dialogue, I can find the Rule with the name NoTargetOrSource to see what it’s definition is.


Now we can begin to understand how a rule is defined by inspecting the Test Expression and Filter Expression values.


FilterExpression=OR(Actions.MessageFlow.Checked, Actions.SequenceFlow.Checked)

These expressions look very similar to ShapeSheet formulae, but they are not actual ShapeSheet formulae.  However, some ShapeSheet functions can be used in these expressions, but Microsoft have had to create some extra quasi-ShapeSheet functions that are needed in order to create a rule definition.

Closer inspection of the FilterExpression shows that this rule is only to be applied to shapes which have either an Actions.MessageFlow or Actions.SequenceFlow row checked.  The Dynamic Connector in the BPMN template has been modified to have such rows in the Actions section of the spreadsheet.


If you now look at the TestExpression reveals that the new GluedShapes method, as seen in my previous post Listing Connections in Visio 2010 (!3350D61BC93733A9!1820.entry ), returns an array of glued shapes .  The arguments 4 and 5 are the actual values of the constants visGluedShapesIncoming2D and visGluedShapesOutgoing2D respectively.  The function AGGCOUNT() obviously means the count the number of items in the retuned array, so the whole expression simply says that there must be a connected 2D shape at either end of the connector.

The other broken rule, NoSequenceFlowToEndEvent, has :



Inspection of these expressions reveal that it applies to and shape that has the category “Event”, and has the row Actions.End checked, and it must have a glued connector which has the row Actions.SequenceFlow checked.  I discussed the new ShapeSheet function HASCATEGORY() in my earlier blog Visio 2010 : Containment and Cross-Functional Flowcharts (!3350D61BC93733A9!1811.entry ), but the other new function is FILTERSET() obviously means that the returned array of GluedShapes is filtered to include only those that satisfy the second argument, in this case, Actions.SequenceFlow.Checked.

Once you start examining the rules, you can begin to understand how you can create your own ones.  Getting interested?

Listing Connections in Visio 2010

One of the best bits of Visio is the connections between shapes, but it has always been difficult to understand these connections in code.  There are connections to and from shapes, which require you to understand where you are and which way to look … at the begining or the end of a 1D connector. Visio 2010 has added some useful extra methods to the shape object which makes understanding connections much easier.  This post will show you how you can use the new GluedShapes() and ConnectedShapes() methods.

Take, for example, a network diagram where there are connections between servers and routers:


Read the rest of this entry »


O365 and SharePoint

Simplify Tasks

Want to learn the simple way?

Paul Turley's SQL Server BI Blog

sharing my experiences with the Microsoft data platform, SQL Server BI, Data Modeling, SSAS Design, Power Pivot, Power BI, SSRS Advanced Design, Power BI, Dashboards & Visualization since 2009

John Goldsmith's visLog

be smart, be clear, be visual ...

Mo's blog

Personal views on Dynamics 365 for Operations and Technical Architecture.

Chris Webb's BI Blog

Microsoft Power BI, Analysis Services, MDX, DAX, M, Power Pivot and Power Query

Azure Solutions for Office 365, and more...

Rob Fahrni



Life with Visio and other Microsoft Toys!

Nilsandrey's Weblog

Just another weblog

Things that Should be Easy

Every so often (too often in the IT industry) I encounter things that should have been very easy to do but turned out to be far too complicated. My favorite topics include SharePoint, .Net development, and software architecture, especially distributed systems.

Visio Guy

Smart graphics for visual people