IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Log des modifications apportées à une ou plusieurs cellules


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 44
    Par défaut Log des modifications apportées à une ou plusieurs cellules
    Bonsoir à tous,

    Je planche sur une idée depuis plusieurs jours :
    Dans mon travail j'utilise des documents excel que je dois remplir, notre dernier audit nous demande d'avoir une tracabilité des modifications apportées (un audit log)
    J'ai cherché et trouvé comment faire cela, mais le programme ne fonctionne QUE si on ne modifie les cellules UNE A UNE.
    Or il arrive que je colle des données (la tableau pouvant avoir une taille variable en fonction des cas)

    J'ai cherché comment faire la même chose en utilisant un système de variable qui est variable pour mémoriser l'ancienne et la nouvelle valeur de chaque cellule de l'ensemble selectionné.

    Le programme fonctionne presque mais il n'arrive jamais à bout : avez-vous une idée ?
    Je planche sérieusement là ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Dim PreviousValue() As String
    Dim thecell
    Dim j As Integer
     
    Private Sub Worksheet_change(ByVal target As Range)
     
     
     
    j = Selection.Cells.Count
    i = j
     
            For Each thecell In target
                For j = 1 To i
                    Sheets("Log").Cells(6500, 1).End(xlUp).Offset(1, 0).Value = _
                    Application.UserName & " changed Cell " & target(j).Address _
                    & " from " & PreviousValue(j) & " To " & target(j).Value
                    If j = i Then
                        Exit Sub
                    End If
                Next
            Next
            Exit Sub
     
    End Sub
     
     
     
    Private Sub Worksheet_selectionchange(ByVal target As Range)
     
        j = Selection.Cells.Count
        i = j
     
        ReDim PreviousValue(1 To j)
        MsgBox j
     
        For Each thecell In target
            For j = 1 To i
                PreviousValue(j) = target(j).Value
                'MsgBox PreviousValue(j)
                'MsgBox target(j).Address
                If j = i Then
                    Exit Sub
                End If
     
            Next
        Next
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 436
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser le "Suivi des modifications" (onglet Révision, groupe Modifications) ?

    Cordialement

  3. #3
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 44
    Par défaut
    Je connaissais pas je l'ai découvert grace a toi cette fonction !!! ;-)


    Elle est super interessante mais dans le cas de plusieurs modif sur la meme cellule la fonction suivie des modifications ne transcrit que la dernière modification ….
    J'ai besoin de lister TOUTES les modifications faites … sur une ou un ensemble de cellules et de les noter au fur et a mesures qu'elles sont faites.


    Tu peux m'aider ? :-)

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 436
    Par défaut
    Bonjour,

    Les documents Excel à "logger" sont-ils
    1) "partagés": plusieurs utilisateurs peuvent être en même temps occupés dessus et y apporter des modifications, ou
    2) il n'y a que 1 personne à la fois qui travaille sur chacun de ces documents Excel ?

    Si (2), l'historique pourrait se faire au moment de la sauvegarde, assez simplement par balayage des cellules (pour autant qu'il ne soit pas demandé de logger les modifications intermédiaires sur une même cellule).
    Si (1), plus compliqué effectivement.

    Cdt

  5. #5
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 436
    Par défaut
    Bonjour,

    Un début de solution pour un log en continu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Option Explicit
     
    Dim shtLog As Worksheet    '--- feuille log
    Dim sPlage As String       '--- plage à logger
    Dim kRz As Long            '--- dernière ligne de la plage à logger
    Dim kCz As Long            '--- dernière colonne de la plage à logger
     
    Private Sub Initialiser()
       Set shtLog = Sheets("Log")
       sPlage = "A1:Z100"
       kRz = 100
       kCz = 26
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim kR As Integer, kC As Integer
       Dim nR As Integer, nC As Integer
       Dim kRLog As Long
       Initialiser
       If Intersect(Target, Range(sPlage)) Is Nothing Then
          '--- ne rien faire: pas de changement
       Else
          '--- logger: changement détecté
          nR = Selection.Rows.Count        '--- erreur si colonne entière sélectionnée
          nC = Selection.Columns.Count     '--- erreur si ligne entière sélectionnée
          'Debug.Print nR, nC
          kRLog = shtLog.Cells(Rows.Count, 1).End(xlUp).Row   '--- dernière ligne + 1
          For kR = Target.Row To Target.Row + nR - 1
             For kC = Target.Column To Target.Column + nC - 1
                kRLog = kRLog + 1
                With shtLog
                   .Cells(kRLog, 1) = Now()
                   .Cells(kRLog, 2) = Environ("USERNAME")
                   .Cells(kRLog, 3) = Cells(kR, kC).Address(False, False)
                   .Cells(kRLog, 4) = Cells(kR, kC)
                End With
             Next kC
          Next kR
        End If
    End Sub
    Cordialement.
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je me permets.

    A toute fin utile.
    Dans l'explorateur, un clic droit sur le nom du classeur permet d'afficher ses propriétés.
    Parmi celles-ci, figurent les versions précédentes dont la copie dans un répertoire annexe est possible..

  7. #7
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 44
    Par défaut
    Citation Envoyé par EricDgn Voir le message
    Bonjour,

    Un début de solution pour un log en continu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Option Explicit
     
    Dim shtLog As Worksheet    '--- feuille log
    Dim sPlage As String       '--- plage à logger
    Dim kRz As Long            '--- dernière ligne de la plage à logger
    Dim kCz As Long            '--- dernière colonne de la plage à logger
     
    Private Sub Initialiser()
       Set shtLog = Sheets("Log")
       sPlage = "A1:Z100"
       kRz = 100
       kCz = 26
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim kR As Integer, kC As Integer
       Dim nR As Integer, nC As Integer
       Dim kRLog As Long
       Initialiser
       If Intersect(Target, Range(sPlage)) Is Nothing Then
          '--- ne rien faire: pas de changement
       Else
          '--- logger: changement détecté
          nR = Selection.Rows.Count        '--- erreur si colonne entière sélectionnée
          nC = Selection.Columns.Count     '--- erreur si ligne entière sélectionnée
          'Debug.Print nR, nC
          kRLog = shtLog.Cells(Rows.Count, 1).End(xlUp).Row   '--- dernière ligne + 1
          For kR = Target.Row To Target.Row + nR - 1
             For kC = Target.Column To Target.Column + nC - 1
                kRLog = kRLog + 1
                With shtLog
                   .Cells(kRLog, 1) = Now()
                   .Cells(kRLog, 2) = Environ("USERNAME")
                   .Cells(kRLog, 3) = Cells(kR, kC).Address(False, False)
                   .Cells(kRLog, 4) = Cells(kR, kC)
                End With
             Next kC
          Next kR
        End If
    End Sub
    Cordialement.
    Salut Eric,

    Ton code est sympa mais j'ai également besoin de connaitre la valeur avant modification ...
    Et mon code coince dans le cas ou par exemple je copie/colle plusieurs cellules d'un coup ... je n'arrive pas a mémoriser toutes les valeurs d'origines ....

    Tu as une idée ?

    ++

  8. #8
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 44
    Par défaut
    Citation Envoyé par EricDgn Voir le message
    Bonjour,

    Les documents Excel à "logger" sont-ils
    1) "partagés": plusieurs utilisateurs peuvent être en même temps occupés dessus et y apporter des modifications, ou
    2) il n'y a que 1 personne à la fois qui travaille sur chacun de ces documents Excel ?

    Si (2), l'historique pourrait se faire au moment de la sauvegarde, assez simplement par balayage des cellules (pour autant qu'il ne soit pas demandé de logger les modifications intermédiaires sur une même cellule).
    Si (1), plus compliqué effectivement.

    Cdt
    Ben justement :

    Une seule personne travaille à la fois sur le documents mais j'ai besoin d'avoir toutes les modifications effectuées même si une cellule a été modifiées plusieurs fois (pour une question de suivie et tracabilité) et en plus j'ai besoin à chaque fois de connaitre la valeur AVANT et APRES modification. Et ca doit fonctionner pour une cellule modidiée ET pour plusieurs cellules (dans le document on est amené à coller une ensemble de données de plusieurs cellules (nombre totalement variable)).

    Si tu as une idée je suis preneur : mon code a moi coince pour mémoriser les valeurs avant modif dans le cas de plusieurs cellules modifiées ....

  9. #9
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 436
    Par défaut
    Bonjour,

    A mon avis le plus simple est d'avoir une copie (masquée) de la feuille travaillée, et de l'utiliser pour reprendre les anciennes valeurs puis mettre les nouvelles après encodage du log.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Option Explicit
     
    Dim shLog As Worksheet     '--- feuille log
    Dim shCopy As Worksheet    '--- feuille copie de la feuille loggée
    Dim sPlage As String       '--- plage à logger
     
    Private Sub Initialiser()
       Set shLog = Sheets("Log")
       Set shCopy = Sheets("Data2")
       sPlage = "A1:Z100"
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim kR As Integer, kC As Integer
       Dim nR As Integer, nC As Integer
       Dim kRLog As Long
       Initialiser
       If Intersect(Target, Range(sPlage)) Is Nothing Then
          '--- ne rien faire: pas de changement
       Else
          '--- logger: changement détecté
          nR = Selection.Rows.Count        '--- erreur si colonne entière sélectionnée
          nC = Selection.Columns.Count     '--- erreur si ligne entière sélectionnée
          'Debug.Print nR, nC
          kRLog = shLog.Cells(Rows.Count, 1).End(xlUp).Row   '--- dernière ligne + 1
          For kR = Target.Row To Target.Row + nR - 1
             For kC = Target.Column To Target.Column + nC - 1
                kRLog = kRLog + 1
                With shLog
                   .Cells(kRLog, 1) = Now()
                   .Cells(kRLog, 2) = Environ("USERNAME")
                   .Cells(kRLog, 3) = Cells(kR, kC).Address(False, False)
                   .Cells(kRLog, 4) = shCopy.Cells(kR, kC)   '--- ancienne valeur
                   .Cells(kRLog, 5) = Cells(kR, kC)          '--- nouvelle valeur
                   shCopy.Cells(kR, kC) = Cells(kR, kC)      '--- nouvelle valeur
                End With
             Next kC
          Next kR
        End If
    End Sub
    Ce code ne gère pas vraiment les ajouts et suppressions de lignes ou colonnes entières.

    Cordialement.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. enregistrer des modifications dans une requête
    Par Lenalyon dans le forum WinDev
    Réponses: 1
    Dernier message: 14/02/2007, 10h58
  2. Annuler les modifications apportées à une table.
    Par PadawanDuDelphi dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/10/2006, 09h26
  3. logging des index pour une BD standby
    Par learn dans le forum Oracle
    Réponses: 8
    Dernier message: 14/12/2005, 12h14
  4. Faire des modifs sur une sheet excel Read Only via VBA
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/11/2005, 18h02
  5. Fichier log des requêtes d'une bdd
    Par Sub0 dans le forum Administration
    Réponses: 4
    Dernier message: 22/03/2004, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo