Hoe het vorige waarde van een gewijzigde cel in Excel te onthouden of opslaan?
Normaal gesproken wordt bij het bijwerken van een cel met nieuwe inhoud de vorige waarde overschreven, tenzij je de bewerking in Excel ongedaan maakt. Als je echter de vorige waarde wilt behouden om te vergelijken met de bijgewerkte waarde, is het opslaan van de vorige celwaarde in een andere cel of als een opmerking een goede keuze. De methode in dit artikel helpt je dat te bereiken.
Vorige celwaarde opslaan met VBA-code in Excel
Vorige celwaarde opslaan met VBA-code in Excel
Stel dat je een tabel hebt zoals in de onderstaande schermafbeelding. Als een cel in kolom C verandert, wil je misschien de vorige waarde automatisch opslaan in de corresponderende cel van kolom G of als een opmerking. Volg de volgende stappen om dit te bereiken.
1. Klik in het werkblad met de waarden die je wilt opslaan tijdens het bijwerken met de rechtermuisknop op het tabblad van het blad en selecteer "Weergave Code" uit het rechtermuisknopmenu. Zie schermafbeelding:
2. Plak in het geopende "Microsoft Visual Basic for Applications"-venster de onderstaande VBA-code in het Code-venster.
De volgende VBA-code helpt je de vorige celwaarde van een specifieke kolom op te slaan in een andere kolom.
VBA-code: Vorige celwaarde opslaan in een andere kolomcel
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
Om de vorige celwaarde in een opmerking op te slaan, gebruik dan de onderstaande VBA-code.
VBA-code: Vorige celwaarde opslaan in de opmerking
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
Opmerking: In de code geeft het getal 7 kolom G aan waarin je de vorige celwaarde opslaat, en C:C is de kolom waarin je de wijziging aanbrengt. Pas deze aan op basis van je behoeften.
3. Klik op "Tools" > "References" om het dialoogvenster "Referenties – VBAProject" te openen, vink het vakje "Microsoft Scripting Runtime" aan en klik tot slot op de knop "OK". Zie schermafbeelding:
4. Druk op de toetsen "Alt" + "Q" om het venster "Microsoft Visual Basic for Applications" te sluiten.
Vanaf nu, wanneer een celwaarde in kolom C wordt bijgewerkt, wordt de vorige waarde opgeslagen in de corresponderende cel in kolom G of als een opmerking, zoals te zien is in de onderstaande schermafbeeldingen.
Vorige celwaarden opslaan in andere cellen:
Vorige celwaarden opslaan in opmerkingen:
Beste Office-productiviteitstools
Versterk je Excel-vaardigheden met Kutools voor Excel en ervaar ongeëvenaarde efficiëntie. Kutools voor Excel biedt meer dan300 geavanceerde functies om je productiviteit te verhogen en tijd te besparen. Klik hier om de functie te krijgen die je het meest nodig hebt...
Office Tab brengt een tabbladinterface naar Office en maakt je werk veel eenvoudiger
- Schakel bewerken en lezen met tabbladen in Word, Excel, PowerPoint in
- Open en maak meerdere documenten in nieuwe tabbladen van hetzelfde venster, in plaats van in nieuwe vensters.
- Verhoog je productiviteit met50% en bespaar dagelijks honderden muisklikken!