Using Selection

S

Sachin

Hi everyone. I want to create a macro that takes currently selected
objects and somehow sets them (and their connectors and connected
shapes) apart from the rest of the drawing. I am familiar with these
two pieces of code from John Marshall's site:

----
Dim VsoSelect As Visio.Selection
Dim VsoShape as Visio.Shape

Set VsoSelect = Visio.ActiveWindow.Selection

If VsoSelect.Count > 0 Then
for each VsoShape in VsoSelect

next VsoShape
else
MsgBox "You Must Have Something Selected"
end if
---
Dim vsoShapes As Visio.Shapes
Dim vsoShape As Visio.Shape
Dim vsoConnectTo As Visio.Shape
Dim vsoConnects As Visio.Connects
Dim vsoConnect As Visio.Connect
Dim intCurrentShapeIndex As Integer
Dim intCounter As Integer
Set vsoShapes = ActivePage.Shapes

'For each shape on the page, get its connections.
For intCurrentShapeIndex = 1 To vsoShapes.Count

Set vsoShape = vsoShapes(intCurrentShapeIndex)
Set vsoConnects = vsoShape.Connects

'For each connection, get the shape it connects to.
For intCounter = 1 To vsoConnects.Count

Set vsoConnect = vsoConnects(intCounter)
Set vsoConnectTo = vsoConnect.ToSheet

'Print the name of the shape the
'Connect object connects to.
Debug.Print vsoConnectTo.Name

Next intCounter

Next intCurrentShapeIndex
---

I know that within these sub procedures lies my answer and I am trying
to combine them somehow. What made sense to me was to do this:

Set vsoSelect = Visio.ActiveWindow.selection
Set vsoShape = vsoSelect
Set vsoConnects = vsoShape.Connects

But it's giving me a type mismatch error. Does anyone have any other
ideas?

Thanks
 
S

Sachin

Set vsoSelect = Visio.ActiveWindow.selection
Set vsoShapes = vsoSelect
Set vsoConnects = vsoShapes.Connects


Thanks, but still giving me a type mismatch at my third line. I don't
understand why, though. vsoShapes is set to a selection of shapes, so
the type should be correct, should it not?
 
P

Paul Herber

Set vsoSelect = Visio.ActiveWindow.selection
Set vsoShapes = vsoSelect
Set vsoConnects = vsoShapes.Connects


Thanks, but still giving me a type mismatch at my third line. I don't
understand why, though. vsoShapes is set to a selection of shapes, so
the type should be correct, should it not?

You can only refer to one shape's connects at a time
Set vsoConnects = vsoShape.Connects
 
S

Sachin

I'm still getting the same error. I think it has something to do an
inability to take connects from a selection without the proper
bridging syntax?
 
P

Paul Herber

I'm still getting the same error. I think it has something to do an
inability to take connects from a selection without the proper
bridging syntax?

No, the connects belong to a shape, Iterate through the sahpes in a
selection, then get the connects for each shape.
 
S

Sachin

the connects belong to a shape

Exactly.

The connections belong to a shape, the shape belongs to a selection. I
need to get the connections of a selection, so to do so I used the
bridge: Set vsoShape = vsoSelect, where vsoSelect is = to the
selection. Then I tried getting the connections from vsoShape. But
it's giving me the mismatch error which leads me to believe that the
bridge is wrong, it is trying to get connections from a selection
which is probably a mismatch. And I am hard coding for one shape only
for simplicity and to avoid confusion.

I am very confused.
 
J

John... Visio MVP

I have simplified the code, so this should be what you are looking for:

Public Sub ListConnections()

Dim vsoConnect As Visio.Connect
Dim vsoConnects As Visio.Connects
Dim vsoSelect As Visio.Selection
Dim vsoShape As Visio.Shape
Dim vsoShapes As Visio.Shapes

Set vsoSelect = Visio.ActiveWindow.Selection

If vsoSelect.Count > 0 Then
'For each shape in the selection, get its connections.
For Each vsoShape In vsoSelect

Set vsoConnects = vsoShape.Connects

'For each connection, get the shape it connects to.
For Each vsoConnect In vsoConnects

'Print the name of the shape the
'Connect object connects to.
Debug.Print vsoConnect.ToSheet.Name; " Connects to ";
vsoConnect.FromSheet.Name

Next vsoConnect

Next vsoShape
Else
MsgBox "You Must Have Something Selected"
End If

End Sub
 
J

John... Visio MVP

Two more point, each shape has two connection collections. Connects lists
the shapes the shape is connected to and FromConnects lists the shapes that
connect to this shape.
So if you want to list ALL connections you need to check both collections. I
have attached an updated procedure that shows this at the end of this
message

The second point is that if you have two boxes with a connection lines, the
boxes are not really connected to each other. Each box is connected to the
connector which is then connected to the other box. So if you need to
abstract to Box A connected to Box B you need to do a lot of checking.

Public Sub ListConnections()

Dim vsoConnect As Visio.Connect
Dim vsoConnects As Visio.Connects
Dim vsoSelect As Visio.Selection
Dim vsoShape As Visio.Shape
Dim vsoShapes As Visio.Shapes

Set vsoSelect = Visio.ActiveWindow.Selection

Debug.Print vsoSelect.Count
If vsoSelect.Count > 0 Then
'For each shape in the selection, get its connections.
For Each vsoShape In vsoSelect

Set vsoConnects = vsoShape.Connects

'For each connection, get the shape it connects to.
For Each vsoConnect In vsoConnects

'Print the name of the shape the
'Connect object connects to.
Debug.Print vsoShape.Name; " connects to ";
vsoConnect.ToSheet.Name

Next vsoConnect

Set vsoConnects = vsoShape.FromConnects

'For each connection, get the shape it connects to.
For Each vsoConnect In vsoConnects

'Print the name of the shape the
'Connect object connects to.
Debug.Print vsoShape.Name; " is connected from ";
vsoConnect.FromSheet.Name

Next vsoConnect


Next vsoShape
Else
MsgBox "You Must Have Something Selected"
End If

End Sub
 
P

Paul Herber

Exactly.

The connections belong to a shape, the shape belongs to a selection. I
need to get the connections of a selection, so to do so I used the
bridge

No such thing as a bridge.
Look at the code John has posted
1. create a reference to the selection
2. this selection contains selection.count shapes
3. loop though these shapes using for each
4. with each shape get the connects
 
P

Paul Herber

No such thing as a bridge.
Look at the code John has posted
1. create a reference to the selection
2. this selection contains selection.count shapes
3. loop though these shapes using for each
4. with each shape get the connects

oh, and it can get more complicated, it depends upon the shapes, if a
shape is a group and the connection is to a shape within the group
then you will have to loop through these shapes as well, and grouping
can go to any level.
 
J

John... Visio MVP

Paul Herber said:
No such thing as a bridge.
Look at the code John has posted
1. create a reference to the selection
2. this selection contains selection.count shapes
3. loop though these shapes using for each
4. with each shape get the connects


You need to check FromConnects as well.
BoxA <-- Dynamic Connector --> Box B
will only show entries in the Dynamic Connector Collection. One to Box A and
One to Box B
The FromConnects of BoxA and BoxB will show the reverse of those two
connections.

John... Visio MVP
 
S

Sachin

Hi again.

I had this piece of code working, but when I tried it with a different
drawing (exact same piece of code), the macro would run but no matter
what it would give me the message box saying I needed something
selected. I have tried selecting single shapes, different shapes,
multiple shapes, everything. I have re-entered the code, looked over
it and everything is the same and looks fine. Does anyone know what
might be causing this?

Thanks in advance, Sachin.
 
D

Dieter Sternberg

If you have something selected and the Selection.Count is zero (or less
than the expected size) you may have shapes selected within a group.
In this case playing with Selection.IterationMode can help.
Set it to visSelModeSkipSuper for example and see if Selection.Count
changes.

Regards
Dieter
 
J

John... Visio MVP

Sachin said:
Hi again.

I had this piece of code working, but when I tried it with a different
drawing (exact same piece of code), the macro would run but no matter
what it would give me the message box saying I needed something
selected. I have tried selecting single shapes, different shapes,
multiple shapes, everything. I have re-entered the code, looked over
it and everything is the same and looks fine. Does anyone know what
might be causing this?

Thanks in advance, Sachin.


Post the code so we can take a look at it.

John... Visio MVP
 
P

Paul Herber

Hi again.

I had this piece of code working, but when I tried it with a different
drawing (exact same piece of code), the macro would run but no matter
what it would give me the message box saying I needed something
selected. I have tried selecting single shapes, different shapes,
multiple shapes, everything. I have re-entered the code, looked over
it and everything is the same and looks fine. Does anyone know what
might be causing this?

Well, one of your previous posts said " ... I am hard coding for one
shape only for simplicity and to avoid confusion."
Is this still the case?
 
S

Sachin

Well I'm working with the exact same code you gave me, John.
---

Dim vsoConnect As Visio.Connect
Dim vsoConnects As Visio.Connects
Dim vsoSelect As Visio.Selection
Dim vsoShape As Visio.Shape
Dim vsoShapes As Visio.Shapes


Set vsoSelect = Visio.ActiveWindow.Selection


Debug.Print vsoSelect.Count
If vsoSelect.Count > 0 Then
'For each shape in the selection, get its connections.
For Each vsoShape In vsoSelect


Set vsoConnects = vsoShape.Connects


'For each connection, get the shape it connects to.
For Each vsoConnect In vsoConnects


'Print the name of the shape the
'Connect object connects to.
Debug.Print vsoShape.Name; " connects to ";
vsoConnect.ToSheet.Name


Next vsoConnect


Set vsoConnects = vsoShape.FromConnects


'For each connection, get the shape it connects to.
For Each vsoConnect In vsoConnects


'Print the name of the shape the
'Connect object connects to.
Debug.Print vsoShape.Name; " is connected from ";
vsoConnect.FromSheet.Name


Next vsoConnect


Next vsoShape
Else
MsgBox "You Must Have Something Selected"
End If
---

There is a compilation error with the lines "vsoConnect.ToSheet.Name",
and "vsoConnect.FromSheet.Name". If I comment them out to see if the
rest of the macro runs properly, it runs but gives me the message box
no matter what. I am not hard coding for anything. When I was working
with this in the past, I don't remember the message box error. I do
remember the .Name errors but I forget how I got around them.
Unfortunately when I was using this before we didn't end up going
through and using the macro, and I foolishly didn't save what I had.
 
J

John... Visio MVP

Looks like you are suffering from email word wrap.
The lines with ".Name" are part of the Debug.print line before them. Remove
the carriage return at the end ofthe previous line and you should be fine.

It appears the newsgroup posting split the line into two lines and VBA just
does not understand the second line.

John... Visio MVP
 
V

vespasiandamascus

Hi Sachin.

The carriage returns are the key as I have discovered using this code
as well. Also, the msg box issue was fixed after I fooled around with
it a bit. I ended up just hard coding a loop through the shapes I was
working with.

I am experiencing a related problem, however. I want to find explicit
connections as in ShapeA connects with ShapeB etc... using the actual
shape text. The ToSheet command is returning a shape text, however the
FromSheet command is returning the text of a connector, not a shape.
Does anyone know of another command that will return the shape text on
the other side of the connector?

Thanks,

Damascus
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top