détection modification contenu cellules

Noe06

XLDnaute Nouveau
Bonjour,

je rencontre un problème pour détecter un événement.

Ce que je cherche à faire: si une cellule entre A5 et N50 est modifiée, on actualise la date en L2. Quand je dis modifiée je veux bien dire que le texte d'une des cellules est modifié et non qu'une des cellules a été sélectionnée.

Voici le code que j'ai écrit:

Public Sub CM_Worksheet_Change(ByVal Target As Excel.Range)
If InStr(1, "user manual,Model,Param,Actions", Target.Parent.Name) = 0 Then
If Target.Column = ActiveSheet.Range("A:N").Column Then
If Target.Row = ActiveSheet.Range("A5:N50").Row Then
ActiveSheet.Range("L2").Value = Date
End If
End If
End If
End Sub


Mon problème: si le fichier s'ouvre sur la feuille, la date est actualisée, si n'importe quelle cellule de la feuille est sélectionnée, la date est également modifiée. Ce qui ne correspond donc pas à ce que je voudrais.

Quelqu 'un aurait-il une solution svp?
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : détection modification contenu cellules

Bonjour Noe, bonjour le forum,

Je n'ai jamais vu ça : Public Sub CM_Worksheet_Change(ByVal Target As Excel.Range) ! Normalement l'événement Change d'un onglet est comme ça : Private Sub Worksheet_Change(ByVal Target As Range). Du coup je te fais un proposition mais je pense que ça n'ira pas...

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If InStr(1, "user manual,Model,Param,Actions", Target.Parent.Name) = 0 Then
    If Not Application.Intersect(Range("A5:N50"), Target) Is Nothing Then
        Range("L2").Value = Date
    End If
End If
End Sub
 

Noe06

XLDnaute Nouveau
Re : détection modification contenu cellules

Bonjour Robert,

j'avoue que je suis débutante et qu'on me demande de refaire un programme. J'ai donc gardé certains modules donc les worksheet_Change et SelectionChange et je ne sais vraiment pas pourquoi c'est Public et pourquoi il y a un CM. Jusqu'à maintenant tout fontionne normalement malgré ça!

J'ai donc essayé ton code mais c'est tjs pareil, la date est mise à jour dès qu'une cellule est sélectionnée et non modifiée! Je ne sais pas s'il y a une solution à mon problème...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : détection modification contenu cellules

Bonjour Noe, bonjour le forum,

N'y aurait-il pas aussi une macro événementielle SelectionChange :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
qui serait responsable ?
 

Noe06

XLDnaute Nouveau
Re : détection modification contenu cellules

Alors... c'est un peu compliqué!

j'ai une feuille "Model" qui a :

Code:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Call CM_Worksheet_Change(Target)
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Call CM_Worksheet_SelectionChange(Target)
End Sub

Ensuite je génère de nouvelles feuilles qui sont des copies de ce modèle.

Et en plus de ca j'ai des modules avec plusieurs Macro, dont:
Code:
Public Sub CM_Worksheet_Change(ByVal Target As Excel.Range)
et
Code:
Public Sub CM_Worksheet_SelectionChange(ByVal Target As Excel.Range)

c'est dans ces macros que je pensais ajouter qq lignes de code pour actualiser la date en L2 de la feuille active si l'une des cellules entre A5 et N50 est modifiée...
 

pierrejean

XLDnaute Barbatruc
Re : détection modification contenu cellules

Bonjour Noe06

Salut Robert

Un essai

les codes:
Code:
Private Sub Workbook_Open()
Sheets("Feuil2").Select
Sheets("Feuil1").Select
End Sub

Public tablo
Private Sub Worksheet_Activate()
tablo = Range("A2:N50")
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
tablo1 = Range("A2:N50")
For n = LBound(tablo, 1) To UBound(tablo, 1)
  For m = LBound(tablo, 2) To UBound(tablo, 2)
    If tablo(n, m) <> tablo1(n, m) Then
        Application.EnableEvents = False
        Range("L2") = Now
        Application.EnableEvents = True
        tablo = Range("A2:N50")
      Exit Sub
    End If
  Next m
Next
End Sub
 

Pièces jointes

  • Noe06.xls
    34 KB · Affichages: 72

Robert

XLDnaute Barbatruc
Repose en paix
Re : détection modification contenu cellules

Bonjour Noe, bonjour le forum,

Je comprends mieux... Dans l'onglet Model à chaque changement de sélection la macro CM_Worksheet_SelectionChange(Target) est lancée. De même, à chaque changement la macro CM_Worksheet_Change(Target) est lancé. Peut-être même sont-elles lancées à partir d'autres onglets. Quoi qu'il soit, sans une vue d'ensemble donc sans le fichier, impossible de t'aider davantage.

 

Noe06

XLDnaute Nouveau
Re : détection modification contenu cellules

C'est exactement ça Robert!
Pour le fichier, c'est tjs la même chose, je suis confrontée à un pb de confidentialité...
Penses tu que si je copie/colle dans le code du "Model" les CM_Worksheet à la place des Worksheet au lieu de les appeler ça pourrait régler le pb sans générer d'autres bug?

Bonjour PierreJean, je viens de regarder le fichier et j'avoue que je ne comprends pas son fonctionnement... De plus, étant donné la structure du programme que j'essaie de modifier, je ne vois pas où insérer le code...
J'ai tout de même essayé de l'insérer dans mon code mais ça ne fonctionne pas. Mais je ne sais pas si je l'ai fait correctement...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : détection modification contenu cellules

Bonjour le fil, bonjour le forum,

Pour ton problème de confidentialité c'est simple. Tu pars d'un classeur vierge et tu reproduis la strucuture de ton classeur original (nom des onglets, plages nommées, code VBA, etc.). Ensuite une poignée de données non confidentielle (blabla1, blabla2, etc.) suffit pour qu'on comprenne le fonctionnement et te propose une éventuelle solution.
 

Noe06

XLDnaute Nouveau
Re : détection modification contenu cellules

Bonjour à tous,

Avec de l'aide j'ai pu détecter d'où venait le bug:
mes WorksheetChange et Worksheet_SelectionChange intervenaient sur les mêmes cellules!
J'ai donc:
- ajouté des conditions afin de préciser les plages de cellules qui concernaient chacun
- ajouté le code suivant dans le Worksheet_Change:

Code:
Dim Plage As Range

Set Plage = Range("A5:N50")
If Application.Intersect(Target, Plage) Is Nothing Then
        'Hors cible on ne fait rien.
Else
        Range("L2").Value = Date
End If

Depuis tout fonctionne!

Merci à tous pour votre aide!
 

Discussions similaires

Réponses
8
Affichages
654

Statistiques des forums

Discussions
312 198
Messages
2 086 107
Membres
103 120
dernier inscrit
83400ren