Colonnes de création et de suivi des modifications

Bonjour,

J'entre dans le vif du sujet, il est tard... ^^(Oui oui, pour moi)

Il s'agit d'une liste de produits qu'un couple doit avoir avant d'emménager. Mais j'aimerais avoir un semblant d'aperçu sur qui a créé la ligne et qui l'a modifiée. En effet, qui dit couple dit 2 personnes et connaissant les artistes, ils vont se marcher dessus.^^

J'ai une partie du code VBA, mais je sèche sur la fin.

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
user = login()
If Not Intersect(Target, [E2:E1000]) Is Nothing Then
If Target(1, -1) = "" Then Target(1, -1) = Now: Target(1, 0) = user: Target(1, 2) = "Non": Target(1, 4) = "0": Target(1, 6) = "0": Target(1, 7) = "A définir"
Target(1, -3) = Now
Target(1, -2) = user
End If
End Sub
Function login() As String
login = Application.UserName
End Function

En clair (pour moi vu que j'ai jamais fait de VBA), lorsque j'écris dans la cellule E2 ou E999, il m'indiquera sur la même ligne:

  • dans la 1re cellule (A2), la date de la dernière modification de la cellule,
  • dans la 2e cellule (B2), le nom de la dernière personne (via la fonction) à avoir modifié le contenu de la cellule,
  • dans la 3e cellule (C2), la date de la création (première introduction de valeur),
  • dans la 5e cellule (D2), le nom du créateur de la première valeur (toujours via la fonction).
  • + quelques ajouts automatiques dans le reste de la ligne (au moment de la création)

Avec ce code, ça fonctionne bien. MAIS... (ben oui, c'était à prévoir. Pas si bien que ça finalement...)

  • Je souhaiterais que pour la partie modification (les 2 premières colonnes donc) la vérification du changement ne se fasse pas que sur la cellule du produit mais bien sur toute la ligne. (je pense à une histoire de RANGE ou quelque chose dans le genre)
  • Dans l'état actuel des choses, lorsque je supprime une ligne au milieu de mon tableau, les ajouts complémentaires sont décalés vers la ligne suivante et la modifie (contenu et format de cell).
    C'est du même acabit si je supprime la dernière ligne.

Donc, je finis par m'adresser à vous... Parce que j'en ai plein le ... heu... bref! ça m'soule de patauger dans la... heu... RE-BREF!

Une idée, un éclaircissement? A vot' bon coeur!! Merci déjà de m'avoir lu.

(Je travaille sur Mac avec Office 2011, mais le jeune travaillera sur son propre pc avec son propre OS et normalement avec Excel 2007 minimum)

39pre-prod-074.xlsm (23.81 Ko)

Bonjour,

Target désigne la cellule qui vient de détecter l'évènement _Change donc Target n'accepte aucun paramètre.

Tu peux écrire :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim iLR%, iLC%, user$
On Error Resume Next
user = Application.UserName
If Not Intersect(Target, [E2:E1000]) Is Nothing Then
iLR = Target.Row
iLC = Target.column
If Cells(iLR + 1, iLC - 1) = "" Then
Target(iLR + 1, iLC - 1) = Now
Cells(iLR + 1, iLC) = user
...
End if
...
End if
End Sub

Tu ne peux pas détecter la suppression d'une ligne avec l'évènement _Change.

Le mieux que tu puisses faire est de protéger la feuille pour empêcher la suppression de ligne.

A+

Bonjour,

Merci pour la réponse. J'ai essayé de comprendre ce que je lisais (inculte que je suis), mais finalement, cela fait exactement la même chose que mon premier code.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim iLR%, iLC%, user$
On Error Resume Next
user = Application.UserName
If Not Intersect(Target, [E2:E1000]) Is Nothing Then
iLR = Target.Row
iLC = Target.Column
If Cells(iLR, iLC - 2) = "" Then
'INTRO
Cells(iLR, iLC - 2) = Now
Cells(iLR, iLC - 1) = user
Cells(iLR, iLC + 1) = "Non"
Cells(iLR, iLC + 3) = 0
Cells(iLR, iLC + 5) = 0
Cells(iLR, iLC + 6) = "A définir"
End If
'MODIF
Cells(iLR, iLC - 4) = Now
Cells(iLR, iLC - 3) = user
End If
End Sub

Je comprends difficilement comment faire en sorte que:Je crois (sans conviction) que le problème vient de là: If Not Intersect(Target, [E2:E1000]) Is Nothing Then

Bonjour,

Je n'avais pas vu de fichier joint donc ma réponse était un peu "à l'aveuglette" ce qui explique quelques erreurs...

Déjà [E2:E1000]) signifie que seules les modifs dans cette colonne sont contrôlées.

Il semble que maintenant tu désires que :

"quelque soit la cellule de la ligne, s'il y a une modif, la date et le user se mettent à jour..."

Ce qui est totalement différent !

Déjà il faut dire que ce que tu envisages est très difficile. En effet l'éventail de toutes les modifs que peut faire l'utilisateur est tellement vaste que c'est quasiment imprévisible de cette manière.

mébon si j'ai bien compris, la macro suivante convient à peu près si l'utilisateur ajoute ou modifie une ligne....

Private Sub Worksheet_Change(ByVal Target As Range)
Dim iLR%, iLC%, user$
On Error Resume Next
Application.EnableEvents = False
user = Application.UserName
If Not Intersect(Target, [Table1]) Is Nothing Then
   iLR = Target.Row
   iLC = Target.Column
   If iLC = 5 And Cells(iLR, 3) = "" Then 'New
      Cells(iLR, 3) = Now
      Cells(iLR, 4) = user
      Cells(iLR, 6) = "Non"
      Cells(iLR, 7) = "A définir"
      Cells(iLR, 8) = 0
      Cells(iLR, 11) = "A définir"
   Else 'Modif
      Cells(iLR, 1) = Now
      Cells(iLR, 2) = user
   End If
End If
Application.EnableEvents = True
End Sub

Nota : Attention ! L'utilisation de

Application.EnableEvents = False

est indispensable mais dangereuse. En effet en cas de problème cela abouti à un blocage de l'application qui ne peut plus se fermer que par l'extinction "sauvage" de l'ordinateur !

Si tu n'utilises pas Application.EnableEvents l'évènement _Change est provoqué "en boucle" par les changements que la macro effectue, et si l'utilisateur (ou le programmeur...) fait une fausse manip... dans les 2 cas c'est le blocage !

A+

Super !!!!!!!!!!

J'ai vite testé à l'instant (copy-paste) et ça fait ce que j'espérais.

Mais je veux être certain de comprendre ce que j'écris sinon, ça ne sert à rien (un bête copy-paste, c'est pas mon genre).

Donc, je prendrai plus de temps pour ça (avant de revenir pour mettre un résolu), on sait jamais que j'ai d'autres questions. :-p

Par contre, je veux bien une information sur ton 'attention' en note finale. Je comprends son côté indispensable pour éviter la boucle, mais pas pour son côté dangereux. Dangereux si je ne l'utilise pas? Ou bien, justement si je l'utilise? (cfr application.enableevents)

En tout cas, merci pour cet éclaircissement.

I'll be back.

bonjour,

Comme je l'ai expliqué le danger provient du fait que :

Application.EnableEvents = False

...Empêche Excel de réagir à toute sollicitation si la macro ne rétablit pas la situation à True à la sortie...

Cela se produit régulièrement en cas d'erreur de programmation si le programme s'interrompt prématurément et que la fin de la macro n'est pas exécutée car l'utilisateur qui ne sait pas déboguer et à cliqué sur Fin... Cela peut se produire également toujours en cas d'erreur de programmation si l'instruction qui remet à True se trouve dans une boucle conditionnelle qui à un moment donné ne s'exécute pas.

On évite ce genre de désagrément en mettant un gestionnaire d'erreur qui -quoi qu'il arrive- rétablit la situation. (ce qui est le cas actuellement : On Error Resume Next assure que quoi qu'il arrive le programme ira jusqu'à la dernière ligne.

Quand il se rend compte que quelque chose cloche, au lieu d'éteindre son PC, le programmeur avisé entre une instruction :

Application.EnableEvents = True

dans la fenêtre d'exécution pour rétabli la situation...

Le novice qui ne sait pas... jette le bébé avec l'eau du bain.

Nota : Il existe une alternative compliquée pour éviter ce genre de situation, mais je ne suis pas fan...

A+

Merci, j'apprécie le complément d'information. Et j'apprécie l'échange effectué.

Je ne manquerai pas de revenir ici (ou dans un nouveau topic?) si j'ai une nouvelle question.

THANKS TO YOU !!!!!

Rechercher des sujets similaires à "colonnes creation suivi modifications"