|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : janvier 2010 Messages : 176 ![]() |
Bonjour à toutes et à tous,
Sur la base de ce qui est raconté ici : http://www.developpez.net/forums/d83...e-p-condition/ , je souhaite pouvoir exécuter une macro si une cellule d'une plage donnée a été modifiée. Concrètement, j'ai une plage de cellules (disons A1:D1,B5:D5) contenant des longueurs. Si l'un d'eux est modifié (disons A1, qui passe de 1000m à 1200m par ex.), j'aimerais pouvoir comparer la nouvelle valeur avec l'ancienne (récupérer l'info 200 donc) et ajouter cette longueur à une autre cellule, disons B5. L'idée est donc de comparer deux valeurs d'une même cellule suite à une modification, et d'appliquer une macro en conséquence. Cela me dépasse un peu... D'où mon appel à l'aide Merci d'avance
|
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Autodidacte Inscription : mars 2006 Messages : 1 175 ![]() |
Bonjour,
Si je comprends bien le sujet, il est composé de 2 parties: 1) Détecter le changement de valeurs dans certaines cellules 2) Si le changement à lieu dans les cellules ciblées, détecter la variation de valeur. J'aurais donc 2 propositions à faire: 1) Utiliser l'évènement Worksheet_Change(ByVal Target As Range). Target permet de connaitre quelle cellule a été modifiée. On compare ensuite ses coordonnées pour savoir si elle fait partie de la zone à surveiller. 2) Tenir à jour un tableau contenant les valeurs des cellules cibles. Lorsqu'un évènement à lieu dans une cellule surveillée, on compare sa valeur à celle du tableau mémoire. On peut ainsi détecter une variation. Ensuite on met cette nouvelle valeur dans le tableau mémoire.
__________________
@ bientôt... Salut & @+ sur 3W!
|
|
|
10
|
|
|
#3 |
|
Membre du Club
![]() Inscription : janvier 2010 Messages : 176 ![]() |
Bonjour et merci de ta réponse !
C'est la solution qui m'était finalement apparue.. Je suis étonné qu'il n'y ait pas de gestion de la mémoire directement dans Excel, et qu'il faille contourner cela par la méthode que tu proposes ! Enfin, du moment que ça fonctionne Merci ! Petite variation : La feuille pour laquelle je souhaite détecter les modifications est générée via macro. Des modifications sont donc détectées lors de la génération de la feuille. Je souhaiterais ne pas en tenir compte. J'ai pensé à jouer sur un booléen qui serait à true quand la macro de génération s'exécute, et qui conditionnerait l'exécution de Worksheet_change. Cela semble-t-il réalisable ? Le problème étant que la macro de génération n'est pas dans un module mais dans la feuille directement (feuille différente de la feuille générée), et que je galère à transmettre le booléen à la feuille générée.. En espérant ne pas être trop confus !
|
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Sebastien LIngénieur Financier Inscription : mars 2010 Messages : 880 ![]() |
Regarde du coté de la propriété EnableEvents. Il suffit de la mettre à False au moment de la création de la feuille et de ne pas oublié de la remettre à True à la fin.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell |
|
|
10
|
|
|
#5 | ||||||||
|
Membre Expert
![]() Autodidacte Inscription : mars 2006 Messages : 1 175 ![]() |
Bonjour,
personnellement, j'ai résolu ce problème de la manière suivante: Au début du module de programmation concernant cette feuille, je déclare une variable publique, par exemple: Code :
Public verrou_feuille_saisie as Boolean A l'entrée de Worksheet_Change(), je mets cette ligne: Code :
Dans le module ThisWorkbook, on déclare plusieurs drapeau publics, par exemple: Code :
Code :
Code :
__________________
@ bientôt... Salut & @+ sur 3W!
|
||||||||
|
|
10
|
|
|
#6 |
|
Membre du Club
![]() Inscription : janvier 2010 Messages : 176 ![]() |
Rebonjour et merci à vous 2 pour vos réponses
Je comprends bien l'intérêt et le but de vos astuces, j'ai cependant quelques difficultés à les mettre en place.. Pour faire simple : Deux modules séparés pour 2 feuilles différentes (1 et 2 disons). Une macro de la feuille 2 génère la trame de la feuille 1, et je ne souhaite tenir compte de ces modifications. J'ai déclaré un booléen comme indiqué par rtg57, dans la feuille 1, et je le passe à true ou false suivant le besoin dans la feuille 2. Est-ce bien l'esprit de vos réponses ? Si c'est bien le cas, alors je suis coincé, ou du moins les affectations au booléen ne fonctionnent pas. D'où je pense que je n'ai pas bien compris Merci ! |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Sebastien LIngénieur Financier Inscription : mars 2010 Messages : 880 ![]() |
En tout cas pour ma solution, à chaque fois que tu fais des modifications qui ne sont pas censées générer des évènements sur la feuille (c'est à dire que les macros Worksheet_Change et autre ne seront pas exécutées), tu fais tout simplement
au début du code, puis en fin de code. Et si vraiment certains évènements doivent rester, vu qu'ils sont déclenchés par une action de ton code (donc que tu maitrises), tu peux toujours les appeler manuellement. Mais de toute façon, d'un point de vue conception, les évènements doivent servir à capter des actions de l'utilisateur ou autre, pas de ton propre code.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell |
|
|
10
|
|
|
#8 |
|
Membre du Club
![]() Inscription : janvier 2010 Messages : 176 ![]() |
Exact, ça fonctionne impeccable... Merci
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com