VBA excel insertion resultat inputbox

Fermé
charluche - 28 août 2007 à 17:01
 Utilisateur anonyme - 31 août 2007 à 19:14
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
A voir également:

17 réponses

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
0
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
28 août 2007 à 17:54
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
0
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
28 août 2007 à 18:08
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.
0
Utilisateur anonyme
28 août 2007 à 19:05
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
28 août 2007 à 19:33
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.
0
Utilisateur anonyme
28 août 2007 à 19:50
re:

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

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

Lupin
0
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
28 août 2007 à 20:04
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
0
Utilisateur anonyme
28 août 2007 à 20:21
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
0
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
28 août 2007 à 20:37
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.
0
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
28 août 2007 à 20:42
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.
0
Utilisateur anonyme
29 août 2007 à 00:39
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
0
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
29 août 2007 à 15:35
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.
0
Utilisateur anonyme
29 août 2007 à 16:10
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
0
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
29 août 2007 à 16:48
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.
0
Utilisateur anonyme
30 août 2007 à 14:52
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
0
charluche Messages postés 57 Date d'inscription mardi 14 août 2007 Statut Membre Dernière intervention 10 novembre 2009
30 août 2007 à 16:58
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.
0
Utilisateur anonyme
31 août 2007 à 19:14
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
0