Menu

Historique saisie feuilles excel

lamarie028 8 Messages postés samedi 13 janvier 2018Date d'inscription 13 janvier 2018 Dernière intervention - 13 janv. 2018 à 02:17 - Dernière réponse : Patrice33740 7121 Messages postés dimanche 13 juin 2010Date d'inscription 21 juillet 2018 Dernière intervention
- 15 janv. 2018 à 11:41
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 :

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
Afficher la suite 

Votre réponse

22 réponses

f894009 13279 Messages postés dimanche 25 novembre 2007Date d'inscription 21 juillet 2018 Dernière intervention - 13 janv. 2018 à 06:54
0
Merci
Bonjour,

Ce code marche tres bien ....!!!!!!!
lamarie028 8 Messages postés samedi 13 janvier 2018Date d'inscription 13 janvier 2018 Dernière intervention - 13 janv. 2018 à 10:21
Oui effectivement ce code fonctionne pour la copie de la saisie mais dans la cellule d'origine la modification n’apparaît pas???
f894009 13279 Messages postés dimanche 25 novembre 2007Date d'inscription 21 juillet 2018 Dernière intervention - 13 janv. 2018 à 11:48
Re,

cellule d'origine la modification n’apparaît pas???
Chez moi, si je modifie une cellule, cette modif est effective dans la dite cellule..!!!!!!
lamarie028 8 Messages postés samedi 13 janvier 2018Date d'inscription 13 janvier 2018 Dernière intervention - 13 janv. 2018 à 11:58
Je viens de me rendre compte qu'il y une incompatibilité avec certaine feuille de mon classeur qui enregistre les données d'un userform.
Comment modifier le code de sauvegarde de saisie pour certaine feuilles excel exclusivement et non tout le classeur.
f894009 13279 Messages postés dimanche 25 novembre 2007Date d'inscription 21 juillet 2018 Dernière intervention - 13 janv. 2018 à 15:59
Re,

certaine feuilles excel exclusivement
modifiez cette ligne en ajoutant
If 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 test
Or 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
Commenter la réponse de f894009
Patrice33740 7121 Messages postés dimanche 13 juin 2010Date d'inscription 21 juillet 2018 Dernière intervention - Modifié par Patrice33740 le 13/01/2018 à 18:02
0
Merci
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
lamarie028 8 Messages postés samedi 13 janvier 2018Date d'inscription 13 janvier 2018 Dernière intervention - 13 janv. 2018 à 18:14
Merci beaucoup pour tous ses codes et explications, je test et vous redis?
Commenter la réponse de Patrice33740
lamarie028 8 Messages postés samedi 13 janvier 2018Date d'inscription 13 janvier 2018 Dernière intervention - 13 janv. 2018 à 19:06
0
Merci
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é "
Patrice33740 7121 Messages postés dimanche 13 juin 2010Date d'inscription 21 juillet 2018 Dernière intervention - 13 janv. 2018 à 19:08
Tu n'as pas appliqué ce que je t'ai dis après le code ! (désactiver les évènement ...), à moins que tu n'utilises une version Excel antérieure à 2007.
Commenter la réponse de lamarie028
lamarie028 8 Messages postés samedi 13 janvier 2018Date d'inscription 13 janvier 2018 Dernière intervention - 13 janv. 2018 à 19:15
0
Merci
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
Bonjour
Merci énormément pour votre aide.
Vous m'avez enlever un grosse épine du pied, cela fonctionne a merveille.
Cordialement
Patrice33740 7121 Messages postés dimanche 13 juin 2010Date d'inscription 21 juillet 2018 Dernière intervention - 15 janv. 2018 à 10:10
Lequel des 2 fichiers utilises-tu ?
Pour le moment je fais des test sur les 2 fichiers fournies.
J'ai juste un légers soucis avec celui de Patrice33740 car tu as modifier une ligne de code pour la sauvegarde d'une saisie d'un userform. Car le sauvegarde ne se fait en haut de mon tableau mais à la ligne 1000.
Code :With .Range("A" & .Rows.Count).End(xlUp).Offset(1)
Patrice33740 7121 Messages postés dimanche 13 juin 2010Date d'inscription 21 juillet 2018 Dernière intervention > lamarie028 - 15 janv. 2018 à 11:41
Effectivement, je n'avais pas regardé comment sont formatées tes feuilles réceptrices.
Cette ligne permet d'aller de façon certaine sur la ligne située après la dernière ligne utilisée, ça écrit sur la ligne 1000 c'est parce que tu as surdimensionné ton tableau avec des lignes inutilisées jusqu'à la ligne 1000 (un tableau se redimensionne automatiquement quand on y ajoute des lignes)

Pour t'éviter de redimensionner tes tableaux, voici ton fichier :
https://mon-partage.fr/f/pBz41V2S/

où j'ai remplacé :
With .Range("A" & .Rows.Count).End(xlUp).Offset(1)
Par
With .Range("A2").End(xlDown).Offset(1)
Notes que cette méthode s'arrête sur la première ligne vide rencontrée qui n'est pas forcement après la dernière ligne utilisée.

« je ne peux plus supprimer les cellules » c'est-à-dire ? dans quel cas ?
C'est pareil pour ton fichier Patrice33740 je ne peux plus supprimer les cellules est ce normal??
Commenter la réponse de lamarie028