Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Conserver un log des modifications

29 réponses
Avatar
Apitos
Bonjour,

J'aimerais avoir dans une deuxième feuille "Log", l'historique des modifications apportées dans la feuille "BDD".

En PJ, un exemple primaire de ce que j'aimerais obtenir.

https://www.cjoint.com/c/KBztpPTEyMr

Les modifications devront être enregistrées dans la feuille "Log" en même temps que la saisie des nouvelles données dans la feuille "BDD".

Par exemple, je voudrais modifier l'adresse "Adr1" et la remplacer par "Adr2".

Par conséquent, "Adr1" doit être inscrit dans la feuille 2 "Log" et devant lui, dans le tableau, ce qui a été modifié Í  savoir "Adr2", la date de la modification et la personne qui a effectué cette modification.

Merci d'avance.

10 réponses

1 2 3
Avatar
MichD
Le 25/02/21 Í  14:16, Apitos a écrit :
Bonjour,
J'aimerais avoir dans une deuxième feuille "Log", l'historique des modifications apportées dans la feuille "BDD".
En PJ, un exemple primaire de ce que j'aimerais obtenir.
https://www.cjoint.com/c/KBztpPTEyMr
Les modifications devront être enregistrées dans la feuille "Log" en même temps que la saisie des nouvelles données dans la feuille "BDD".
Par exemple, je voudrais modifier l'adresse "Adr1" et la remplacer par "Adr2".
Par conséquent, "Adr1" doit être inscrit dans la feuille 2 "Log" et devant lui, dans le tableau, ce qui a été modifié Í  savoir "Adr2", la date de la modification et la personne qui a effectué cette modification.
Merci d'avance.

Bonjour,
Sois plus précis. Est-ce seulement les données de la colonne B qui
t'intéresse ou toutes les cellules de la feuille "BD"?
Que doit-il se passer si une nouvelle ligne de données est saisie?
Exemple : La ligne 4 est vide.
Que se passe-t-il si tu saisis une donnée en A4 et ensuite B4?
Que doit-il se passer si tu saisis des données ailleurs que dans la
colonne A et B ?
MichD
Avatar
apt apt
Bonjour MichD,
//Sois plus précis. Est-ce seulement les données de la colonne B qui t'intéresse ou toutes les cellules de la feuille "BD"?
N'importe quelle cellule dans la feuille, est concernée.
//Que doit-il se passer si une nouvelle ligne de données est saisie ?
Normalement, elle sera considérée comme une modification dans la feuille, et toutes les cellules saisies dans cette ligne devront apparaÍ®tre, avec leurs adresses, dans le log.
//Que se passe-t-il si tu saisis une donnée en A4 et ensuite B4 ?
Les deux cellules seront mentionnées comme données modifiées dans "Log", avec un lien qui renvoie vers les adresses des cellules modifiées.
//Que doit-il se passer si tu saisis des données ailleurs que dans la colonne A et B ?
Normalement, les modifications seront limitées par le tableau de données.
Seulement, si un jour un utilisateur décide d'ajouter par exemple une colonne, la zone de traitement s'élargit pour prendre en compte cette nouvelle colonne.
D'autres idées peuvent être ajoutées selon l'utilisation de ce fichier.
Merci.
Avatar
MichD
Ton tableau dans la feuille "Log" devrait être le suivant :
En Colone A : Adresse de la cellule qui a été modifiée
En Colone B : ancienne valeur de la cellule qui a été modifiée
En Colone C : La nouvelle valeur qui remplace l'ancienne valeur
En Colone D : La date + l'heure de la modification de la cellule.
En Colone E : Le nom de l'usager du profil de l'usager sur cet
ordinateur
Tout le code se trouve dans le module de la feuille "BDD".
Dans la feuille "BDD", la procédure empêche une sélection multiple
de cellules afin de suivre de déroulement des modifications.
'Déclaration dans le haut du module de la feuille
Dim MaVar As Variant
'---------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value <> MaVar Then
With Feuil2 'Feuille Log
DerLig = .Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 1
Application.EnableEvents = False
'Adresse o͹ il y a eu une modification
.Range("a" & DerLig) = Target.Address
'L'ancienne valeur qu'avait cette cellule
.Range("B" & DerLig) = MaVar
'La nouvelle valeur suite Í  la modification
.Range("C" & DerLig) = Target.Value
'La date + Heure de la modification
.Range("D" & DerLig) = Now()
'Le nom de l'usager connecté
.Range("E" & DerLig) = Environ("USERNAME")
Application.EnableEvents = True
End With
End If
End Sub
'---------------------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count > 1 Then
Target.Cells(1, 1).Select
End If
MaVar = Target.Value
End Sub
'---------------------------------------------------
MichD
Avatar
MichD
Ton fichier : https://www.cjoint.com/c/KBAcTQrTc2j
MichD
Avatar
Apitos
Bonjour MichD,
Merci pour le fichier.
J'ai essayé d'adapter le code, en u ajoutant, le titre de la colonne modifiée, le nom de la feuille (dans le cas ou il y a plusieurs feuille) et le lien hypertexte vers la cellule modifiée.
Le fichier peut être modifié par plusieurs utilisateurs, chacun avec son user et mot de passe.
Voici le code :
'---------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value <> MaVar Then
With Feuil2 'Feuille Log
DerLig = .Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 1
Application.EnableEvents = False
'En-tète de la colonne o͹ il y a eu une modification
.Range("A" & DerLig) = [Données].Offset(-1).Item(1, Target.Column)
'Feuille o͹ il y a eu une modification
.Range("B" & DerLig) = Range("Données").Parent.Name
With .Range("C" & DerLig)
.Select
'Adresse o͹ il y a eu une modification
.Value = Target.Address
'Création de lien vers la cellule modifiée
.Hyperlinks.Add Anchor:=Selection, Address:=ClasseurDestination, SubAddress:="'" & FeuilleDestination & "'" & "!" & AdresseDestination, TextToDisplay:=TexteLien
End With
'L'ancienne valeur qu'avait cette cellule
.Range("D" & DerLig) = MaVar
'La nouvelle valeur suite Í  la modification
.Range("E" & DerLig) = Target.Value
'La date + Heure de la modification
.Range("F" & DerLig) = Now()
'Le nom de l'usager connecté
.Range("G" & DerLig) = "UtilisateurX" ' Selon l'utilisateur qui a effectué la modification
Application.EnableEvents = True
End With
End If
End Sub
'---------------------------------------------------
--> Pour supprimer une ligne, il faut vider chaque cellule de la ligne concernée, une par une, et cette dernière reste vide.
Avatar
MichD
Voici ton fichier : https://www.cjoint.com/c/KBAmSPGCshj
Pour le nom de l'usager, tu observeras un délai d'une seconde ou deux
lors d'une modification dans l'une des feuilles. La fonction
"GetUserFullName" requiert ce temps. Tu as toujours la proposition faite
hier de disponible si tu préfères.
Les procédures s'appliquent Í  toutes les feuilles du classeur sauf la
feuille "Log".
Dans ton classeur, fais la mise en page de chacune des feuilles avant
d'ajouter le code contenu dans le ThisWorkbook.
MichD
Avatar
MichD
Le 26/02/21 Í  07:50, MichD a écrit :
Voici ton fichier :  https://www.cjoint.com/c/KBAmSPGCshj
Pour le nom de l'usager, tu observeras un délai d'une seconde ou deux
lors d'une modification dans l'une des feuilles. La fonction
"GetUserFullName" requiert ce temps. Tu as toujours la proposition faite
hier de disponible si tu préfères.
Les procédures s'appliquent Í  toutes les feuilles du classeur sauf la
feuille "Log".
Dans ton classeur, fais la mise en page de chacune des feuilles avant
d'ajouter le code contenu dans le ThisWorkbook.
MichD

J'ai apporté une petite modification. Le délai observé existe seulement
pour la première modification faite Í  une cellule de la feuille.
https://www.cjoint.com/c/KBAntwq0Sjj
MichD
Avatar
MichD
Le 26/02/21 Í  08:21, MichD a écrit :
Le 26/02/21 Í  07:50, MichD a écrit :
Voici ton fichier :  https://www.cjoint.com/c/KBAmSPGCshj
Pour le nom de l'usager, tu observeras un délai d'une seconde ou deux
lors d'une modification dans l'une des feuilles. La fonction
"GetUserFullName" requiert ce temps. Tu as toujours la proposition
faite hier de disponible si tu préfères.
Les procédures s'appliquent Í  toutes les feuilles du classeur sauf la
feuille "Log".
Dans ton classeur, fais la mise en page de chacune des feuilles avant
d'ajouter le code contenu dans le ThisWorkbook.
MichD

J'ai apporté une petite modification. Le délai observé existe seulement
pour la première modification faite Í  une cellule de la feuille.
 https://www.cjoint.com/c/KBAntwq0Sjj
MichD

Une petite variante intéressante :
https://www.cjoint.com/c/KBAn4JMoM6j
MichD
Avatar
apt apt
Merci pour l'exemple.
Tu as toujours la proposition faite hier de disponible si tu préfères.


- euh, quelle proposition, j'ai relais les réponses précédentes et je ne la trouve pas ?
Dans ton classeur, fais la mise en page de chacune des feuilles avant


d'ajouter le code contenu dans le ThisWorkbook.
- Si j'applique une mise en forme de tableau structuré, le code changera ?
- Je ne peux toujours pas supprimé une ligne complète.
- Pour les usagers, il doit s'agir des noms des agents agissant sur ce fichier, et non pas le nom du compte Windows.
Avatar
MichD
Le 26/02/21 Í  12:38, apt apt a écrit :
Merci pour l'exemple.
Tu as toujours la proposition faite hier de disponible si tu préfères.


- euh, quelle proposition, j'ai relais les réponses précédentes et je ne la trouve pas ?

**** Cela fait référence au nom du profil défini sur l'ordinateur de
l'usager. Environ("UserName")
Dans ton classeur, fais la mise en page de chacune des feuilles avant


d'ajouter le code contenu dans le ThisWorkbook.
- Si j'applique une mise en forme de tableau structuré, le code changera ?

**** Le seul élément de format de cellule que j'ai mis en place dans le
tableau, c'est de centrer le texte du tableau dans chacune des
cellules au fur et Í  mesure que tu ajoutes de nouvelles lignes.
- Je ne peux toujours pas supprimé une ligne complète.

**** Dans toutes les feuilles sauf "Log", il est impossible de
sélectionner plus d'une cellule. Si tu préfères, on peut modifier le
code afin de sélectionner toutes les cellules que tu veux, mais
l'enregistrement des modifications se fera seulement si UNE cellule
est sélectionnée et modifiée.
- Pour les usagers, il doit s'agir des noms des agents agissant sur ce fichier, et non pas le nom du compte Windows.

**** Excel ne peut pas deviner le nom de la personne qui est assis
devant l'ordinateur. Pendant que le fichier est ouvert, plusieurs
personnes peuvent apporter des modifications au fichier. IL n'y a
pas d'autres moyens d'automatiser cela que de demander Í  l'usager
de s'identifier Í  chaque modification. Ce dernier est libre
d'écrire ce qu'il veut...
MichD
1 2 3