Macro détectant tout changement sur Excel

SebastienT79 -  
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai une feuille de données et ces dernières sont classées par ligne dans une seule Feuille Excel. Disons que les données sont dans les colonnes A, B et C.
J'aimerais que, lorsqu'un changement se produit sur une certaine plage de cellule (disons A1:C4), que la date de modification (soit celle du jour), soit copiée dans une cellule située dans la colonne D de la ligne où le changement est survenu.

Bref, si je change une donnée de la cellule A2, la date d'aujourd'hui est copiée dans la cellule D2 après avoir été accepté par un MessageBox. Si je change une donnée de la cellule C3, la date d'aujourd'hui est copiée dans la cellule D3, toujours après avoir été accepté par le même MessageBox. Par contre, si je fais un changement dans la cellule C8, il ne se passe rien car je suis en dehors de la plage de détection.

C'est un beau petit défi que je m'étais donné mais ça fait déjà plusieurs heures que je suis là-dessus et je n'y arrive pas.

Merci pour votre aide !

A voir également:

3 réponses

eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonjour,

un exemple :
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect([A1:C4], Target) Is Nothing Then Exit Sub
    If MsgBox("Noter la date de modif ?", vbYesNo, "Confirmation") = vbYes Then
        Cells(Target.Row, 4) = Date
    End If
End Sub

eric
1
SebastienT79
 
Bonjour eriic,

Merci ! C'est exactement ce que je cherchais à faire.
Maintenant, si la réponse au MsgBox était "non", j'aimerais que la cellule modifiée reprennne sa valeur d'origine. Est-ce possible ?
Aussi, y'a-t-il un moyen d'obliger l'utilisateur à activer les macros avant de pouvoir modifier la feuille ? Car sans cette fonction, n'importe qui pourrait apporter des changements à mes données sans que la date soit mise à jour s'il n'a pas activer les macros au préalable.

Merci pour ton aide et merci à tous ceux qui répondent aux questions posés sur ce forum.
Sébastien
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonjour,

Vite fait donc pas complètement testé :
http://www.cijoint.fr/cjlink.php?file=cj201106/cijcWlnhuf.xls

Si tu dois recopier dans un classeur il y a du code dans :
Feuil1, ThisWorkbook et Module1

eric
1
SebastienT79
 
Merci infiniement eriic ! Ça fonctionne à merveille !
Il ne me reste plus qu'à comprendre chaque ligne de ce code que je n'avais jamais vu auparavant.
Dis-moi... la macro INIT s'active à l'ouverture du fichier ou pendant tout le temps qu'ilest ouvert ? Autrement dit Workbook_Open fonctionne à l'ouverture seulement ou c'est comme un scan qui se répète temps et aussi longtemps que le fichier est ouvert ?
Pour le reste, je ferai quelques recherches pour bien comprendre.

Maintenant, un problème se pose. L'utilisateur de mon fichier doit activer les macros à chaque ouverture du fichier pour qu'il fonctionne bien. Existe-t-il un moyen de contourner cela ?

Merci encore !
Sébastien
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonjour,

init() s'exécute une fois à l'ouverture.

Tu ne peux pas obliger un utilisateur à accepter les macros (et tant mieux...) et toutes les protections sur excel son contournables.
Ceci dit une proposition suffisante pour un utilisateur de base ne cherchant pas absolument à la contourner :
- masquer les feuilles de travail à la fermeture (xlsheetveryhidden pour qu'elle n'apparaissent pas dans le menu 'format / feuille / afficher...')
- les afficher à l'ouverture (si les macros ont été acceptées bien sûr)
ex: http://www.cijoint.fr/cjlink.php?file=cj201106/cijp6SQ1FQ.xls

eric
0
SebastienT79
 
Magnifique ! Vraiment eriic tu m'épates ! C'est exactement ce dont j'ai besoin, une page d'acceuil invitant l'utilisateur à activer les macros pour continuer à travailler avec le fichier. Je te remercie encore une fois de plus pour ton efficacité et ta rapidité.

Une autre petite chose: le problème que j'énonçais au tout début de ce sujet se répète sur plusieurs feuilles d'un même fichier Excel. Alors, lorsque je test ce que tu m'as envoyé tout fonctionne à merveille, mais lorsque je l'implante dans mon fichier comportant plusieurs feuilles ça ne fonctionne pas. J'imagine que je dois modifier cette partie de code n'est-ce pas ?

Option Explicit

Public savPlage1 As Variant

Sub init()
savPlage1 = [Feuil1!A1:C4].Formula
End Sub

Dois-je créer une variable de type variant pour chacune des feuilles (j'en ai presque 100) de mon fichier ou bien la même variable savPlage1 peut servir partout ? Y'a-t-il autre chose que je dois modifier pour que ça fonctionne ? Important: Le range à sauvegarder est différent sur chaque feuille.

Merci mille fois !
Sébastien
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonjour,

Il est éventuellement possible d'utiliser l'évènement sheetchange de thisworkbook pour éviter d'écrire le code dans chaque feuille.
Mais pour cela il faut qcq impératifs :
- que chaque feuille ait un type reconnaissable
- que chaque type ait une référence de plage à sauvegarder identique, ainsi que l'offset pour inscrire la date

Type : pourrait être une particularité dans le nom de la feuille ou bien une valeur particulière dans une cellule.
Par exemple :
- toutes les feuilles commençant par A (ou avec "ref" en A1) sauf la feuille Accueil : sauver A1:C4 et date en D même ligne
- toutes les feuilles commençant par B (ou avec "toto" en A1) : sauver C2:F5 et date en ligne 12 même colonne
- toutes les feuilles commençant par C (ou avec "C" en B3) ou la feuille Accueil : ne rien faire

ou bien inscrire dans une colonne (masquée si besoin les références) de la plage à sauver et celle de la date.

A toi de voir ce que tu peux réunir dans ces critères ....
Les noms des onglets fournis doivent être exacts, majuscules y compris.

eric
0
SebastienT79
 
Bonjour Éric,

Malheuresement, les plages modifiables ainsi que la cellules où inscrire la date sont différentes sur chacune de mes feuille. Les feuilles portent toutes un nom semblables par contre: de 001 à 117 (pour l'instant, car il peut s'en rajouter à n'importe quel moment)

De cette centaine de feuilles, il y a peut-être 6 ou 7 cas différents.
Pour être plus précis, la première feuille est différente des autres: une modification sur la plage A1:I1 change la date dans J1. Pour les autres feuilles, unes modification dans A8:F28 change la date dans A41:F41. C'est ici que ça peut changer. Parfois la plage est A7:F28, parfois A8:F12, etc... et même l'endroit pour la date peut aussi changer.

S'il le faut, je suis prêt à faire en sorte qu'il y ait le moins de cas possibles. Je pourrais certainement réduire le tout à 3 ou 4 cas.

À ce moment-là, aurais-je besoin de plusieurs variable savPlage ? Comment dois-je m'y prendre ?

Merci encore et bonne journée !
0
ccm81 Messages postés 11033 Statut Membre 2 433
 
bonjour
en utilisant Worksheet_Change
ceci devrait convenir (formater la colonne D au format souhaité

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:C4")) Is Nothing Then
  Range("D" & Target.Row) = Now
End If
End Sub

bonne suite
0
ccm81 Messages postés 11033 Statut Membre 2 433
 
> eriic
bonjour et excuses, je n'avais pas vu ta réponse
cordialement
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
pas de souci ccm81, au moins on est d'accord :-)

@sebastienT79 :
Il faut enregistrer ces données à l'ouverture et à chaque modif pour pouvoir les restaurer ensuite...
Ce soir je suis absent et demain pas sûr d'avoir le temps.
Ce we si personne ne t'a répondu d'ici là.

Précise si tu n'y as que des valeurs (numériques et/ou chaines) saisies et pas de formule ou de modif par macro

eric
0
SebastienT79
 
Merci pour votre aide!

En fait les valeurs peuvent être de type numérique et chaîne et il peut aussi y avoir des formules. Par contre, il n'y a pas de modif par macro. Est-ce c'est réalisable vous croyez ?
Merci encore !
0