LastFlush
Messages postés11Date d'inscriptionsamedi 13 janvier 2007StatutMembreDernière intervention 9 juin 2009
-
16 juin 2008 à 21:15
cs_unique07
Messages postés8Date d'inscriptionvendredi 2 mai 2008StatutMembreDernière intervention29 juillet 2010
-
21 juil. 2010 à 15:19
Bonjour ,
mon probleme est relativement simple et pourtant ...
Je code en VBA sous Visio 2007.
Objectif :
Je souhaite insérer un Label ou CommandButton ou autre Control du type MSForms dans un drawing Visio.
Je sais comment récupérer l'ID d'un shape par exemple sous Visio via VBA mais en le sélectionnant manuellement.
Ici je souhaite créer de facon automatique un control (disons un CommandButton pour eviter les à peu pres), et juste après qu'il soit créé le problème est que je n'ai pas le focus et que je ne connais ni son nom ni son ID, je ne peux donc pas travailler avec.
J'ai déjà creusé les pistes suivantes :
> Dim MonBtn as Object (ou OLEObject)
> Set MonBtn = CreateObject ... <- je n'ai pas trouvé les bonnes infos pour nommer et placer mon bouton c'est dommage car après il m'aurait de travailler avec .. With MonBtn ... end with
> Application.ActiveDocument. xxx . Add( .. )
La méthode Add mais la idem pas moyen de trouver les bons arguments
et enfin
> InsertObject = qui fonctionne bien pour insérer le Bouton mais pas moyen de le nommer ou de le placer
Je précise que je veux surtout le nommer OU connaitre son nom ou son ID pour pouvoir travailler avec, dont le placer sur mon Drawing et lui attribuer une valeur dans son champs "Data1"
Si quelqu'un à une suggestion ?
Derniere chose : la creation du CommandButton est declenche par un CommandButton_click() depuis un Form.
LastFlush
Messages postés11Date d'inscriptionsamedi 13 janvier 2007StatutMembreDernière intervention 9 juin 2009 19 juin 2008 à 17:54
Bien le bonjour tout le monde,
j'ai cherché longuement et j'ai fini par obtenir un quelquechose d'intéressant.
Pour travailler avec un Objet juste créé sous Visio il suffit en fait d'utiliser la référence Item(Index) pour "jouer" avec.
Mais l'Item(Index) de l'objet Shape et non OLEObject.
Sous Visio "tout objet est shape" que ce soit un control MSForms ou un connector ou un shape.
L'interêt d'utiliser cette référence c'est que ces Index sont variables, Visio les adapte automatiquement au nombre de shapes, d'objets présent sur le dessin (drawing).
Si vous avez un dessin avec 7 objets ( dison 2 labels, 2 CommandButton et 3 rectangles) et que vous supprimiez 5 d'entre eux, n'importe lesquels les 2 restant auront forcemment les Index 1 et 2 respectivement dans leur ordre d'apparition sur la feuille.
De ce fait il ne reste plus qu'à compter le nombre d'objets :
nbrShp = pagThisPage.Shapes.Count
Et faire appel a l'objet/shape ayant pour Index : Nbre de shape + 1
intCount = nbrShp + 1
Set shpCommandButtonShape = pagThisPage.Shapes.Item(intCount)
et le tour est joué ;)
Ci dessous une source complète pour ceux qui souhaitent tester.
Celle-ci crée un bouton, et le place ailleurs sur le dessin en cours et le dimensionne.
La procédure était attaché à un bouton, libre à vous ;)
Private Sub AddBtn_Click()
Dim pagThisPage As Visio.Page
Dim shpCommandButtonShape As Visio.Shape
Dim intCount As Integer
Dim nbrShp As Integer
Dim dblWidth As Double
Dim dblHeight As Double
Dim celPinX As Visio.Cell
Dim celPinY As Visio.Cell
Dim celWidth As Visio.Cell
Dim celHeight As Visio.Cell
Set pagThisPage = Visio.ActivePage
nbrShp = pagThisPage.Shapes.Count 'count the number of shapes before to add one
Application.ActiveWindow.Page.InsertObject "{D7053240-CE69-11CD-A777-00DD01143C57}", visInsertAsControl + visInsertNoDesignModeTransition
intCount = nbrShp + 1 ' just after addded 1 more the ID is nbrShp
Set shpCommandButtonShape = pagThisPage.Shapes.Item(intCount)
Set celPinX = shpCommandButtonShape.Cells("PinX")
Set celPinY = shpCommandButtonShape.Cells("PinY")
Set celWidth = shpCommandButtonShape.Cells("Width")
Set celHeight = shpCommandButtonShape.Cells("Height")
LastFlush
Messages postés11Date d'inscriptionsamedi 13 janvier 2007StatutMembreDernière intervention 9 juin 2009 26 juin 2008 à 17:51
Bonjour again,
tant que je suis replongé dans le VBA sous Visio j'en profite pour revenir un poil sur le script ci-dessus.
L'astuce en fait etait de travailler avec les MSForms declares comme Shape, en fait en OleObject je n'ai pas trouvé.
Mais dans ce cas on peut se contenter en effet de travailler avec les ID, ce qui nous donne le petit bout ci-dessous :
Dim newBtn As Visio.Shape
Dim shpCommandButtonShape As Visio.Shape
Set newBtn = Application.ActiveWindow.Page.InsertObject("{D7053240-CE69-11CD-A777-00DD01143C57}", visInsertAsControl + visInsertNoDesignModeTransition)
myId2 = newBtn.ID
Set shpCommandButtonShape = pagThisPage.Shapes.ItemFromID(myId2)
shpCommandButtonShape.Data1 = "BoutonDor" ' Pour entrer la valeur BoutonDor dans le champs Data1 par exemple
Voila comme ca vous avez 2 soluces et c'est mieux qu'une ^^
LastFlush
Messages postés11Date d'inscriptionsamedi 13 janvier 2007StatutMembreDernière intervention 9 juin 2009 9 juin 2009 à 19:23
Bonjour Wil,
Je ne travaille plus sur Visio depuis quelques mois déjà, je pense qu'il faut commencer par chercher le moyen de différencier un shape (une forme) propre à Visio des boutons MSOffice, créez un bouton et une forme et comparez les différences entre les 2, avec un clic droit vous devez avoir accès aux propriétés ainsi qu'au panel "Show ShapeSheet" (je ne me rappelle plus du terme en Francais).
Je n'ai vraiment pas le temps de me pencher davantage sur votre question désolé (Visio désinstallé), mais si vous arrivez à les différencier il sera alors possible de boucler dessus comme expliqué ci-dessus et de rechercher LE critère qui fait la différence.