Écrire dans une cellule Excel si changement

Résolu
Bonsoir à tous,
J'ai besoin de votre aide en VBA. Parfaite débutante, je voudrais créer une macro dans mon fichier Excel qui fasse que si on change le contenu d'une cellule, sur la même ligne mais dans des colonnes beaucoup plus à droite s'écrivent la date de modification, l'heure et l'utilisateur.
J'y suis +/- arrivée, sauf que si je modifie la cellule A1, quand je tape Enter et donc que je descend en A2, c'est H2, I2 et J2 qui prennent les valeurs demandées. Par contre, si je delete le contenu de A1, C'est H1, I1 et J1 qui prennent les valeurs, ce qui est bien sur le but de la manoeuvre!
Voilà mon petit code.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A1:G10000")

If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
Workbooks("test.xlsx").Sheets("Feuil1").Range("H" & ActiveCell.Row).Value = Time
Workbooks("test.xlsx").Sheets("Feuil1").Range("I" & ActiveCell.Row).Value = Date
Workbooks("test.xlsx").Sheets("Feuil1").Range("J" & ActiveCell.Row).Value = Environ("USERNAME")

End If
End Sub

Je suis certaine qu'un connaisseur pourra me renseigner :)
Merci!

2 réponses

  1. Bonjour,

    Par exemple :
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Not Intersect([A1:G10000], Target) Is Nothing Then
        Target.EntireRow.Cells(1, "H").Value = Time
        Target.EntireRow.Cells(1, "I").Value = Date
        Target.EntireRow.Cells(1, "J").Value = Environ("USERNAME")
      End If
    End Sub
    1. Ou mieux (fonctionne aussi en cas de saisie matricielle) :
      Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect([A1:G10000], Target) Is Nothing Then
          Target.EntireRow.Columns("H").Value = Time
          Target.EntireRow.Columns("I").Value = Date
          Target.EntireRow.Columns("J").Value = Environ("USERNAME")
        End If
      End Sub
  2. Modérateur
    Bonjour,

    Si c'est sur la ligne que tu as modifié que tu veux écrire.. ce n'est pas activecell que tu dois utiliser mais target
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim KeyCells As Range
        Set KeyCells = Range("A1:G10000")
        
        If Not Application.Intersect(KeyCells, Range(Target.Address)) _
        Is Nothing Then
            ThisWorkbook.Sheets("Feuil1").Range("H" & Target.Row).Value = Time
            ThisWorkbook.Sheets("Feuil1").Range("I" & Target.Row).Value = Date
            ThisWorkbook.Sheets("Feuil1").Range("J" & Target.Row).Value = Environ("USERNAME")
        
        End If
    End Sub
    

    1. Merci mille fois, le Target.Row fonctionne à merveille!
      Je savais que je trouverais mon bonheur sur ce Forum ;)