Macro détectant tout changement sur Excel
SebastienT79
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
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 !
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:
- Macro détectant tout changement sur Excel
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Changement dns - Guide
- Word et excel gratuit - Guide
- Comment trier par ordre alphabétique sur excel - Guide
3 réponses
Bonjour,
un exemple :
eric
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
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
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
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
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
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
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
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
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
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
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
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 !
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 !
bonjour
en utilisant Worksheet_Change
ceci devrait convenir (formater la colonne D au format souhaité
bonne suite
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
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
@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
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