Macro si telle valeur de cellule [Résolu/Fermé]

Signaler
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
-
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
-
Bonjour,
Je ne connaissais pas grand chose en VBA, mais à force de chercher, je suis arrivé à un résultat qui, s'il est loin d'être parfait (les macros ont été en partie créées avec l'aide de l'enregistreur !), me satisfait.
Seulement, j'ai un petit soucis :
je veux que la cellule "X" (R2) passe à "0" si "OPT" (Q2) = 0 pour éviter que la macro "COPY_RÉSULTATS" recopie une plage erronée. je ne peux pas remettre la cellule "X" à 0 autrement car elle enregistre le choix de l'utilisateur "vitesses lentes" ou "vitesses rapides" !
la macro que j'ai écrite d'après mes recherche su "G..." ne fonctionne pas : il y a un calcul en boucle et si la cellule "X" a été mise à 0,j'ai le message suivant au bout de quelques secondes "erreur d'exécution '28': espace pile insuffisant".

macro écrite dans la feuille où est la cellule :
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("OPT") = 0 Then
[X] = 0
End If
End Sub


Le fichier EXCEL :

https://www.cjoint.com/?BHEpcljQoj3

Merci d'avance,
GUGUSSE.

17 réponses

Messages postés
15255
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
1 août 2020
1 317
Bonjour,

lien pour joindre le fichier:

https://www.cjoint.com/
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
7
Bonjour,
Message modifié, fichier joint !
Merci,
GUGUSSE.
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
6 272
Bonjour,

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 
    If Target = [OPT] And Target = 0 Then [X] = 0 
    Application.EnableEvents = True 
End Sub 
à mettre dans le module de la Feuille

eric

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Messages postés
15255
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
1 août 2020
1 317
Re,

Code a mettre dans Feuil1(Donnees) (vous n'en etiez pas loin)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Range("OPT") = 0 Then
    [X] = 0
  End If
End Sub


Ou vous pouvez aussi ajouter un test au debut de la macro COPY_RÉSULTATS pour sortir si les conditions de copie ne sont pas reunies.

A vous de voir.

Bonne suite
Messages postés
15255
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
1 août 2020
1 317
Re,

https://www.cjoint.com/?BHEp373mU5Z

Votre fichier avec le VBA un peu remis en forme.
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
7
Merci à "eriiic" et à "f894009",

la solution de "eriiic" ne "marche" pas.
la copie de ce qu'à écrit "f894006" ne "marche" pas non plus, mais son fichier (voir lien au dessus) "marche". C'est à n'y rien comprendre !
Oui mais : il ne fonctionne plus si je protège ma feuille.
Et si j'ôte temporairement la protection dans cette macro (private sub worksheet ...),
c'est la macro "Efface" qui à un problème !

https://www.cjoint.com/?BHEsmjjmVui

J'en appelle à vos compétences pour que tout fonctionne une fois la feuille protégée.
Merci pour ce que vous avez déjà fait,
cordialement,
GUGUSSSE.
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
7
Bonjour,

J'ai trouvé "ça" :

Private Sub Workbook_Open()
With Worksheets("NomDeLaFeuille")
.Protect "MotDePasse", DrawingObjects:=True, _
Contents:=True, Scenarios:=True, _
UserInterfaceOnly:=True
End With
End Sub

Dans mon cas :
- est-ce que cela fonctionne ?
- quoi et où écrire compte tenu que j'ai plusieurs feuilles ?
- est-ce compatible avec l'appel d'un macro (INIT)
Merci,
cordialement,
GUGUSSE.
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
6 272
la solution de "eriiic" ne "marche" pas.
Sache que je teste toujours avant de poster, et ça marche !!!!.
Si tu change les conditions et que tu mets mal en oeuvre les proposition c'est à toi qu'il faut t'en prendre...

eric

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
7
Bonjour eriiic,

Sache que je ne met nullement en cause tes compétences.
J'ai copié-collé ton code sur "feuille1(DONNÉES)" et cela n'a pas fonctionné.
Je ne sais pas pourquoi et comme il y avait d'autres propositions, je les ai essayées.

Si tu voulais bien malgré tout rendre mes macros fonctionnelles quand ma feuille est protégée, je te serai reconnaissant.

A ta disposition pour d'autres renseignements,
cordialement,
GUGUSSE.
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
6 272
Re,

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target = [OPT] And Target = 0 Then 
        Application.EnableEvents = False 
        ActiveSheet.Unprotect ("toto") 
        [X] = 0 
        ActiveSheet.Protect Password:="toto", DrawingObjects:=True, Contents:=True, Scenarios:=True 
        Application.EnableEvents = True 
    End If 
End Sub 

Mais il faudrait peut-être déverrouiller qcq cellules...

eric

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
7
Bonjour Ericc,

Sympa que tu soit revenu !

Compte rendu :
J'ai ouvert mon fichier. A ce moment "0" et "OPT" valent "0".
Mes feuilles n'étaient PAS protégées.
J'ai copié-collé ton code dans "feuille1(DONNÉES)" et j'ai initialisé les valeurs (E2=100, E3=750, K2=2500, K3=7). J'ai ensuite choisi "VITESSES puis j'ai demandé l'affichage des résultats. J'ai eu mes résultats et un message <erreur d'exécution '13' : incompatibilité de type.> est apparut.
La ligne N° 2 de ton code était en jaune.

Peux-tu me dire ce qui cloche ?
Le fichier que j'ai utilisé, avec ta macro :

https://www.cjoint.com/?BHFlBYpTH7M

Merci de ta patience,
Cordialement,
GUGUSSE.
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
6 272
Bonjour,

Je pense que tu avais fait une sélection multiple.
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count = 1 Then
        If Target = [OPT] And Target = 0 Then
            Application.EnableEvents = False
            ActiveSheet.Unprotect ("")
            [X] = 0
            ActiveSheet.Protect Password:="t", DrawingObjects:=True, Contents:=True, Scenarios:=True
            Application.EnableEvents = True
        End If
    End If
End Sub

eric
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
7
Bonjour,
Je ne comprend pas ta phrase "Je pense que tu avais fait une sélection multiple." :
j'avais copié de "Priv... à ...End Sub" tout comme je viens de copier ci-dessus "Je ... multiple.".
J'ai donc copié ton nouveau code à la place de l'ancien et j'ai essayé :
NBVi=7, vitesses lentes ou vitesses rapides, tout se passe bien.
Clic sur résultat, OK.
Changement de "NBVi=7" en "NBVi=8", Effacement du choix "Vitesses lentes ou rapides", préparation du tableau de résultats (vitesses de 1 à 12), OK, MAIS "X" (Q2) ne PASSE PAS à "0"!
Et donc en cliquant sur "RÉSULTATS", j'ai un affichage erronné puisque j'ai toujours 3 poulies et 4 gradins, mais que "X" vaut encore "2" !

Je suis désolé, mais crois bien que je ne met aucune mauvaise volonté. Il est vrai que je sais ce que doit faire mon programme et pas forcément vous !

Cordialement,
GUGUSSE.
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
6 272
Je ne comprend pas ta phrase "Je pense que tu avais fait une sélection multiple."
Tu avais sélectionné plusieurs cellules et je n'avais pas prévu ce cas.

recommence mais en remplaçant les noms par les références A1.
X passe à 0 si OPT est mis à 0 par une saisie. Dans ton explication je ne le vois pas.
eric
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
7
Bonjour,

J'ai mis ce code dans la feuille1(DONNÉES) (en remplaçant donc les noms des cellules par leur adresse):

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count = 1 Then
If Target = [R2] And Target = 0 Then
Application.EnableEvents = False
ActiveSheet.Unprotect ("")
[Q2] = 0
ActiveSheet.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.EnableEvents = True
End If
End If
End Sub

Mais la cellule "Q2" ne repasse pas à "0" quand "R2" passe à "0" par la formule !
Je pensais que tu avais vu ce détail en examinant mon fichier et en allant voir à quoi correspondaient "X" et "OPT".

Y a-t'il une solution ?
Merci de me la donner car j'avoue n'y rien comprendre (c'est sans doute normal à mon niveau de connaissances).

Cordialement,
GUGUSSE.
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
6 272
Bonjour,

C'est dans tes explications que je voulais que tu mettes les références des cellules, pas dans le code.
Changement de "NBVi=7" en "NBVi=8", moi ça ne me parle pas du tout.

Et fais le ménage dans tes cellules verrouillées/déverrouillées. Certaines devraient être déverrouillées et ne le sont pas. De plus tu protèges la feuille avec un mot de passe "t" et tu essaies de la déprotéger sans mot de passe.
Met déjà ton programme au point sans protection de la feuille.

Tous ces problèmes n'ont rien à voir avec le bout de code que je t'ai fait.
Pour moi il fonctionne si tu mets 0 dans OPT par une saisie manuelle.

eric
Messages postés
72
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 février 2017
7
Bonjour Eriiic,

* Que mes cellules soient verrouillées ou non ne change rien puisque pour le moment mes feuilles ne sont pas protégées (sinon les macros "plantent" ! Mais nous régleront ce problème plus tard.)

* La cellule "R2" (OPT) est mise à "1" (=choisir l'option) ou à "0" (pas de choix nécessaire) selon la valeur contenue dans la cellule "K3".
Je voulais que le cellule "Q2" (X), (qui est mise à "1" ou à "2" par deux macros, "PV" & "GV"), soit mise à "0" quand la cellule "R2" (OPT) passe à "0".
Il m'est donc impossible de faire une saisie manuelle en "R2", sinon je détruis la formule s'y trouvant ! Et "R2" n'agit pas directement sur "Q2".

J'espère que mon problème est maintenant clair pour toi et que tu pourras m'aider.
Ci-joint le dernier fichier, complet du point de vue des macros que j'ai créées concernant l'animation et la gestion, MAIS QUI PLANTE au démarrage (la macro "workbook_open" ne s'exécute pas !)

https://www.cjoint.com/?BIcr2dRczK5

merci encore de ta patience,
Cordialement,
GUGUSSE.
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
6 272
Re,

J'ai trouvé "ça" :

Private Sub Workbook_Open()
With Worksheets("NomDeLaFeuille")
.Protect "MotDePasse", DrawingObjects:=True, _
Contents:=True, Scenarios:=True, _
UserInterfaceOnly:=True
End With
End Sub

C'est bien toi qui l'a posté et je t'ai répondu comment tenir compte de la protection en ajoutant 2 lignes dans le code.
Bien évidemment si tu ne tiens pas compte des réponses à tes questions on n'a pas le même fichier...
Bref...

* Je voulais que le cellule "Q2" (X), (qui est mise à "1" ou à "2" par deux macros, "PV" & "GV"), soit mise à "0" quand la cellule "R2" (OPT) passe à "0" (ce qui se passe quand l'utilisateur change le nombre de vitesses dans la cellule "K3 (NBVi).
Il m'est donc impossible de faire une saisie manuelle en "R2" !

Il est temps de le dire, un évènement Change n'est actif que sur une saisie. Ici c'est totalement inutile.
Puisque tu passes ta cellule à 0 par macro et bien rajoute une ligne au même endroit pour mettre également à 0 l'autre cellule.
Ou bien gère l'évènement sur le changement de K3 puisque c'est là que s'effectue la saisie.

Chez moi ton fichier ne plante pas à l'ouverture.

eric
Bonjour Eriiic,

Désolé, mais je n'ai jamais vu de réponse à ma "trouvaille" et encore moins "deux lignes à rajouter dans le code" que tu m'aurais données !

* Quand à la question "il est temps de le dire", je pensais que tu aurais analysé mon fichier et que de ce fait, beaucoup d'explications ou questions seraient apparues.
Pour la question de la protection, on verra plus tard.

* Pour la mise à "0" de la cellule "Q2" quand "R2" passe à "0" par une formule ou quand "K3" change par une formule (=B28+0 puisque maintenant je rentre les paramètres par une userforn, j'attends un code "complet" et l'endroi où le mettre.

Désolé si tu me trouve un peu brutal, mais en ce moment je galère avec une "workbook_open" qui ne fonctionne pas et me provoque une erreur (Erreur système &H8000FFFF).
Bien cordialement,
GUGUSSE.
Je pense qu'il est mieux d'interrompre ce sujet qui commence à être trop volumineux pour pouvoir retrouver les bonnes infos.
Pour partir sur de nouvelles bases, j'ai ouvert un nouveau sujet :

http://www.commentcamarche.net/forum/affich-25995110-touche-finale-protection-raz-cellule

Merci à ceux qui m'ont aidé ici, en souhaitant qu'ils me suivent.
Bien cordialement,
GUGUSSE.
Messages postés
23404
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
2 août 2020
6 272
Oui, c'est mieux.
eric