Historique saisie feuilles excel
lamarie028
Messages postés
8
Statut
Membre
-
Patrice33740 Messages postés 8400 Date d'inscription Statut Membre Dernière intervention -
Patrice33740 Messages postés 8400 Date d'inscription Statut Membre Dernière intervention -
Bonjour
J'ai un fichiers excel ou plusieurs personnes peuvent être amenées à réaliser des modifications.
Afin de garder un historique des saisies, j'ai trouver un code de sauvegarde de "saisie de cellules" qui se reporte sur une autre feuille du même classeur.
Mais le problème est que lorsque je veux modifier le texte de la cellule cette dernière ne conserve pas le changement mais dans mon fichier de sauvegarde ("Modifications") on me reporte bien la modifications.
Merci de bien vouloir m'aider à soit modifier le code ou me donner un autre code qui fonctionne car j'ai navigué sur plein de forum mais je ne trouve de solution à mon problème.
Voici le code utiliser :
Cordialement
Lamarie
J'ai un fichiers excel ou plusieurs personnes peuvent être amenées à réaliser des modifications.
Afin de garder un historique des saisies, j'ai trouver un code de sauvegarde de "saisie de cellules" qui se reporte sur une autre feuille du même classeur.
Mais le problème est que lorsque je veux modifier le texte de la cellule cette dernière ne conserve pas le changement mais dans mon fichier de sauvegarde ("Modifications") on me reporte bien la modifications.
Merci de bien vouloir m'aider à soit modifier le code ou me donner un autre code qui fonctionne car j'ai navigué sur plein de forum mais je ne trouve de solution à mon problème.
Voici le code utiliser :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name <> "Modifications" Then
Application.EnableEvents = False
valsaisie = Target
Application.Undo
temp = Application.CountA(Sheets("modifications").Range("a:a")) + 1
Sheets("modifications").Cells(temp, 1) = Sh.Name
Sheets("modifications").Cells(temp, 2) = Target.Address
Sheets("modifications").Cells(temp, 3) = Now
Sheets("modifications").Cells(temp, 4) = Target
Sheets("modifications").Cells(temp, 5) = valsaisie
Sheets("modifications").Cells(temp, 6) = Environ("username")
Target = valsaisie
Application.EnableEvents = True
End If
End Sub
Cordialement
Lamarie
4 réponses
-
Bonjour,
Ce code marche tres bien ....!!!!!!!-
-
-
-
Re,
certaine feuilles excel exclusivement
modifiez cette ligne en ajoutantIf Sh.Name <> "Modifications" And Sh.Name <> "TOTO" And Sh.Name <> "Feuil1" Then
avec autant de And que de test <> si moins de feuilles <> que de feuilles de saisie
autrement ce sont des testOr Sh.Name="Feuil2"
Or etc
une facon de coder un peut plus structure:Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "Modifications" Then Application.EnableEvents = False valsaisie = Target Application.Undo With Worksheets("modifications") temp = Application.CountA(.Range("a:a")) + 1 .Cells(temp, 1) = Sh.Name .Cells(temp, 2) = Target.Address .Cells(temp, 3) = Now .Cells(temp, 4) = Target .Cells(temp, 5) = valsaisie .Cells(temp, 6) = Environ("username") End With Target = valsaisie Application.EnableEvents = True End If End Sub
-
-
Bonjour,
Ton code ne fonctionne pas aussi bien qu'il devrait :
- lorsque plusieurs cellules sont modifiées simultanément (copier/ coller, Incrémenter en tirant une plage de valeurs, saisie matricielle, ...)
- lorsque la valeur n'est pas modifiée.
Voici une proposition :Option Explicit Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range) Dim dic As Object, clé As Variant Dim sel As Range, act As Range, tgt As Range, usr As Range, cel As Range Dim val As Variant Dim n°L As Long If sh.Name <> "Modifications" Then Set dic = CreateObject("Scripting.Dictionary") 'Mémoriser le contexte initial Set sel = Selection Set act = ActiveCell With Worksheets("Modifications") 'Mémoriser les nouvelles valeurs non vides Set usr = Intersect(Target, sh.UsedRange) If Not usr Is Nothing Then val = usr.Value For Each cel In usr.Cells If cel.Formula <> "" Then dic(cel.Address) = cel.Value End If Next cel End If Application.EnableEvents = False Application.Undo Set tgt = Intersect(Target, sh.UsedRange) If Not tgt Is Nothing Then For Each cel In tgt.Cells n°L = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 If dic.Exists(cel.Address) Then If cel.Value <> dic(cel.Address) Then .Cells(n°L, 1).Value = sh.Name .Cells(n°L, 2).Value = cel.Address .Cells(n°L, 3).Value = Now .Cells(n°L, 4).Value = cel.Value .Cells(n°L, 5).Value = dic(cel.Address) .Cells(n°L, 6).Value = Environ("username") End If dic.Remove cel.Address Else .Cells(n°L, 1).Value = sh.Name .Cells(n°L, 2).Value = cel.Address .Cells(n°L, 3).Value = Now .Cells(n°L, 4).Value = cel.Value .Cells(n°L, 5).Value = "" .Cells(n°L, 6).Value = Environ("username") End If Next cel End If If dic.Count > 0 Then For Each clé In dic.Keys n°L = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 .Cells(n°L, 1).Value = sh.Name .Cells(n°L, 2).Value = clé .Cells(n°L, 3).Value = Now .Cells(n°L, 4).Value = sh.Range(clé).Value .Cells(n°L, 5).Value = dic(clé) .Cells(n°L, 6).Value = Environ("username") Next clé dic.RemoveAll End If Target.ClearContents If Not usr Is Nothing Then usr.Value = val End With 'Rétablir le contexte initial sel.Select act.Activate Application.EnableEvents = True End If End Sub
Attention, lorsque c'est une macro qui modifie une valeur, pour éviter que ce code se plante sur le Undo, il faut prévoir dans la macro, avant de modifier la valeur, de désactiver les évènements puis les réactiver après.
Cordialement
Patrice -
J'ai essayé les 2 propositions et navré d'annoncé que les 2 me donne un message d'erreur :
" La méthode 'Undo' de l'objet à échoué " -
Alors non je ne suis pas en version antérieur excel, je travaille sur office 2013.
Donc pour être sur de bien faire car je ne suis pas hyper pro en excel vba.
Ton code je le met dans worbook??
Et quand tu dis désactiver les événements ca consiste à faire quoi??
Navré d'être ausii nul