VBA : Créer un controle du type MSForms et le nommer automatiquement ou prendre [Résolu]

Messages postés
11
Date d'inscription
samedi 13 janvier 2007
Dernière intervention
9 juin 2009
- 16 juin 2008 à 21:15 - Dernière réponse :
Messages postés
8
Date d'inscription
vendredi 2 mai 2008
Dernière intervention
29 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.

Je vous remercie beaucoup.

LastFlush
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
11
Date d'inscription
samedi 13 janvier 2007
Dernière intervention
9 juin 2009
19 juin 2008 à 17:54
3
Merci
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

Ajouter votre CommandButton
Application.ActiveWindow.Page.InsertObject "{D7053240-CE69-11CD-A777-00DD01143C57}", visInsertAsControl + visInsertNoDesignModeTransition

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")
   
   celPinX.Formula = 2
   celPinY.Formula = 2
   celWidth.Formula = 1.75
   celHeight.Formula = 0.25
  
End Sub

En espérant que cela en aide quelques uns, bon weekend à tous.

Merci LastFlush 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de LastFlush
Meilleure réponse
Messages postés
11
Date d'inscription
samedi 13 janvier 2007
Dernière intervention
9 juin 2009
26 juin 2008 à 17:51
3
Merci
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 ^^

@+

Merci LastFlush 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de LastFlush
Messages postés
11
Date d'inscription
samedi 13 janvier 2007
Dernière intervention
9 juin 2009
17 juin 2008 à 10:55
0
Merci
Re à tous,

pour info j'ai testé l'exemple de Microsoft : http://msdn.microsoft.com/en-us/library/aa221688(office.11).aspx

Worksheets(1).OLEObjects.Add ClassType:= "Forms.CommandButton.1", _
    Link:=False, DisplayAsIcon:=False, Left:=40, Top:=40, _
    Width:=150, Height:=10


Je l'ai adpaté à Visio comme ceci :

ActiveDocument.OLEObjects. Add  ClassType: ="Forms.CommandButton.1", _
    Link:= False, DisplayAsIcon:=False, Left:=40, Top:=40, _
    Width:=150, Height:=10



Sans succès :/
Je l'ai également réduit à :
ActiveDocument.OLEObjects. Add  ClassType: ="Forms.CommandButton.1"



Idem, j'ai toujours la même erreur : " Run-Time error 438 : Object doesn't support this property or method"

Je  sèche 
Commenter la réponse de LastFlush
Messages postés
9
Date d'inscription
mardi 9 juin 2009
Dernière intervention
24 juillet 2009
9 juin 2009 à 15:24
0
Merci
Bonjour,

J ai une autre problematique, je souhaiterais lister les boutons (coordonnes et longueur) pensez vous que c est possible ?

merci pour votre aide
Commenter la réponse de wil3164
Messages postés
11
Date d'inscription
samedi 13 janvier 2007
Dernière intervention
9 juin 2009
9 juin 2009 à 19:23
0
Merci
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.

good luck
Commenter la réponse de LastFlush
Messages postés
8
Date d'inscription
vendredi 2 mai 2008
Dernière intervention
29 juillet 2010
21 juil. 2010 à 15:19
0
Merci
Bonjour,
comment je peux parcourir le contenu d'un shipe sous visio??
marci d'avance
Commenter la réponse de cs_unique07

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.