charluche
Messages postés57Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention10 novembre 2009
-
2 sept. 2007 à 15:48
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 2011
-
17 sept. 2007 à 11:41
Bonjour a tous,
je suis actuellement face a un probleme avec vba et pour ne rien vous cacher je n'y connais rien a ce langage. En fait ma macro dessine dans un premier temps une forme puis inscrit dans des cellules des inforations relatives a cette forme. Dans ce sens la ca marche tres bien, en revanche, si je supprime la forme precedement dessinee, les informations relatives restent. Je souhaiterai que mes infrmations et que mes informations relatives soient remontees d une ligne. Exemple, si je supprime la 11eme forme, il faudrait que d12 et e12 soient supprimees et que les informations relatives a la 12eme forme soient maintenant dans la cellule d12 et d12.
J espere etre assez claire dans mon explication...
Dans tous les cas je vous remercie pour votre interet.
Charluche.
PS voici mon code:
Sub colis()
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
A voir également:
Excel supprimer des cellules quand je supprime une forme qui leur est associee
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 17 sept. 2007 à 10:39
Salut,
En fait j'ai oublier de corriger le module de suppression en tenant compte des mofifs du module de création
Ligne en rouge dans le code ci-dessous
Attention au mot de passe si tu l'a modifié dans le fichier
Sub SuppressionBoite()
Dim NumBoite
On Error Resume Next
Err.Clear
NumBoite = Selection.Name
If Err <> 0 Then Exit Sub
ActiveSheet.Unprotect (" password ")
Selection.Delete
Range(Cells(Range(NumBoite & "_Hauteur").Row, Range("hauteur").Column), Cells(Range(NumBoite & "_Poids").Row, Range("Poids").Column)).Select
Selection.Delete Shift: =xlUp
ActiveSheet.Protect "password", DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveSheet.EnableSelection = xlUnlockedCells
Range("A1").Select
End Sub
Cliquer "Réponse Acceptée" Quand La Réponse Est OK
JML. Partageons notre savoir et nos acquis
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 3 sept. 2007 à 09:45
Salut,
Je pense que toute la partie sous ' Dessin de la forme peut se réduire à
Worksheets(1).Shapes.AddShape msoShapeRectangle, 5, 5, Longueur, Largeur
Si j'ai bien compris ton soucis c'est la suppression des données relatives à la forme supprimée. Je pense qu'en enregistrement de macro en exécutant la suppression, tu auras le code souhaité.
charluche
Messages postés57Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention10 novembre 2009 4 sept. 2007 à 14:40
Bonjour JM,
merci de ta reponse, j ai bien essaye de passer par lenregistrement mais le probleme c est que VBA n enregistre pas les lignes concernant les formes. De plus il faudrait que le lie les cellule avec la forme et ca je ne sais pas comment faire, si tu as une idee je suis preneur.
Charluche
Vous n’avez pas trouvé la réponse que vous recherchez ?
charluche
Messages postés57Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention10 novembre 2009 5 sept. 2007 à 16:27
Bonjour JML,
la suppression de la forme se fera manuellement avec la souris puis la touche suppr, par la suite il faudra que les cellules associees a cette forme soit elle aussi supprimee.
Merci pour ton interet.
Charluche
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 5 sept. 2007 à 16:40
Désolé mais aucune chance car la suppression d'objet dans une feuille ne déclenche aucun évènement du type "Change" ou "Sélection Change" ... Ce qui veut dire que à moins de faire une usine à gaz du type :
Clic sur un bouton qui balaie toutes les cellules contenant des infos relatives aux objets ... et qui supprimerait les cellules dont l'objet n'existerait plus ...
Constat d'inexistence établi par le fait que l'objet créé et la plage de cellule s'y référant porterait le même nom
Mais pourquoi pas !!!
JML
Partageons notre savoir et nos acquis
AglarEdain
Messages postés9Date d'inscriptionjeudi 28 juin 2007StatutMembreDernière intervention 8 septembre 2007 5 sept. 2007 à 19:20
J'ai une idée qui vient... je vous la livre comme elle me vient, j'ai pas creusé plus avant :
Créer une classe qui associerait la forme et les cellules (autrement elles ne seront associé que dans l'esprit de charluche) avec une méthode pour les détruire, qui s'occuperait d'effacer la forme, effacer la ligne, et mettre à jour les formes suivantes... Mais faudrait un bouton qui appelle une feuille (UserForm) pour demander à l'utilisateur quel rectangle effacer.
C'est tout de suite un peu plus compliqué.
En même temps, si c'est juste pour effacer un rectangle et une ligne, on peut le faire à la main.
Et puis d'abord, t'as vraiment besoin de mémoriser ces deux valeurs ? Parce que j'en ai pas l'impression. Je crois qu'il nous manque une vision d'ensemble du projet pour pouvoir apporter une aide efficace.
<hr />AglarEdain
J'avais cherché une signature originale... mais j'ai rien trouvé.
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 6 sept. 2007 à 09:46
Et pourquoi ne pas développer un code pour la création de l'objet en utilisant InputBox pour la définition des valeurs et du nom de l'objet puis d'affecter ces valeurs dans un objet texte qui porterait un nom associé à celui de l'objet.
Puis comme le préconise AglarEdain - celui qui recherche une signature originale - gérer la suppression par du code
AglarEdain
Messages postés9Date d'inscriptionjeudi 28 juin 2007StatutMembreDernière intervention 8 septembre 2007 6 sept. 2007 à 11:53
Je viens de voir que oui il y a besoin des valeurs en qestion. Désolé, j'avais mal lu.
Sinon, je reste sur mon idée de classe. Genre une classe Colis qui aurait comme "propriétés" :
.Hauteur as Long
.Largeur as Long
.Longueur as Long
.Poids as Integer
.IndexDeForme as Integer
.Ligne as Integer
Et ensuite, gérer un tableau avec des classes Colis dedans.
<hr />AglarEdain
J'avais cherché une signature originale... mais j'ai rien trouvé.
charluche
Messages postés57Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention10 novembre 2009 6 sept. 2007 à 14:31
Bonjour a tous les deux,
je vous remercie tout d abord pour votre interet. En revanche je dois vous avouer que je suis un peu honteux car je n ai aucune formation de programmeur ou quoi que ce soit et du fait de l utilisation de formes libres l enregistreur de macro ne m aide pas beaucoup, bref je ne peux meme pas faire de bricolage pour vous faire rire de mon incompetence!
Pour repondre a la premiere question, l objet de ce projet est de calculer une sorte de barycentre. Le tout se passe sur le pont d un bateau, une premiere macro me permet de dessiner le colis sur le pont et de rentrer des informations quant a la hauteur du centre de gravite du colis ainsi que son poids (coef ponderateur pour le barycentre). Une fois tous les colis dessines sur le pont une deuxieme macro (qui fonctionne) scrute tous les colis presents et calcul le centre de cahque forme par rapport au coin sup gauche de ma feuille. Cette macro me donne ces resultats par ordre d apparition de la forme sur la feuille. Dans ce cas tout marche tres bien. En revanche si je fais une erreur de saisie ou autre, si je supprime la forme, la macro de calcul de centre de gravite fonctionne et ne tiens plus compte de cette forme alors que la premiere macro elle laisse les infos entree par l inputbox bref plus moyen de faire les calculs sur excel. Voici donc dans le detail la problematique.
Pour en revinir a vos suggestions, elles me semblent tout a fait compatibles au projet. Seulement je ne vois pas comment les mettre en oeuvre (niveau zero de connaissance VBA), Pourriez vous donc s il vous plait me donner une methode et des codes pour que je puisse essayer de m en sortir avec l aide VBA? Je suis desole de vous demande de me macher ainsi le travail mais je ne peux pas faire mieux.
Encore meric a vous deux,
Charluche
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 6 sept. 2007 à 14:39
Si j'ai bien tout compris, ce qui compte pour les calculs ce sont les valeurs, les objets ne sont là que pour être créés puis éventuellement supprimés
Alors pourquoi plutôt qu'un objet ne pas utiliser une cellule en regard de celles contenant les valeurs afin de simplement identifier le carton
Ainsi la suppression se ferait par la suppression de la ligne
charluche
Messages postés57Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention10 novembre 2009 10 sept. 2007 à 13:49
Bonjour JML,
mes formes mes sont utiles car les colis charges sont de grandes taille (6m*2.4m) et sont stockes sur un espaces restreint. Elles me sont donc de grande utilite pour optimise au mieux le chargement de facon visuelle. De plus elle permettent de les deplacer et de les faire tourner en gardant une vue d ensemble. Je reste donc sur mon idee de lier une forme avec des cellules. Je fais de recherche actuelement pour maitriser un peu mieux le integer mais ce n est pas encore terrible. Dans tous les cas je reste ouvert a toute proposition.
Merci encore pour ton interet,
Charluche.
JM247L
Messages postés443Date d'inscriptionmardi 27 mars 2007StatutMembreDernière intervention 1 mars 20112 10 sept. 2007 à 16:45
Bonjour,
Ca devrait répondre à ta question ... à toi de l'adapter
' Dans une feuille Excel
' Cellules de titre doivent être nommées : "Longueur", "Largeur", "Hauteur", "Poids"
' Une cellule doit être nommée "NombreDeBoites"
' Les 2 codes ci-dessous affectés à un bouton après avoir été collés dans un module
Option Explicit
Sub CreationBoite()
Dim Lg, Cl
' Ne pas oublier d'ajouter les tests concernant les valeurs ... Diff de vide et Numérique
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 20.25, 12#, 34.5, 26.25).Select
Range("NombreDeBoites") = Range("NombreDeBoites") + 1
Selection.Name = "Boite" & Range("NombreDeBoites")
Lg = Range("Longueur").End(xlDown).Row + 1
If Lg > 65536 Then Lg = 2
Cl = Range("Longueur").Column
Cells(Lg, Cl) = InputBox("Saisir la Longueur de la boite", "LONGUEUR BOITE")
ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Longueur", RefersToR1C1:=Cells(Lg, Cl)
Cl = Range("Largeur").Column
Cells(Lg, Cl) = InputBox("Saisir la largeur de la boite", "LARGEUR BOITE")
ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Largeur", RefersToR1C1:=Cells(Lg, Cl)
Cl = Range("Hauteur").Column
Cells(Lg, Cl) = InputBox("Saisir la hauteur de la boite", "HAUTEUR BOITE")
ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Hauteur", RefersToR1C1:=Cells(Lg, Cl)
Cl = Range("Poids").Column
Cells(Lg, Cl) = InputBox("Saisir le poids de la boite", "POIDS BOITE")
ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Poids", RefersToR1C1:=Cells(Lg, Cl)
End Sub
'************************
Sub SuppressionBoite()
Dim NumBoite
On Error Resume Next
Err.Clear
NumBoite = Selection.Name
If Err <> 0 Then Exit Sub
Selection.Delete
Range(Cells(Range(NumBoite & "_Longueur").Row, Range("Longueur").Column), Cells(Range(NumBoite & "_Poids").Row, Range("Poids").Column)).Select
Selection.Delete Shift:=xlUp
End Sub
charluche
Messages postés57Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention10 novembre 2009 12 sept. 2007 à 15:47
Bonjour JML,
desole du retard, j ai passe un peu de temps pour adapter ton cade a ma sauce car je n y connais pas grand chose. Dans tous les cas je te felicite car ca fonctionne impecable. C est vraiment tres aimable de ta part d avoir passer autant de temps pour moi.
Encore un grand merci car ton aide m a etee tres utile.
Encore merci pour tout,
Charluche.
PS : voici ton code maintenant bidouille:
Option Explicit
Sub CreationBoite()
Dim Lg, Cl, cd, ce
cd = 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")
ce = 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")
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 20, 20, cd, ce).Select
Range("NombreDeBoites") = Range("NombreDeBoites") + 1
Selection.Name = "Boite" & Range("NombreDeBoites")
Lg = Range("Hauteur").End(xlDown).Row + 1
If Lg > 65536 Then Lg = 2
Cl = Range("Hauteur").Column
Cells(Lg, Cl) = InputBox("Hauteur du conteneur en metre, cette hauteur sera automatiquement ponderee du coefficient 2/3 pour le calcul du KG.", "Hauteur du conteneur")
ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Hauteur", RefersToR1C1:=Cells(Lg, Cl)
Cl = Range("Poids").Column
Cells(Lg, Cl) = InputBox("Poids du conteneur en tonnes.", "Poids du conteneur")
ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Poids", RefersToR1C1:=Cells(Lg, Cl)
End Sub
Sub SuppressionBoite()
Dim NumBoite
On Error Resume Next
Err.Clear
NumBoite = Selection.Name
If Err <> 0 Then Exit Sub
Selection.Delete
Range(Cells(Range(NumBoite & "_Hauteur").Row, Range("hauteur").Column), Cells(Range(NumBoite & "_Poids").Row, Range("Poids").Column)).Select
Selection.Delete Shift:=xlUp
Range("A1").Select
End Sub
charluche
Messages postés57Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention10 novembre 2009 14 sept. 2007 à 15:29
Bonjour JML,
je suis de retour mais rassure toi pour quelque chose de tres facile pour toi, mais une fois de plus compliquee pour moi. En fait je souhaiterai que la forme qui apparait soit deverouillee de maniere a ce que je puisse la modifier meme si ma feuille est protegee. L utilisateur n a pas le droit de modifier les images et formes qui ne sont pas issues de la macro. J ai bien essaye de mettre des activeshape.unprotect un peu partout, mais sans grand succes. Si tu es encore dans le coin, pourras tu me donner ton avis.
Merci encore pour tout,
charluche