Hvordan kan man huske eller gemme den tidligere celleværdi af en ændret celle i Excel?
Normalt, når du opdaterer en celle med nyt indhold, vil den tidligere værdi blive dækket, medmindre du fortryder handlingen i Excel. Men hvis du vil beholde den tidligere værdi for at sammenligne med den opdaterede, vil det være et godt valg at gemme den forrige celleværdi i en anden celle eller i cellekommentaren. Metoden i denne artikel hjælper dig med at opnå det.
Gem tidligere celleværdi med VBA-kode i Excel
Gem tidligere celleværdi med VBA-kode i Excel
Antag at du har en tabel som vist nedenstående skærmbillede. Hvis en celle i kolonne C ændres, vil du gemme den tidligere værdi i den tilsvarende celle i kolonne G eller automatisk gemme i kommentar. Gør som følger for at opnå det.
1. I regnearket indeholder den værdi, du vil gemme ved opdatering, skal du højreklikke på arkfanen og vælge Vis kode fra højreklikmenuen. Se skærmbillede:
2. I åbningen Microsoft Visual Basic til applikationer kopier nedenstående VBA-kode til vinduet Kode.
Den følgende VBA-kode hjælper dig med at gemme den forrige celleværdi i den angivne kolonne i en anden kolonne.
VBA-kode: Gem forrige celleværdi i en anden kolonnecelle
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
For at gemme den foregående celleværdi i en kommentar skal du anvende nedenstående VBA-kode
VBA-kode: Gem tidligere celleværdi i kommentaren
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
Bemærk: I koden angiver nummer 7 kolonnen G, du vil gemme den forrige celle i, og C: C er den kolonne, du vil gemme den forrige celleværdi. Skift dem ud fra dine behov.
3. klik Værktøjer > Referencer at åbne Henvisninger - VBAProject dialogboksen, skal du kontrollere Microsoft Scripting Runtime og klik til sidst på OK knap. Se skærmbillede:
4. Tryk på andre + Q taster for at lukke Microsoft Visual Basic til applikationer vindue.
Fra nu af, når celleværdien i kolonne C opdateres, gemmes den foregående værdi af cellen i tilsvarende celler i kolonne G eller gemmes i kommentar som nedenstående skærmbilleder viste.
Gem tidligere celleværdier i andre celler:
Gem tidligere celleværdier i kommentarer:
Bedste kontorproduktivitetsværktøjer
Overlad dine Excel-færdigheder med Kutools til Excel, og oplev effektivitet som aldrig før. Kutools til Excel tilbyder over 300 avancerede funktioner for at øge produktiviteten og spare tid. Klik her for at få den funktion, du har mest brug for...
Fanen Office bringer en grænseflade til et kontor med Office, og gør dit arbejde meget lettere
- Aktiver redigering og læsning af faner i Word, Excel, PowerPoint, Publisher, Access, Visio og Project.
- Åbn og opret flere dokumenter i nye faner i det samme vindue snarere end i nye vinduer.
- Øger din produktivitet med 50 % og reducerer hundredvis af museklik for dig hver dag!