Copier une cellule

maynou24 -  
rEVOLV3r Messages postés 223 Date d'inscription   Statut Membre Dernière intervention   -
je suis bloqué dès le matin
je suis entrain de créer un historique d'une cellule dans un fichier excel. l'historique enregistre la valeur ancienne de la cellule, la date et l'horaire de changement et l'utilisateur qui a fait le changement. je veux aussi qu'il enregistre la cellule qui ce trouve dans la 2ème colonne et la ligne de la cellule changée. par exemple si j'ai changé la cellule qui se trouve dans la ligne 5 et la colonne 6, dans l'historique il m'affiche le contenu de la cellule de la ligne 5 et la colonne 2.
je ne sais pas si c'est clair !!

1 réponse

  1. rEVOLV3r Messages postés 223 Date d'inscription   Statut Membre Dernière intervention   28
     
    Bonjour,

    Vous devez passer par une macro VBA qui gère l'évènementiel de la page.

    Mettre dans le module de la feuille en question :

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ws_histo As Worksheet
    Set ws_histo = ThisWorkbook.Sheets("Histo")
    Dim lastcell As Range
    On Error GoTo fin
    'Sélectionne uniquement la colonne n°1 pour l'évènementiel des changements
    If Target.Column = 1 Then
    Set lastcell = ws_histo.Columns(1).Find("*", , , , xlByColumns, xlPrevious)
    lastcell.Offset(1, 0).Value = Target.Address
    lastcell.Offset(1, 1).Value = Now
    lastcell.Offset(1, 2).Value = Application.UserName
    End If
    Exit Sub
    fin:
    MsgBox "Une erreur est apparue, l'historique n'a pas été sauvegardé", vbCritical + vbOKOnly, "Error"
    End Sub

    Créer un onglet nommé "Histo"

    Chaque modification d'une cellule de la colonne 1 engendrera une nouvelle entrée dans la page Histo
    0
    1. rEVOLV3r Messages postés 223 Date d'inscription   Statut Membre Dernière intervention   28
       
      Oups il manque la valeur :
      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim ws_histo As Worksheet
      Set ws_histo = ThisWorkbook.Sheets("Histo")
      Dim lastcell As Range
      On Error GoTo fin
      'Sélectionne uniquement la colonne n°1 pour l'évènementiel des changements
      If Target.Column = 1 Then
      Set lastcell = ws_histo.Columns(1).Find("*", , , , xlByColumns, xlPrevious)
      lastcell.Offset(1, 0).Value = Target.Address
      lastcell.Offset(1, 1).Value = Target.Value
      lastcell.Offset(1, 2).Value = Now
      lastcell.Offset(1, 3).Value = Application.UserName
      End If
      Exit Sub
      fin:
      MsgBox "Une erreur est apparue, l'historique n'a pas été sauvegardé", vbCritical + vbOKOnly, "Error"
      End Sub



      Bien entendu, a chaque changement, cela enregistrera le changement actuel et pas l'ancien. L'historique prendra la nouvelle valeur en dernière ligne et il suffira de le trier par rapport à l'adresse afin de voir tout son historique.
      0
    2. maynou24
       
      merciii beaucoup.. si je veux que l'historique commence de la 5ème ligne: cela dire que dans votre exemple la ligne : adresse, date, utilisateur soit dans la ligne 4.. comment je peux le faire ?
      0
    3. rEVOLV3r Messages postés 223 Date d'inscription   Statut Membre Dernière intervention   28
       
      Bonjour,
      soit : remplacer la ligne set lastcell par celle-ci :
      Set lastcell = ws_histo.Range("A4:A1048576").Find("*", , , , xlByColumns, xlPrevious)

      ou plus simple : mettre des données dans les cellules A1, A2 et A3. cela peut être juste une valeur ou une lettre. la ligne de code set lastcell renvoi la première cellule non vide de la colonne 1.
      0