Every Visio shape must have a unique name in the collection that it belongs to, and to ensure this, Visio automatically one using the master name or just “Sheet”, if not an instance of a master, followed by a period (“.”) and the ID. However, a user can rename a shape, and Visio will then also update the universal name (NameU) to be the same as the Name. If a user chooses to re-name a shape a second time, then thee universal name is not updated … it remains as the original name.
To demonstrate this I drew a rectangle, then named, and re-named it:
This is the simple VBA code that was called by an Action in the shape:
Public Sub ShapeNames(ByRef shape As Visio.shape)
Dim txt As String
txt = "ID = " & shape.ID
txt = txt & vbCrLf & "Name = " & shape.Name
txt = txt & vbCrLf & "NameID = " & shape.NameID
txt = txt & vbCrLf & "NameU = " & shape.NameU
MsgBox txt
End Sub
So, there can be several ways to reference a shape, but be aware when they can be used. For example, the Name cannot be directly typed into a ShapeSheet formula, but the NameU can.

If the NameID is used in a ShapeSheet formula, then it will be automatically re0displayed with the NameU.
Interestingly, either the NameID, NameU or Name can be used if using the EVALTEXT(…) function is used.
In VBA, or other code, then the shape can be referenced by either the NameID or Name, but not by the NameU value. The shape can also be referenced with ID value using the ItemFromID function.
?ActivePage.Shapes("Sheet.1").NameU
Shape A
?ActivePage.Shapes("Shape B").NameU
Shape A
?ActivePage.Shapes.ItemFromID(1).NameU
Shape A
If the Name is deleted using the Shape Name dialog, then the Name is reverted to the NameID, but the NameU still remains unchanged.
The universal name, NameU, was created so that the Visio UI could display a language specific Name value whilst maintaining a language independent NameU in the background.
Code can be used to update the NameU, provided that it is a unique name within the collection.

Every shape can also have a globally unique id (guid for short), which can be created, read or deleted with the various parameters passed to the UniqueID property of a shape (or PageSheet or DocumentSheet). This could be used to name a shape, as in the following VBA code:
Public Sub NameShapesOnPageWithGuid() Dim shp As Visio.Shape For Each shp In ActivePage.Shapes shp.Name = shp.UniqueID(Visio.VisUniqueIDArgs.visGetOrMakeGUID) Debug.Print shp.ID, shp.NameU, shp.Name Next End Sub
This could display something like the following in the Immediate Window:
1755 {04168AB4-2442-40AC-85A2-402B6B6EB97B} {04168AB4-2442-40AC-85A2-402B6B6EB97B}
2067 WBS_2 {14FA6C60-3476-4904-A35C-B4F8568E8EDF}
2070 WBS_2.5 {F7BE8598-C994-4E4B-8691-EDA7573D9D88}
2097 WBS_2.5.2 {53651EEF-1D5D-4C76-8E6B-E09BE036A922}
2112 WBS_2.5.2.1 {E318FC1A-00E5-4062-A62C-480A6E37C77A}
2143 WBS_2.5.2.2 {0DC8C127-5767-430A-B3A2-147E74F50EC6}
2174 WBS_2.5.2.3 {D11417B7-1DAA-4716-AF97-1FC0005E8C12}
2189 WBS_2.5.2.4 {558E05C0-9443-47AA-82E4-4D45866E0CE2}
2073 TASK_1016991 {81F75F38-6AC3-4864-A175-1270F1094EE5}
2077 TASK_1016994 {8CEBD7FE-757D-4A06-816F-3FB112CD0314}
2081 TASK_1017013 {B314B362-7451-4EE3-B9C8-4A38E6DDCDFB}
Notice that the first shape in the list above has the same NameU and Name, but the rest of shapes already had a custom Name, so a second attempt to create a custom Name will not update the NameU property simultaneously. The NameU property can be set in code again, if required, but remember that the Name and NameU values must be unique in the shapes collection that they are part of. In addition, they cannot be a zero-length string.
Using Notepad++ to Edit Visio ShapeSheet formulas
Visio shapes get their smartness from the formulas that are entered into the ShapeSheet, but editing these formulas can be extremely tricky and prone to error because of the lack of a modern programmer’s interface. Formulas can be quite long (up to 64k characters) but even medium size ones like the one in User.GetWorkdays cell…
Adding a second Function header bar to Visio swimlanes
I was recently asked if a second function header bar can be added to the swimlanes in the cross-functional flowchart templates in Visio. Some swimlanes can get quite wide, so it can be useful to have a duplicate function header shape on the far-side too. It is quite simple to duplicate the existing function header…
More Parsing XML Data in Visio Shapes
My last article looked at parsing an XML string with a known structure and order of elements and attributes. This can be acceptable in some scenarios, but what if the elements or attributes are in a different order? Then it is necessary to use the element and attribute names rather than their index position. This…
Parsing XML data in Visio Shapes
One of my current projects uses XML data, and some of the values in the XML data control the display and content of Visio shapes. Therefore, I looked deeper into how the XML data can be used directly to control parts of the graphics. Although the external data linking feature in Visio Professional and Visio…
Highlighting dirty text in Visio shapes
I suppose I should explain what I mean by dirty text first 🙂 I often display the value of a Shape Data row in Visio text, but sometimes the solution requires that the value is also editable. This is ok if the client accepts that all editing is done with the Shape Data window or…
My new book on Visualizing Processes with Microsoft Visio has launched
Back in the early 1990s, there was an application called ABC Flowcharter that was the market leader for diagramming business flowcharts, but some of the brains behind Aldus PageMaker saw an opportunity to create something smarter, and left to write the Visio product, with the stated aim to overtake ABC Flowcharter within 2 years. They…
Hi. That’s interesting and might be connected to a problem I ran into. Our Visio drawing is exported to SVG, writing the shape’s Name into Title elements. Since only some Titles are wanted, we tried to reset all shape Names to an empty string via Visio VBA, but failed. Obviously, the Name property is read-only. So, one can change the Name property in the GUI, so ist should be possible with VBA, too. Could you give a hint, how that works?
I have added a little to the end of the post with some sample VBA code, but in short, the Name (or NameU) properties cannot have a zero-length value.
Thanks a lot. So, in short, if we require the exported Title elements to be empty, it cannot be done by clearing the shape Names.
I am importing org chart data into Visio, and want to a) rename each page of the results using the imported data, based on the portion of the organization represented, and b) use the imported data to assign shapes to specified containers on certain pages. Can either/both of these be done using VBA? I am not familiar with VBA, but I did find one site that gave some sample code to let me do a simple replacement of static parts of the page name, which makes me think perhaps more sophisticated code could do more?
You can certainly re-name each page in VBA. If you have an Org Chart on each page, are you wanting to use a value in the Shape Data of the top most shape to use?
I have an Org Chart consisting of 50+ pages.
I am trying to figure out how to use shape data (Department, Manager Last name) from the top shape on each page to rename that page.
I changed the default shape that got imported using the Organization Chart wizard and the top shapes all have different Shape 1 numbers.
Any assistance in explaining how to loop through all pages and rename the page using the top shape data would be greatly appreciated!
You mean something like this?:
Public Sub NamePages()
Dim shp As Visio.Shape
Dim pag As Visio.Page
Dim lngShapeIDs() As Long
For Each pag In ActiveDocument.Pages
For Each shp In pag.Shapes
If shp.CellExistsU(“User.msvReplaceClass”, Visio.visExistsAnywhere) <> 0 Then
If shp.CellsU(“User.msvReplaceClass”).ResultStr(“”) = “visOrgChart” Then
lngShapeIDs = shp.ConnectedShapes(visConnectedShapesIncomingNodes, “”)
If UBound(lngShapeIDs) < 0 Then pag.Name = shp.CellsU("Prop.Name").ResultStr("") Exit For End If End If End If Next Next End Sub
David,
Thanks for your reply! My VBA skills basically comprise of “borrowing” the code of others. Do I need to replace references in the CellExitsU(“User…” lines?
When I step thru the code, I get a 424 error on this line. I apologize for my ignorance.
For Each shp In pag.Shapes
If shp.CellExistsU(“User.msvReplaceClass”, Visio.visExistsAnywhere) 0 Then
Copy and pasting code can cause issues sometimes.
Check that the double quotes are plain ones. I usually go via Notepad to check that “ and ” are replaced with ” characters. Subtle but essential.
Wow. I never would have thought to check that! Thank you – I did need to replace them.
I really appreciate your assistance.
David,
One more question…
Do you have a recommendation of where I can find documentation to help me understand the objects and references used in Visio VBA? For example, I’ve been searching and cannot find any information regarding msvReplaceClass. What you provided to me is magic… I’d like to be able to analyze it and try to understand it but am not sure where to start.
CellExistsU(“User.msvReplaceClass”
Bill,
You could start by watching a couple of videos from my frind John Goldsmith: Visio, a flyby for Developers
As for a list of the reserved User-defined cell names … we have asked many times to get a list from Microsoft… Here are some of them : Custom Containers, Lists and Callouts in Visio 2010
I have a Visio Org Chart that was imported from Excel and I did a custom import of the external data to make it available. The org chart contains 71 pages. I can’t figure out how to link data for all the pages. From the Data Tab, when I select LINK DATA, it gives the option of Selected shapes or all shapes on the page.
Is there a way to link data for the entire chart in a single step or does it require a VBA script?
Thanks.
Is there a way to reference another shapesheet from a text reference without using VBA? I am trying to modify the custom callouts in the Callouts stencil and need query information from the Parent Shapesheet. In the shapesheet for the callout, the User.ccParentName cell gets populated with the name of the shape that the callout is pointing to. Lets say I want to make the Leader line of the callout the same color as what it is connected to. How do I use the text that is in the User.ccParentName cell to reference that shapesheet and pull a value from a cell in that shapesheet. It would be something like the INDIRECT function in Excel, e.g. =INDIRECT(User.ccParentName & “!LineColor”).
Thanks.
Have checked out Adding Configure Callout functionality to Visio Callouts ?
I think you want to do the reverse?
I just tried the reverse, ie adding the new callout functionality to the older ones, and it will work.
Checkout CalloutTargetRef() Visio ShapeSheet Functions A-C ?
I was able to do what I wanted by using the formula:
=SETF(GETREF(Scratch.D1,User.ccParentName&”!LineColor”)
Your answer pushed me in that direction. I appreciate your very quick reply.
Thank You
Well done!