¿Cómo recordar o guardar el valor anterior de una celda modificada en Excel?
Normalmente, al actualizar una celda con un nuevo contenido, el valor anterior se sobrescribe a menos que deshagas la operación en Excel. Sin embargo, si deseas conservar el valor anterior para compararlo con el actualizado, guardar el valor anterior de la celda en otra celda o en el comentario de la celda será una buena opción. El método en este artículo te ayudará a lograrlo.
Guardar el valor anterior de una celda con código VBA en Excel
Guardar el valor anterior de una celda con código VBA en Excel
Supongamos que tienes una tabla como se muestra en la siguiente captura de pantalla. Si cualquier celda en la columna C cambia, es posible que quieras guardar su valor anterior en la celda correspondiente de la columna G o como un comentario automáticamente. Por favor, sigue los siguientes pasos para lograrlo.
1. En la hoja de cálculo que contiene los valores que deseas guardar al actualizar, haz clic derecho en la pestaña de la hoja y selecciona "Ver Código" desde el menú contextual. Ver captura de pantalla:
2. En la ventana "Microsoft Visual Basic for Applications" que se abre, copia el siguiente código VBA en la ventana de Código.
El siguiente código VBA te ayuda a guardar el valor anterior de una celda de una columna específica en otra columna.
Código VBA: Guardar el valor anterior de una celda en otra celda de columna
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 guardar el valor anterior de una celda en un comentario, aplica el siguiente código VBA.
Código VBA: Guardar el valor anterior de una celda en el comentario
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
Nota: En el código, el número 7 indica la columna G donde guardarás el valor anterior, y C:C es la columna en la que realizarás el cambio. Cambia estos valores según tus necesidades.
3. Haz clic en "Herramientas" > "Referencias" para abrir el cuadro de diálogo "Referencias – VBAProject", marca la casilla "Microsoft Scripting Runtime" y finalmente haz clic en el botón "Aceptar". Ver captura de pantalla:
4. Presiona las teclas "Alt" + "Q" para cerrar la ventana "Microsoft Visual Basic for Applications".
A partir de ahora, cuando se actualice un valor de celda en la columna C, el valor anterior se guardará en la celda correspondiente de la columna G o como un comentario, como se muestra en las siguientes capturas de pantalla.
Guardar valores anteriores de celdas en otras celdas:
Guardar valores anteriores de celdas en comentarios:
Las mejores herramientas de productividad para Office
Potencia tus habilidades en Excel con Kutools para Excel y experimenta una eficiencia sin precedentes. Kutools para Excel ofrece más de300 funciones avanzadas para aumentar la productividad y ahorrar tiempo. Haz clic aquí para obtener la función que más necesitas...
Office Tab lleva la interfaz de pestañas a Office y facilita mucho tu trabajo
- Habilita la edición y lectura con pestañas en Word, Excel, PowerPoint, Publisher, Access, Visio y Project.
- Abre y crea varios documentos en nuevas pestañas de la misma ventana, en lugar de nuevas ventanas.
- ¡Aumenta tu productividad en un50% y reduce cientos de clics de ratón cada día!