VBA excel insertion resultat inputbox

Bonjour a tous,
j essaie de me mettre au langage VBA mais pou ne rien vous cacher, j ai du mal. J ai rentre quelque ligne de programmation mais ca ne marche pas comme je voudrai.
D une part quand j execute une deuxieme fois ma macro, la premiere ligne est effacee.
De plus ( je n y suis pas ecore arrive a cause de mon premier probleme) je souhaiterai que les donnes rentree par le biais de mon inputbox soient supprimees quand je supprime la forme associee. En plus je souhaiterai que les cellules contenant les donnees soient elles aussi supprimees pour que les cellules suivantes soient elles remontee d un cran.
Voila en gros mon probleme, j espere m etre assez bien exprime et que j interesserai des pros...
Merci de votre attention
Charluche, le neuneu du VBA
PS voici le code tape:

Sub Conteneur()
'ajout de titres pour coordonnées
Range("D1").Select
ActiveCell.FormulaR1C1 = "Hauteur"
Range("E1").Select
ActiveCell.FormulaR1C1 = "Poids"
'cellule de reference
Range("C1").Select
Ligne = 1
Colonne = 1
'Informations sur le conteneur
Longueur = InputBox("Longueur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Longueur du conteneur", "1")
Largeur = InputBox("Largeur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Largeur du conteneur", "1")
Hauteur = InputBox("Hauteur du conteneur en metre, cette hauteur sera automatiquement ponderee du coefficient 2/3 pour le calcul du KG.", "Hauteur du conteneur")
Poids = InputBox("Poids du conteneur en tonnes.", "Poids du conteneur")
ActiveCell.Offset(Ligne, Colonne) = Hauteur
ActiveCell.Offset(Ligne, Colonne + 1) = Poids

Ligne = Ligne + 1
'dessin de la forme
Set myDocument = Worksheets(1)
With myDocument.Shapes
With .AddShape(msoShapeRectangle, 5, 5, Longueur, Largeur)

End With
End With
End Sub
Configuration: Windows Vista
Internet Explorer 7.0

17 réponses

  1. Salut,

    Il est trés difficile de répondre car tu exposes les problémes sans expliquer le but de ton programme et dans quel cadre il doit être utilisé.
    Le bout de VBA que tu transmets, qu'est il censé faire?

    A+

    Rv
    1. En fait je souhaite dessiner des conteneurs sur in pont de bateau,
      cette macro dessine des formes rectangulaires (comme un conteneur) et affiche le poids et la hauteur du colis popur un futur calcul de barycentre. en fait j ai une autre macro qui me calcule les coordonnees du centre de la feuillle et cette derniere fait la forme et me donne la hauteur et le poids.
      J espere etre assez precis?
      Merci de ton interet.
      Charluche
      1. En fait voici toute les macro:
        Sub macrobateau()

        'selection premier onglet par defaut
        Set myDocument = Worksheets(1)

        'nettoyage des colonnes B et C des coordonnées existantes
        Columns("B:C").Select
        Selection.ClearContents
        'ajout de titres pour coordonnées
        Range("B1").Select
        ActiveCell.FormulaR1C1 = "centreX"
        Range("C1").Select
        ActiveCell.FormulaR1C1 = "centreY"
        'cellule de reference
        Range("A1").Select
        Ligne = 1
        Colonne = 1
        'routine pour toutes les formes présentes sur la feuille(boucle qui scrute les formes)
        For Each sh In myDocument.Shapes
        If sh.Type = msoAutoShape Then
        sh.Select
        x = Windows(1).Selection.ShapeRange.Left
        y = Windows(1).Selection.ShapeRange.Top
        lo = Windows(1).Selection.ShapeRange.Width
        la = Windows(1).Selection.ShapeRange.Height
        ' calcul du centre par rapport au coordonnees récupérées
        centreX = x + (lo / 2)
        centreY = y + (la / 2)

        ActiveCell.Offset(Ligne, Colonne) = centreX
        ActiveCell.Offset(Ligne, Colonne + 1) = centreY

        Ligne = Ligne + 1

        End If

        Next
        End Sub

        Sub Conteneur()
        'ajout de titres pour coordonnées
        Range("D1").Select
        ActiveCell.FormulaR1C1 = "Hauteur"
        Range("E1").Select
        ActiveCell.FormulaR1C1 = "Poids"
        'cellule de reference
        Range("C1").Select
        Ligne = 1
        Colonne = 1
        'Informations sur le conteneur
        Longueur = InputBox("Longueur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Longueur du conteneur", "1")
        Largeur = InputBox("Largeur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Largeur du conteneur", "1")
        Hauteur = InputBox("Hauteur du conteneur en metre, cette hauteur sera automatiquement ponderee du coefficient 2/3 pour le calcul du KG.", "Hauteur du conteneur")
        Poids = InputBox("Poids du conteneur en tonnes.", "Poids du conteneur")
        ActiveCell.Offset(Ligne, Colonne) = Hauteur
        ActiveCell.Offset(Ligne, Colonne + 1) = Poids

        Ligne = Ligne + 1
        'dessin de la forme
        Set myDocument = Worksheets(1)
        With myDocument.Shapes
        With .AddShape(msoShapeRectangle, 5, 5, Longueur, Largeur)

        End With
        End With
        End Sub

        Je ne sais pas si c est vraiment digeste mais bon ca donne un idee peut etre un peu plus precise. Le but est d utiliser la deuxieme macro pour dessiner des colis et rentrer les coordonnes du centre de gravite en hauteur et son poids (coeff pour ponderer dans l'optique du calcul de barycentre) dans la feuille de calcul. Une fois la forme dessinee et les info retree, la premiere macro calcul le centre de gravite de la forme dans un repere x,y. Ces deux dernieres donnees seront elles aussi utilisees pour le calcul du barycentre.
        Les problemes sont donc les suivants:
        Quand je rajoutre une deuxieme forme, les poids et hauteur de la preniere forme sont effaces.
        Si je supprime une forme parmis d autre, je voudrai que les infos (poids et hauteur) soient aussi supprimees pour qu il y est correspondance entre les resultats des 2 macros.
        Voila, encore toute mes excuses pour les manques d information et mille merci pour ton interet
        Charluche.
        1. Bonjour,

          voici un premier nettoyage de la première routine soumise !

          Sub Conteneur()
          
              Dim myDocument As Worksheet
              Dim Ligne As Long, Colonne As Long
              Dim Longueur As Long, Largeur As Long
              Dim Hauteur As Long, Poids As Long
          
              ' Ajout de titres pour coordonnées
              Range("D1:E1") = Array("Hauteur", "Poids")
              ' Cellule de reference
              Range("C1").Select
              ' Initialisation des compteurs
              Ligne = 1: Colonne = 1
          
              ' Informations sur le conteneur
              Longueur = InputBox("Longueur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Longueur du conteneur", "1")
              Largeur = InputBox("Largeur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Largeur du conteneur", "1")
              Hauteur = InputBox("Hauteur du conteneur en metre, cette hauteur sera automatiquement ponderee du coefficient 2/3 pour le calcul du KG.", "Hauteur du conteneur")
              Poids = InputBox("Poids du conteneur en tonnes.", "Poids du conteneur")
              ActiveCell.Offset(Ligne, Colonne) = Hauteur
              ActiveCell.Offset(Ligne, Colonne + 1) = Poids
              Ligne = Ligne + 1
              
              ' Dessin de la forme
              Set myDocument = Worksheets(1)
              With myDocument.Shapes
                  .AddShape msoShapeRectangle, 5, 5, Longueur, Largeur
              End With
              Set myDocument = Nothing
          
          End Sub
          '
          


          Lupin
          1. Bonjour Lupin,
            tout d abord, je te remercie de te pencher sur mon probleme.
            Je viens de tester ta solution et visiblement ca ne fonctionne pas. Peut etre est ce comme tu dis un nettoyage, auquel cas je te remercie car je fais vraiment du bricolage et ta version m'apprend de nouvelle commandes. Le cas echeant, quand je dessine une deuxieme forme, les poids et hauteurs de la premiere sont effaces.
            Dans tous les cas, je te remercie grandement pour ton interet.
            Charluche.
            1. re:

              qu'est-ce qui ne fonctionne pas ???

              Chez moi la macro vire correctement en donnant la valeur 10 à toutes les questions.

              Lupin
              1. chez moi seules les celllules d2 et e2 se remplissent quand j execute plusieurs fois la macro alors que je souhaiterai que les caes d3 et e3 se remplissent aussi...
                je ne comprends pas non plus.
                merci quand meme
                charlche
                1. re:

                  si je comprend le problème ...

                  La variable Ligne est initialisé à 1

                  Ligne = 1

                  ce qu'il faut c'est de déclarer la variable en static

                  au lieu de :

                  Dim Ligne As Long

                  déclare comme suit :

                  Static Ligne As Long

                  Au premier passage, [ Ligne = 0 ], donc au lieu d'incrémenter en fin de routine, on fait
                  l'incrémentation au début :

                  Ligne = ( Ligne + 1)

                  ainsi, on obtient :

                  Sub Conteneur()
                  
                      Static Ligne As Long
                  
                      ' Ajout de titres pour coordonnées
                      Range("D1:E1") = Array("Hauteur", "Poids")
                      ' Cellule de reference
                      Range("C1").Select
                      ' Initialisation des compteurs
                      Ligne = (Ligne + 1): Colonne = 1
                  
                      ' Informations sur le conteneur
                      Longueur = InputBox("Longueur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Longueur du conteneur", "1")
                      Largeur = InputBox("Largeur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Largeur du conteneur", "1")
                      Hauteur = InputBox("Hauteur du conteneur en metre, cette hauteur sera automatiquement ponderee du coefficient 2/3 pour le calcul du KG.", "Hauteur du conteneur")
                      Poids = InputBox("Poids du conteneur en tonnes.", "Poids du conteneur")
                      ActiveCell.Offset(Ligne, Colonne) = Hauteur
                      ActiveCell.Offset(Ligne, Colonne + 1) = Poids
                      
                      ' Dessin de la forme
                      Set myDocument = Worksheets(1)
                      With myDocument.Shapes
                          .AddShape msoShapeRectangle, 5, 5, Longueur, Largeur
                      End With
                      Set myDocument = Nothing
                  
                  End Sub
                  '

                  Lupin
                  1. Ca y est ca fonctionne!!!!
                    En revanche je veux pas etre lourd mais crois tu que c possible d associer la forme avec les donnees qui sont entrees avec?
                    Je m explique. Si je rentre un conteneur et que ce conteneur doit etre retire, est il possible qu en selectionnant la forme et en la supprimant, ca supprime aussi les cases poids et hauteur cad dire que les lignes du dessous soit automatiquement remontees?
                    Charluche.
                    1. Pour etre plus precis, il faudrait que par exemple, si je supprime la 10eme forme les cellules E11 et D11 soient supprimees. De cette maniere, la 11eme forme aurait alors sa hauteur et son poids en D11 et E12. Cela donnerai une coherence avec la deuxieme macro que tu trouveras plus haut.
                      Merci
                      charluche.
                      1. re:

                        je ne connais pas les évènements "souris", tout ce que je
                        cannais est le "trappeur" "SelectionChange", permettant
                        de vérifier s'il s'agit ou non d'un objet de la collection.
                        En plus pour retenir la position de chaque ligne sachant
                        qu'elle celle-ci peut-être détruite, il faut lire constament
                        la position et non-la définir par une variable statique.

                        je n'ai pas le code sous la main, de toute façon il faudra
                        travailler en dynamique sur la position d'écriture, alors fait
                        plutôt ainsi :

                        Sub Conteneur()
                            
                            Dim myDocument As Worksheet
                            Dim Ligne As Long, Colonne As Long
                            Dim Longueur As Long, Largeur As Long
                            Dim Hauteur As Long, Poids As Long
                        
                            ' Initialisation des compteurs
                            Colonne = 1
                            ' Ajout de titres pour coordonnées
                            Range("D1:E1") = Array("Hauteur", "Poids")
                            ' Capture la position d'écriture
                            Ligne = Range("D2:D65536").End(xlDown).Row
                            ' Cellule de réference ' Accentué dans commmentaire seulement
                            Range("C1").Select
                            ' Je recommande plutôt [A1].Select
                            ' Les commandes [ Activecell.Offset(0,0)... ]
                            ' deviennent [ Cells(1,1)... ]
                            '  ( Activecell.Offset ~ Cells )
                            
                            ' Informations sur le conteneur
                            ' ...
                            
                            ' Dessin de la forme
                            Set myDocument = Worksheets(1)
                            With myDocument.Shapes
                                .AddShape msoShapeRectangle, 5, 5, Longueur, Largeur
                            End With
                            Set myDocument = Nothing
                        
                        End Sub
                        '
                        


                        Lupin
                        1. Lupin,
                          je te remercie de tes conseils. Seulement mon niveau en vba etant proche du zero, voire nul, sais tu ou je pourrai trouver de l aide pour mettre en forme tes idees?
                          Charluche.
                          1. re:

                            Je n'ai pas beaucoup de temps sur le moment, mais je peut essayer de te pondre un début de solution.

                            Tout d'abord, quelques questions, pour connaître tes connaissances :

                            1.) Connais-tu l'enregistreur de macro ?
                            2.) Connais-tu l'éditeur VBE ?
                            3.) Est-tu familière la programmation orienté objet ?
                            4.) Connais-tu VB, seulement VB et pas VBA ?

                            Je te reviens avec un début de code !

                            Cordialement

                            Lupin
                            1. Pour etre franc avec toi, je te repondrai que je ne connais que l enregistreur de macro!!! Pour le reste js suis une truffe finie, je me debrouille avec les aides de office. Comme tu as pu le constater ca ne donne pas des resultats mirobolants. Ca ne fait qu une semaine que je suis avec vba. L enregistreur de macro je ne le faisait aue pour des trucs bidons style imprimer ou mettre en forme des cellules en cliquant sur un bouton, rien de trascendant quoi.
                              Merci de ton interet.
                              Charluche.
                              1. Bonjour,

                                après quelques tests, je n'arrive pas à capturer l'évènement de sélection sur un [ shape ].

                                ce qui complique de beaucoup la question. Je vais penser à tous ça et si je trouve une
                                solution je te reviens avec !

                                Lupin
                                1. Merci Lupin,
                                  c est vraiment gentil de ta part de t occuper ainsi de mon cas car du fait de mes competences, je suis completement bloque.
                                  Merci
                                  Charluche.
                                  1. Bonjour charluche,

                                    voici donc un premier jet de ce que j'ai pu faire ...

                                    Ne pouvant capturer l'évènement Select de la Shape, j'ai lié celle-ci a une cellule, et
                                    lorsque tu clique sur cette cellule, la ligne et la shape correspondante sont effacer.

                                    http://membre.oricom.ca/lupin/documents/ex_ajout_shapes.zip
                                    n.b. Ce lien n'a qu'une durée de vie temporaire.

                                    p.s. Un clic dans la colonne F sur le nom de la shape détruit celle-ci et la toute la ligne.

                                    Lupin

                                    Discussions similaires

                                    VBA / InputBox

                                    0 réponse