Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2012, 14h28   #1
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
Par défaut Execution macro après modification cellule

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
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 16h33   #2
Membre Expert
 
Avatar de rtg57
 
Homme
Autodidacte
Inscription : mars 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Autodidacte
Secteur : Service public

Informations forums :
Inscription : mars 2006
Messages : 1 175
Points : 1 435
Points : 1 435
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!
rtg57 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2012, 18h53   #3
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
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 !

d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 20h30   #4
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
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
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 04h42   #5
Membre Expert
 
Avatar de rtg57
 
Homme
Autodidacte
Inscription : mars 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Autodidacte
Secteur : Service public

Informations forums :
Inscription : mars 2006
Messages : 1 175
Points : 1 435
Points : 1 435
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
Ce drapeau est mis à True pour verrouiller le traitement de Worksheet_Change(), et False pour l'autoriser.

A l'entrée de Worksheet_Change(), je mets cette ligne:
Code :
1
2
3
If verrou_feuille_saisie = True Then
  Exit Sub
Enf If
Dans le cas de plusieurs système de verrouillage, on peut même envisager ceci:
Dans le module ThisWorkbook, on déclare plusieurs drapeau publics, par exemple:
Code :
1
2
3
Public verrou_feuille_saisie as Boolean ' Verrouillage du traitement Worksheet_Change() de la feuille de saisie
Public verrou_feuille_calcul as Boolean ' Idem pour la feuille de calcul
/.../
Ensuite, de n'importe quelle partie du programme, on peut accéder à ces drapeaux de verrouillage. Par exemple, si la feuille de calcul doit écrire des valeurs dans la feuille de saisie, sans déclencher l'évènement Worksheet_Change(), cela donne ceci:
Code :
1
2
3
ThisWoorkbook.verrou_feuille_saisie = True
/.../
ThisWorkbook.verrou_feuille_saisie = False
Il m'arrive même d'auto-verrouiller le traitement dans la routine Worksheet_Change(), lorsque celle-ci doit modifier elle-même le contenu de la feuille, pour corriger une entrée erronée par exemple:
Code :
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
  If verrou_feuille_saisie = True Then
    Exit Sub
  End If
 
  /.../
  ThisWoorkbook.verrou_feuille_saisie = True
  /.../
  ThisWorkbook.verrou_feuille_saisie = False
C'est rustique et trivial, mais c'est simple.
__________________
@ bientôt...

Salut & @+ sur 3W!
rtg57 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 09h23   #6
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
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 !
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 09h36   #7
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
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
Code :
Application.EnableEvents = False
au début du code, puis
Code :
Application.EnableEvents = True
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
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 15h10   #8
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
Exact, ça fonctionne impeccable... Merci
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h33.


 
 
 
 
Partenaires

Hébergement Web