Como lembrar ou salvar o valor anterior de uma célula alterada no Excel?
Normalmente, ao atualizar uma célula com novo conteúdo, o valor anterior é sobrescrito, a menos que você desfaça a operação no Excel. No entanto, se você quiser manter o valor anterior para comparar com o atualizado, salvar o valor anterior da célula em outra célula ou no comentário da célula será uma boa escolha. O método neste artigo irá ajudá-lo a alcançar isso.
Salvar o valor anterior da célula com código VBA no Excel
Salvar o valor anterior da célula com código VBA no Excel
Suponha que você tenha uma tabela como mostrado na captura de tela abaixo. Se qualquer célula na coluna C mudar, você pode querer salvar seu valor anterior na célula correspondente da coluna G ou como um comentário automaticamente. Por favor, siga os passos abaixo para alcançar isso.
1. Na planilha contendo os valores que deseja salvar ao atualizar, clique com o botão direito do mouse na guia da planilha e selecione "Visualizar Código" no menu de contexto. Veja a captura de tela:
2. Na janela "Microsoft Visual Basic for Applications" que abrir, copie o código VBA abaixo na janela de Código.
O seguinte código VBA ajuda a salvar o valor anterior da célula de uma coluna específica em outra coluna.
Código VBA: Salvar o valor anterior da célula em outra célula de coluna
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
Para salvar o valor anterior da célula em um comentário, por favor, aplique o código VBA abaixo
Código VBA: Salvar o valor anterior da célula no comentário
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
Observação: No código, o número 7 indica a coluna G onde você salvará o valor anterior, e C:C é a coluna onde você fará a mudança. Altere-os conforme suas necessidades.
3. Clique em "Ferramentas" > "Referências" para abrir a caixa de diálogo "Referências – VBAProject", marque a caixa "Microsoft Scripting Runtime" e, finalmente, clique no botão "OK". Veja a captura de tela:
4. Pressione as teclas "Alt" + "Q" para fechar a janela "Microsoft Visual Basic for Applications".
A partir de agora, quando um valor da célula na coluna C for atualizado, o valor anterior será salvo na célula correspondente na coluna G ou como um comentário, como mostrado nas capturas de tela abaixo.
Salvar valores anteriores das células em outras células:
Salvar valores anteriores das células em comentários:
Melhores Ferramentas de Produtividade para Office
Impulsione suas habilidades no Excel com Kutools para Excel e experimente uma eficiência sem igual. Kutools para Excel oferece mais de300 recursos avançados para aumentar sua produtividade e economizar tempo.Clique aqui para obter o recurso que você mais precisa...
Office Tab traz interface de abas para o Office e facilita muito seu trabalho
- Habilite a edição e leitura com abas no Word, Excel, PowerPoint, Publisher, Access, Visio e Project.
- Abra e crie vários documentos em novas abas da mesma janela, em vez de novas janelas.
- Aumente sua produtividade em50% e reduza centenas de cliques do mouse todos os dias!