Lister les Shapes
bien le bonjour,
J'ai fais un petit UserForm ou il y a un ComboBox ou je liste quelques Shapes.
Mon souci est quand je choisi ma forme de shapes on m'annonce une erreur "Incompatible type & erreur d'éxécution 13"
Private Sub UserForm_Initialize()
'Liste quelques une des formes shapes
With Me.ComboBox5
.AddItem "msoShapeRectangle"
.AddItem "msoShapeParallelogram"
.AddItem "msoShapeTrapezoid"
.AddItem "msoShapeDiamond"
.AddItem "msoShapeRoundedRectangle"
.AddItem "msoShapeOctagon"
.AddItem "msoShapeIsoscelesTriangle"
.AddItem "msoShapeRightTriangle"
.AddItem "msoShapeOval"
.AddItem "msoShapeHexagon"
.AddItem "msoShapeCross"
.AddItem "msoShapeRegularPentagon"
.AddItem "msoShapeCan"
.AddItem "msoShapeCube"
.AddItem "msoShapeBevel"
.AddItem "msoShapeFoldedCorner"
.AddItem "msoShapeSmileyFace"
.AddItem "msoShapeDonut"
.AddItem "msoShapeNoSymbol"
.AddItem "msoShapeBlockArc"
.AddItem "msoShapeHeart"
.AddItem "msoShapeLightningBolt"
.AddItem "msoShapeSun"
.AddItem "msoShapeMoon"
.AddItem "msoShapeArc"
.AddItem "msoShapeDoubleBracket"
.AddItem "msoShapeDoubleBrace"
.AddItem "msoShapePlaque"
End With
End Sub
Private Sub ComboBox5_Change()
If Me.CheckBox6.Value = True Then Call CreerShapes
End Sub
sub CreerShapes
With ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 40, 80, 140, 50)
'Partie Nom du Shapes
.Name = "NomShape"
'Partie Visible
If Me.CheckBox6.Value = False Then
.Visible = False
Else
.Visible = True
End If
'Partie Forme
'Type de Forme
If Me.ComboBox5.Value = Empty Then
.AutoShapeType = msoShapeRoundedRectangle
Else
.AutoShapeType = Me.ComboBox5.Value
End If
end subJe comprend pas le problème. A place de Me.ComboBox5.Value j'ai essayer de créer une variable de se type "TypesShapes As MsoShapeType" mais pareil.
Si vous avez une petite idée je suis preneur. merci a vous
Bonjour,
L'explication est simple !
Tu envoies à la méthode AddShape une telle valeur String, alors qu'elle attend la valeur d'une constante prédéfinie qui elle est numérique ! Il y a donc bien à l'évidence une incompatibilité de type !
Je ne vois pas trop l'intérêt de ce que tu fais, surtout que la suite est chaotique : donner le même nom ça n'a pas de sens, cela te provoquera des erreurs, le définir dans une TextBox serait mieux !, définir les valeurs booléennes de propriétés de la forme serait mieux adapté au moyen de CheckBox plutôt que de TextBox, etc. Et il conviendrait de définir aussi les dimensions et le positionnement dans ton Userform...
Et ta façon de définir une valeur par défaut est quelque peu alambiquée...
Mais selon le but recherché, il peu être intéressant de générer des formes à partir d'une sélection en Combo...
Donc moyen de procéder dans le cas général :
Déclarer niveau module (du Userform) une variable (type Variant), par exemple : Dim shT
Dans l'Initialize, affecter un tableaux des constantes voulues :
shT= Array(msoShapeRoundedRectangle, msoShapeRectangle, msoShapeParallelogram, ....Ça va être assez long mais pas grave...
Dans la liste du combo tu n'es plus obligé de reprendre les noms de constantes, tu peux te contenter de désignations simples : Rectangle, Parallélogramme...
Ta proc. de création de Shape doit être dotée d'un argument :
Sub CreerShape(shType)
With ActiveSheet.Shapes.AddShape(shType, 40, 80, 140, 50)NB- les proc. hors évènements des contrôles se placent conventionnellement en tête du module à la suite des déclarations (zone "Général")... C'est toujours mieux de respecter les règles conventionnelles.
Et ton Combo_Change :
Private Sub ComboBox1_Change()
Dim n%
n = ComboBox1.ListIndex + 1
CreerShape shT(n)
End SubAinsi, si sélection tu lances la création de la forme définie, et si non sélection, ce sera la forme par défaut.
Mais dans ton cas particulier, une autre possibilité plus simple, qui tient au fait que les valeurs des constantes que tu as listées forment une série numérique continue à partir de 1 !
Tu peux donc comme précédemment définir une liste de noms plus conviviaux (d'ailleurs, dresser une liste sur une feuille et affecter la plage à la propriété RowSource simplifiera ton code, tu n'auras plus besoin d'Initialize...)
A ce moment là, la Combo_Change devient :
Private Sub ComboBox1_Change()
Dim shT
shT = ComboBox1.ListIndex + 1
If shT = 0 Then shT = 5
CreerShape shT
End SubTu utilises directement l'index de sélection qui correspond à la constante de type de forme. Et si pas de sélection (0) tu remplaces par la valeur de l'index de ta forme par défaut...
Pas de changement pour la procédure de création...
Cordialement.
Bonjour
Merci MFerrand pour ton aide tu me sort une belle épine du pied.
Je suis autodidacte du coup j'ai du mal encore mais j'avance doucement mais surement.
Merci encore MFerrand d'avoir pris le temps de me répondre et d'avoir pris le temps de bien expliquer