Écrire dans une cellule Excel si changement

Résolu/Fermé
marie-delphine - Modifié le 10 avril 2018 à 18:26
 marie-delphine - 11 avril 2018 à 09:44
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!
A voir également:

2 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
10 avril 2018 à 19:57
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
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié le 10 avril 2018 à 20:05
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
0
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 avril 2018 à 20:02
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

0
marie-delphine
11 avril 2018 à 09:44
Merci mille fois, le Target.Row fonctionne à merveille!
Je savais que je trouverais mon bonheur sur ce Forum ;)
0