Comment se souvenir ou enregistrer l'ancienne valeur d'une cellule modifiée dans Excel ?
Normalement, lors de la mise à jour d'une cellule avec un nouveau contenu, l'ancienne valeur est écrasée, sauf si vous annulez l'opération dans Excel. Cependant, si vous souhaitez conserver l'ancienne valeur pour la comparer avec la nouvelle, enregistrer l'ancienne valeur de la cellule dans une autre cellule ou dans un commentaire sera un bon choix. La méthode décrite dans cet article vous aidera à y parvenir.
Enregistrer l'ancienne valeur de la cellule avec du code VBA dans Excel
Enregistrer l'ancienne valeur de la cellule avec du code VBA dans Excel
Supposons que vous ayez un tableau comme indiqué dans la capture d'écran ci-dessous. Si une cellule de la colonne C change, vous pourriez vouloir enregistrer son ancienne valeur dans la cellule correspondante de la colonne G ou automatiquement sous forme de commentaire. Suivez les étapes ci-dessous pour y parvenir.
1. Dans la feuille de calcul contenant les valeurs que vous souhaitez enregistrer lors de la mise à jour, faites un clic droit sur l'onglet de la feuille et sélectionnez "Affichage du code" dans le menu contextuel. Voir la capture d'écran :
2. Dans la fenêtre "Microsoft Visual Basic for Applications" qui s'ouvre, copiez le code VBA ci-dessous dans la fenêtre Code.
Le code VBA suivant vous aide à enregistrer l'ancienne valeur de la cellule d'une colonne spécifiée dans une autre colonne.
Code VBA : Enregistrer l'ancienne valeur de la cellule dans une autre cellule de colonne
Dim xRg As Range
Dim xChangeRg As Range
Dim xDependRg As Range
Dim xDic As New Dictionary
Private Sub Worksheet_Change(ByVal Target As Range)
Dim I As Long
Dim xCell As Range
Dim xDCell As Range
Dim xHeader As String
Dim xCommText As String
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
xHeader = "Previous value :"
x = xDic.Keys
For I = 0 To UBound(xDic.Keys)
Set xCell = Range(xDic.Keys(I))
Set xDCell = Cells(xCell.Row, 7)
xDCell.Value = ""
xDCell.Value = xDic.Items(I)
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim I, J As Long
Dim xRgArea As Range
On Error GoTo Label1
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
Set xDependRg = Target.Dependents
If xDependRg Is Nothing Then GoTo Label1
If Not xDependRg Is Nothing Then
Set xDependRg = Intersect(xDependRg, Range("C:C"))
End If
Label1:
Set xRg = Intersect(Target, Range("C:C"))
If (Not xRg Is Nothing) And (Not xDependRg Is Nothing) Then
Set xChangeRg = Union(xRg, xDependRg)
ElseIf (xRg Is Nothing) And (Not xDependRg Is Nothing) Then
Set xChangeRg = xDependRg
ElseIf (Not xRg Is Nothing) And (xDependRg Is Nothing) Then
Set xChangeRg = xRg
Else
Application.EnableEvents = True
Exit Sub
End If
xDic.RemoveAll
For I = 1 To xChangeRg.Areas.Count
Set xRgArea = xChangeRg.Areas(I)
For J = 1 To xRgArea.Count
xDic.Add xRgArea(J).Address, xRgArea(J).Formula
Next
Next
Set xChangeRg = Nothing
Set xRg = Nothing
Set xDependRg = Nothing
Application.EnableEvents = True
End Sub
Pour enregistrer l'ancienne valeur de la cellule dans un commentaire, veuillez appliquer le code VBA ci-dessous.
Code VBA : Enregistrer l'ancienne valeur de la cellule dans le commentaire
Dim xRg As Range
Dim xChangeRg As Range
Dim xDependRg As Range
Dim xDic As New Dictionary
Private Sub Worksheet_Change(ByVal Target As Range)
Dim I As Long
Dim xCell As Range
Dim xHeader As String
Dim xCommText As String
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
xHeader = "Previous value :"
For I = 0 To UBound(xDic.Keys)
Set xCell = Range(xDic.Keys(I))
If Not xCell.Comment Is Nothing Then xCell.Comment.Delete
With xCell
.AddComment
.Comment.Visible = False
.Comment.Text xHeader & vbCrLf & xDic.Items(I)
End With
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim I, J As Long
Dim xRgArea As Range
On Error GoTo Label1
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
Set xDependRg = Target.Dependents
If xDependRg Is Nothing Then GoTo Label1
If Not xDependRg Is Nothing Then
Set xDependRg = Intersect(xDependRg, Range("C:C"))
End If
Label1:
Set xRg = Intersect(Target, Range("C:C"))
If (Not xRg Is Nothing) And (Not xDependRg Is Nothing) Then
Set xChangeRg = Union(xRg, xDependRg)
ElseIf (xRg Is Nothing) And (Not xDependRg Is Nothing) Then
Set xChangeRg = xDependRg
ElseIf (Not xRg Is Nothing) And (xDependRg Is Nothing) Then
Set xChangeRg = xRg
Else
Application.EnableEvents = True
Exit Sub
End If
xDic.RemoveAll
For I = 1 To xChangeRg.Areas.Count
Set xRgArea = xChangeRg.Areas(I)
For J = 1 To xRgArea.Count
xDic.Add xRgArea(J).Address, xRgArea(J).Text
Next
Next
Set xChangeRg = Nothing
Set xRg = Nothing
Set xDependRg = Nothing
Application.EnableEvents = True
End Sub
Remarque : Dans le code, le chiffre 7 indique la colonne G où vous enregistrerez l'ancienne valeur de la cellule, et C:C est la colonne dans laquelle vous effectuerez la modification. Veuillez les modifier selon vos besoins.
3. Cliquez sur "Outils" > "Références" pour ouvrir la boîte de dialogue "Références – VBAProject", cochez la case "Microsoft Scripting Runtime", puis cliquez sur le bouton "OK". Voir la capture d'écran :
4. Appuyez sur les touches "Alt" + "Q" pour fermer la fenêtre "Microsoft Visual Basic for Applications".
Désormais, lorsque la valeur d'une cellule de la colonne C est mise à jour, l'ancienne valeur sera enregistrée dans la cellule correspondante de la colonne G ou sous forme de commentaire, comme le montrent les captures d'écran ci-dessous.
Enregistrer les anciennes valeurs des cellules dans d'autres cellules :
Enregistrer les anciennes valeurs des cellules dans des commentaires :
Meilleurs outils de productivité pour Office
Boostez vos compétences Excel avec Kutools pour Excel, et découvrez une efficacité sans précédent. Kutools pour Excel propose plus de300 fonctionnalités avancées pour augmenter la productivité et gagner du temps. Cliquez ici pour obtenir la fonctionnalité dont vous avez le plus besoin...
Office Tab apporte une interface à onglets à Office, et facilite grandement votre travail
- Activez la modification et la lecture par onglets dans Word, Excel, PowerPoint, Publisher, Access, Visio et Project.
- Ouvrez et créez plusieurs documents dans de nouveaux onglets de la même fenêtre, plutôt que dans de nouvelles fenêtres.
- Augmente votre productivité de50 %, et réduit des centaines de clics de souris pour vous chaque jour !