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 sub

Je 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 listes des noms de constantes d'énumération msoAutoShapeType sous forme de données String.

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... Note que tu as mis en élément 0 de ton tableau, ta forme par défaut.

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 Sub

Ainsi, 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 Sub

Tu 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

Rechercher des sujets similaires à "lister shapes"