Historique saisie feuilles excel
lamarie028
Messages postés
8
Statut
Membre
-
Patrice33740 Messages postés 8930 Statut Membre -
Patrice33740 Messages postés 8930 Statut Membre -
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
A voir également:
- Historique saisie feuilles excel
- Liste déroulante excel - Guide
- Historique presse-papier android - Guide
- Word et excel gratuit - Guide
- Fusionner feuilles excel - Guide
- Déplacer colonne excel - Guide
4 réponses
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 :
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
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é "
" 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
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
cellule d'origine la modification n’apparaît pas???
Chez moi, si je modifie une cellule, cette modif est effective dans la dite cellule..!!!!!!
Comment modifier le code de sauvegarde de saisie pour certaine feuilles excel exclusivement et non tout le classeur.
certaine feuilles excel exclusivement
modifiez cette ligne en ajoutant
avec autant de And que de test <> si moins de feuilles <> que de feuilles de saisie
autrement ce sont des test 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