Conserver l’historique des modifications

Bonjour à tous,

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.

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.

50log.xlsx (8.52 Ko)

Bonsoir

Voyez Ceci

@ bientôt

LouReeD

Bonjour LouReed

J'avais même oublié que j'avais posté une solution !

On peut aussi le faire sur un fichier texte séparé.

Amicalement,

Michel

Bonjour LouReeD, Steelson,

C'est intéressant ce fichier.

J'aimerais simplement ajouter le titre de la colonne où la modification a été effectuée, ainsi qu'un lien hypertexte vers la cellule modifiée.

Le fichier peut être modifié par plusieurs utilisateurs, chacun ayant un nom d'utilisateur et un mot de passe.

Merci.

J'aimerais simplement ajouter le titre de la colonne où la modification a été effectuée, ainsi qu'un lien hypertexte vers la cellule modifiée.

Où se trouve ce titre ? car tu commences à la ligne 2

Essaie ceci (cela devient un peu compliqué !)

45log.xlsm (18.21 Ko)

attention, si tu tries la BdD, les liens ne suivront pas !

C'est pas bête de mettre les en-têtes de colonnes, mais du coup, s'il s'agit d'une base de données, il faudrait aussi mettre l'identifiant de la ligne s'il existe.

Par ailleurs, si tu n'as pas besoin de la valeur "avant" modification, cela peut simplifier le code (pas besoin de faire undo)

Salut,

Merci pour le fichier exemple.

il faudrait aussi mettre l'identifiant de la ligne s'il existe.

La base de données à laquelle je souhaite appliquer cette solution, ne contient pas d'identifiant de ligne.

si tu n'as pas besoin de la valeur "avant" modification

C'est la plus importante des valeurs.

attention, si tu tries la BdD, les liens ne suivront pas !

Donc, ce sera avec du VBA ?

Remarque : Lorsque je valide une entrée dans une cellule, elle apparaît "bloquée".

Je dois valider à nouveau pour que le cadre de la cellule se déplace sur une cellule !?

Re,

J'ai ajouté un système de connexion au classeur (code source Steelson = Accès restreint selon utilisateur).

Cependant, le nom de l'utilisateur n'apparaît pas sur la feuille de log.

De plus, toutes les modifications, sur n'importe quelle feuille, seront transférées dans la feuille "Log", comme l'exemple de la feuille "Paramètres".

23log-v003.xlsm (35.84 Ko)

Bonsoir,

pour le "soucis" de la stagnation de la cellule "validée" vous pouvez ajouter la sélection de la cellule d'en-dessous comme ceci, juste avant la fin du code :

    ActiveCell.Offset(1).Activate
fin:
    Application.EnableEvents = True
    If Err Then MsgBox "Erreur #" & Err.Number & " !"

@ bientôt

LouReeD

Bonsoir,

dans un module standard, la définition d'une variable "hors" procédure permet de créer une variable globale au niveau du module mais elle reste privé au niveau du locale (sur le module concerné).

Pour que la variable soit globale au niveau du classeur, il faut la "rendre public".

Donc en lieu et place de : Dim utilisateur As String

écrire : Public utilisateur As String.

Chez moi il y a bien changement du nom de feuille du lieu de modification...

@ bientôt

LouReeD

Attention ! Il manque la vérification du nom du personnel...

J'ai essayé avec admin et Admin, résultat ça plante car aucune feuille n'est affichée et on essaye de cacher l'accueil.

@ bientôt

LouReeD

Remarque : Lorsque je valide une entrée dans une cellule, elle apparaît "bloquée".

Je dois valider à nouveau pour que le cadre de la cellule se déplace sur une cellule !?

C'est dû à la double commande undo qui fait revenir la positon de la cellule courante sur celle(s) modifiée(s), cette instruction undo est nécessaire pour justement connaître la valeur avant. Adopte la solution de LouReeD.

Est-ce que pour le reste, tu attends encore quelque chose de ma part ? ou je te laisse entre les mains de LouReeD ?

Bonjour,

HO pela... Je vous laisse entre vous, pas de soucis.

@ bientôt

LouReeD

Bon, ben, je vais attendre qu'atlas me résume la situation !

Faire quelque chose d'aussi blindé avec excel, je reste dubitatif.

Bonjour LouReeD, Steelson,

écrire : Public utilisateur As String.

Merci pour la correction.

Attention ! Il manque la vérification du nom du personnel...

J'ai essayé avec admin et Admin, résultat ça plante car aucune feuille n'est affichée et on essaye de cacher l'accueil.

Lorsque je me connecte avec un utilisateur ou mot de passe inexistants, une erreur se déclenche sur la ligne :

Sheets("Accueil").Visible = False

- Si des modifications sont apportées sur n'importe quelle feuille, elles seront reportées dans la feuille "Log".

Alors que seules les modifications de la feuille BDD, qui sont concernées.

- Lorsqu'une nouvelle ligne est saisie dans la base de données, seul ce qui a été saisi dans la colonne "Adresse" sera reporté ; quant à ce qui est saisi dans la colonne "Destination", il n'est pas reporté dans la feuille "log".

- Je souhaite mettre les cellules modifiées en lien dans le code vba, car le tri dans la feuille l'affecte, comme tu l'as mentionné.

- Le nom d'utilisateur n'apparaît toujours pas sur la feuille "Log".

- Est-ce qu'on peut appliquer un tri automatique avant la fermeture du classeur ?

Merci

ok,

je vais essayer de prendre les points les uns après les autres

Si des modifications sont apportées sur n'importe quelle feuille, elles seront reportées dans la feuille "Log".

Alors que seules les modifications de la feuille BDD, qui sont concernées.

Soit on déplace la macro dans la seule feuille concernée, soit on modifie le début comme ceci :

Private Sub Workbook_Sheetchange(ByVal feuille As Object, ByVal cible As Range)
Dim avant() As Variant, apres() As Variant
If feuille.Name <> "BDD" Then Exit Sub

Lorsqu'une nouvelle ligne est saisie dans la base de données, seul ce qui a été saisi dans la colonne "Adresse" sera reporté ; quant à ce qui est saisi dans la colonne "Destination", il n'est pas reporté dans la feuille "log".

personnellement, je ne vais pas savoir faire car pour excel la saisie est séparée en 2 temps, on pourrait le faire à condition que ce soit le même événement (par exemple en recopiant d'un bloc la ligne)

Je souhaite mettre les cellules modifiées en lien dans le code vba, car le tri dans la feuille l'affecte, comme tu l'as mentionné.

ok, bonne idée, j'avais prévu d'y travailler,

  • mais il faut normalement un identifiant de ligne,
  • ou alors une astuce qui mettra une formule en lien avec la cellule de la BDD (quitte du reste à générer #REF! si on supprime la ligne

au passage, je ne sais pas ce qui se passe si on supprime une ligne ...

edit : ouf, ça ne plante pas, il ne se passe rien, bonne nouvelle

Le nom d'utilisateur n'apparaît toujours pas sur la feuille "Log".

je mets Environ("username")

c'est ce qui est enregistré comme nom d'utilisateur d'excel, s'il en fallait un autre, voire en effet ce que dit LouReeD, mais je n'ai pas compris où le prendre

si tu as un fichier exemple ... je suis preneur

edit : ok, je vais regarder log-v003.xlsm, je ne l'avais pas vu

Pour avoir le nom d'utilisateur il faut mettre Public

Public utilisateur As String

je te conseillerais même de faire un "doublet"

.Cells(i, 8) = utilisateur & " (" & Environ("username") & ")"

/!\ il faut protéger ton code VBA sinon à terme tout le monde pourra afficher la feuille des paramètres de connexion

Rechercher des sujets similaires à "conserver historique modifications"