VBA Dimensions Forme Import

Bonjour,

ci-joint mes deux problèmes...

1 - Je souhaite, lorsque je crée une nouvelle forme avec le bouton 3, que le numéro du "panneau" augmente de +1. En gros si j'en crée deux il faut que chaque panneaux est son numéro "Panneau 1" & "Panneau 2" par exemple.

2- Je souhaite, en activant la macro du bouton 4, importé le nom de chaque forme et sa dimension sur la feuil2. J'ai trouvé une macro qui récupère ces valeurs. Mais j'ignore comment faire une boucle et sauter les lignes pour chaque forme...

Merci pour votre aide!

9isolant.xlsm (27.69 Ko)

Bonjour,

Tu parcours les formes au moyen d'une boucle For Each... Next, et tu comptes les "panneau". Tu ajoutes 1 pour numéroter le suivant.

Le mieux serait d'ailleurs de les compter à l'ouverture, conserver le nombre dans une variable Module et l'incrémenter à chaque création.

Quant au listage des dimensions sur une autre feuille, tu peux le faire lors de la création de la forme, cela paraît le plus pratique.

Qu'entends-tu par sauter les lignes pour chaque forme ?

Cordialement.

"Sauter les lignes" pour compléter le tableau des dimensions.

En revanche j'ai besoin que le tableau soit fait en une seul fois, parceque la forme peut changer de dimension ou être supprimé.

Peux tu m'indiquer les macros...? Je suis novice sur VBA ^^

Il faudrait que tu places tes boutons, qui ne figurent pas dans ton fichier, que tu indiques comment tu disposes tes formes sur la feuille lors de la création.

Cordialement.

Les formes peuvent bouger...Après je ne comprend pas trop tes consignes? Quel est le but?

Tu fais référence à des boutons, il faudrait donc que le bouton de création de formes figure, de façn qu'on sache quel type de bouton tu choisis et qu'on puisse ajuster le code en conséquence.

Les formes créées, tu entends bien les mettre quelque part lorsque tu les crées, à moins de les empiler rigoureusement au même endroit, il faut donc déterminer une règle à appliquer pour les positionner les unes par rapport aux autres, positionnement qu'on pourra le cas échéant calculer à partir du numéro d'ordre, selon tes choix.

Lister les formes sur Feuil2 ne pose pas de problème, et si on les liste au fur et à mesure de la création, on n'a plus besoin de second bouton.

Cordialement.

Tu peux regarder mon fichier directement c’est plus simple ^^

J'ai trouvé tes boutons !

Si ta philosophie est de conserver des boutons loin de la zone normalement affichée, je dois dire que je ne la partage pas.

Cela laisse entière la question suivante : tes macros empilent les formes les unes sur les autres. Si c'est volontaire, après tout pourquoi pas ? Mais il serait bon de le confirmer.

Par ailleurs les Prémur ne sont pas numérotés : comme on peut de la même façon en créer autant qu'on veut qui s'empileront, avec toutes le même nom... il serait bon de clarifier la situation.

Pour ce qui est des macros, il y a quelques épurations à faire, surtout des variables systématiquement non déclarées , et s'agissant de ValeurForme, je n'en comprends strictement pas la signification... De toutes façons elle est gratuite et n'a aucun effet, mais qu'est-ce qui pouvait bien être recherché ?

Cordialement.

Merci pour tes réponses !

Alors oui les positions des boutons est à revoir...Mais la n'est la sujet ^^

Pour faire simple la forme "Prémur" est unique et il faut en réaliser une seul. Les formes "Panneaux" peuvent être plusieurs et elles se superpose à la forme "Prémur". L’objectif est de couvrir toute la superficie de la forme "Prémur" avec des forme "Panneau" qui sont déplacé par le technicien (comme un LEGO ^^).

Pas besoin de numéro pour la forme "Prémur".

Pour les macros... je commence petit à petit à les comprendre.Il y a tellement de solution pour un même résultat.

La macro "ValeurForme" est un test que j'ai trouvé sur internet pour obtenir les dimensions des formes utilisées. Après si tu as une autre technique et qui importe dans le tableau en Feuil2 je suis preneur.

Merci!

Re,

Je ne suis pas sûr de comprendre où tu veux exactement aller !

Arrangement de la proc. FormePrémur

Sub FormePremur()
    Dim Lmm!, Hmm!, Lpx!, Hpx!, PHpx!, PVpx!, Msg$, Ttr$, Pmur As Shape
    On Error Resume Next
    Set Pmur = ActiveSheet.Shapes("Prémur")
    If Not Pmur Is Nothing Then
        If MsgBox("Voulez-vous créer un nouveau Prémur pour remplacer l'existant ?", _
         vbYesNo + vbQuestion, "Prémur en place !") = vbYes Then Pmur.Delete Else Exit Sub
    End If
    On Error GoTo 0
    Msg = "Entrez la largeur" & Chr(10) & "(en m)"
    Ttr = "Largeur d'une forme automatique"
    Lmm = Val(InputBox(Msg, Ttr))
    If Lmm = 0 Then
        MsgBox "Largeur non saisie !", vbInformation, "Annulation"
        Exit Sub
    End If
    Msg = Replace(Msg, "largeur", "hauteur")
    Ttr = Replace(Ttr, "Largeur", "Hauteur")
    Hmm = Val(InputBox(Msg, Ttr))
    If Hmm = 0 Then
        MsgBox "Hauteur non saisie !", vbInformation, "Annulation"
        Exit Sub
    End If
    Lpx = Lmm * 2.835 * 100
    Hpx = Hmm * 2.835 * 100
    PHpx = 20 * 2.835
    PVpx = 20 * 2.835
    With ActiveSheet.Shapes.AddShape(msoShapeRectangle, PHpx, PVpx, Lpx, Hpx)
        .Name = "Prémur"
        .TextFrame.Characters.Text = "Dimensions Prémur :" & Chr(10) _
         & "Hauteur = " & Hmm & " m" & Chr(10) & "Largeur = " & Lmm & " m"
        .Fill.ForeColor.RGB = RGB(119, 136, 153)
        .Line.ForeColor.RGB = vbBlack
    End With
    InscrireForme Array("Prémur", Lmm, Hmm)
End Sub

Pas de correction de code, il est parfaitement écrit, j'ai ajouté :

1) un test sur l'existence d'une forme Prémur, si déjà existante demande à l'utilisateur s'il veut la remplacer, si c'est le cas on supprime l'ancienne et la proc. se poursuit,

2) test sur les saisies de largeur et hauteur, si clic sur Annuler, la dimension n'est pas saisie, on signale et on sort,

3) inscription sur la feuille 2 par une proc. annexe (voir ci-après).

Pour FormeIsolant : quelques corrections (à voir dans le code) et ajouts :

1) une variable Pnn (déclarée niveau module) sert à consigner le nombre de "Panneau" : en début de procédure, si cette variable est à zéro, on vérifie et l'incrémente à partir des "Panneau" trouvés,

2) lors de la création de la forme on incrémente la variable pour pouvoir nommer le nouveau "Panneau",

3) inscription de la forme par une procédure annexe (voir ci-après).

Sub FormeIsolant()
    Dim Pn As Shape, Lpx!, Hpx!, PHpx!, PVpx!
    If Pnn = 0 Then
        For Each Pn In ActiveSheet.Shapes
            If Pn.Name Like "Panneau*" Then Pnn = Pnn + 1
        Next Pn
    End If
    Lpx = 1.2 * 2.835 * 100
    Hpx = 2.25 * 2.835 * 100
    PHpx = 500 * 2.835
    PVpx = 10 * 2.835
    With ActiveSheet.Shapes.AddShape(msoShapeRectangle, PHpx, PVpx, Lpx, Hpx)
        Pnn = Pnn + 1
        .Name = "Panneau " & Pnn
        With .TextFrame
            .HorizontalAlignment = xlHAlignCenter
            .VerticalAlignment = xlVAlignCenter
            With .Characters
                .Text = "Panneau " & Pnn
                With .Font
                    .Name = "Arial": .Size = 12: .Bold = True
                End With
            End With
        End With
        With .Fill
            .ForeColor.RGB = RGB(192, 192, 192)
            .Transparency = 0.5
        End With
        .Line.ForeColor.RGB = vbBlack
    End With
    InscrireForme Array("Panneau " & Pnn, 1.2, 2.25)
End Sub

La procédure d'inscription :

Sub InscrireForme(DimForm)
    Dim n%
    If DimForm(0) = "Prémur" Then
        n = 2
    Else
        n = Val(Replace(DimForm(0), "Panneau", "")) + 2
    End If
    Worksheets(2).Cells(n, 1).Resize(, 3) = DimForm
End Sub

Les données à inscrire lui sont passées sous forme d'un tableau de 3 valeurs. Le premier élément en est le nom de la forme. Elle inscrit systématiquement Prémur en ligne 2 et les panneaux dans l'ordre sur les lignes suivantes (ligne calculée selon le numéro de panneau).

J'ai opté pour cette façon de faire pour que l'inscription de Prémur soit mise à jour au même emplacement si on le remplace, et parce que les panneaux sont tous identiques sauf le numéro.

J'ai aussi ajouté une proc. d'effacement, qui élimine les formes et les inscriptions.

Sub Effacer()
    Dim shp As Shape
    For Each shp In ActiveSheet.Shapes
        If shp.Name = "Prémur" Or shp.Name Like "Panneau*" Then shp.Delete
    Next shp
    Worksheets(2).Range("A1").CurrentRegion.Offset(1).ClearContents
End Sub

Cordialement.

MERCI!

Il y a juste un petit problème pour les dimensions des panneaux...en effet les dimensions des panneaux peuvent changer en fonction de la modif. du technicien. (exemple en PJ).

Il faudrait...ou faire un bouton "Import des panneaux" et en gros on récupère les dimensions de chaque panneau à l'activation de la macro.

Ou bien faire qlqc qui se modifie automatiquement.

De plus, est ce possible de supprimer un panneau (exemple le n°2) et ensuite lorsqu'on rajoute un panneau de reprendre le numéro 2 et pas le 3.

Encore merci pour ta patience, on y est presque ^^

Où est la PJ ?

Si les dimensions sont définies quelque part, on les prendra à cet endroit !

Oups...

Et pour la suppression des panneaux?

Les dimensions des panneaux étaient codés en dur dans la macro : 1,20 x 2,25.

Si tu veux individualiser chaque panneau, il fallait une procédure du même type que pour Prémur.

En modifiant les dimensions manuellement, que veux-tu faire ?

Je ne prélèverai pas les dimensions par télépathie ! Il faut donc définir et suivre une ligne de conduite rationnelle qui permette de savoir ce qu'on fait !

Pour la numérotation on verra ensuite, selon les modifs à apporter. Pour l'instant je dois sortir...

Est ce possible d'avoir la forme prémur tjr en arrière plan?

Concernant ta réponse, les panneaux "Standard" font comme dimensions 2,25x1.2. En revanche un panneau peut avoir n'importe qu'elle dimensions ce sont les "Batards".

Du coup il y aura tjr des "Batards" avec des dimensions variables. Ces dimensions variable sont modifiées manuellement lorsqu'on redimensionne la forme d'un panneau.

Du coup, je pense qu'il est préférable de faire un "Import" lorsqu'on a tous nos panneaux.

J'attend ta réponse, encore merci...

Les dimensions des panneaux étaient codés en dur dans la macro : 1,20 x 2,25.

Si tu veux individualiser chaque panneau, il fallait une procédure du même type que pour Prémur.

En modifiant les dimensions manuellement, que veux-tu faire ?

Je ne prélèverai pas les dimensions par télépathie ! Il faut donc définir et suivre une ligne de conduite rationnelle qui permette de savoir ce qu'on fait !

Pour la numérotation on verra ensuite, selon les modifs à apporter. Pour l'instant je dois sortir...

Disponible aujourd'hui?

Bonjour,

Je pense qu'il te faut laisser de côté l'idée de modifications manuelles des formes de panneaux, et passer par des modifications assistées, où la modif elle-même sera réalisée par programme sur validation de nouvelles dimensions.

Ce qui conduirait à :

1) Une mise en place initiale de formes : un Prémur (à dimensions définies par l'utilisateur), des panneaux standard (aux dimensions connues, il suffirait donc d'en indiquer le nombre), panneaux non standard (dont dimensions également à définir par panneaux), ce qui plaiderait pour un Userform regroupant toutes les indications de l'utilisateur pour générer la situation initiale.

2) La possibilité de suppressions de panneaux (pas du Prémur, s'il doit toujours y en avoir un on ne peut que le modifier, sauf à tout supprimer pour réinitialiser). Dispositif (bouton ?) à définir pour déclencher la suppression d'un panneau.

3) La modification de dimensions de tel ou tel élément : Prémur, ou Panneaux : un Userform listerait les éléments, l'utilisateur y indiquerait quels éléments sont à modifier et quelles modifications. Outre les dimensions, on peut y prévoir la possibilité de renumérotation selon les choix de l'utilisateur.

Ce qui demande un peu plus de temps de réalisation... et étant assez occupé par ailleurs aujourd'hui et demain, je ne bouclerai pas tout ça d'une seule traite !

Mais je ne démarrerai pas tant que tu n'auras pas validé un processus global réalisable. Je ne me suis pas non plus penché sur l'utilisation qui semble consister à opérer des simulations en recouvrant le Prémur de panneaux : on peut envisager là-aussi un dispositif d'assistance pour positionner les panneaux, plus vite et plus précisément qu'on ne peut le faire manuellement...

Cordialement.

Tu me vends du rêve!!

1) Oui l'objectif est de remplir la forme "Prémur" avec les panneaux. Les panneaux doivent correspondre au maximum au STANDARD et ensuite créer des batards qui "remplisse les vides" sans dépasser la dimension d'un panneau "Standard".

Les batards doivent être crée manuellement pour remplir les vides. Sauf..si tu connais une méthode pour que le remplissage se fasse automatiquement et la...c'est vrmt le jackpot!!

2) Oui un bouton pour tout supprimer et surtout réinitialiser le compteur des panneaux.

3)Oui très bonne idée (sauf si tout est fait automatique comme énoncé au point 1), en revanche il y aura tjr un seul prémur ^^.

Surtout ne pas oublier le panneau résumé qui récupéré les valeurs de chaque panneau. Et si possible...indiquer la quantité des panneaux "Standard" et des "batards".

Voila voila je valide tes idées

Encore MERCI pour ta disponibilité tu m'aides énormément!

J'attend ta réponse ^^

J'enregistre ! Je reviendrai avec des propositions plus précises, mais délai car là je vais devoir passer à des activités d'une autre nature...

Bonne journée.

D'accord pas de soucis ahahha

A plus!

Rechercher des sujets similaires à "vba dimensions forme import"