This post actually was birthed from a comment made on one on my Youtube videos:
I wanted to know as how to trigger an event when a cell value is deleted?
(a comment to this post’s video: http://www.vbastring.com/blog/how-to-run-a-macro-when-cell-value-changes-in-excel-vba/)
So we are going to trigger an Excel VBA event when a value is deleted from a cell.
In the above screen shot we have a fake list of names in column A of the worksheet.
We are deleting the value from Cell “A4”, and we are adding a little confirmation message to confirm to the user that that’s what they want to do.
If we click “Yes”, the old value (existing value) gets “deleted” (substituted) with the current value (a blank value).
Private Sub Worksheet_Change(ByVal Target As Range) 'this was modified from an idea from https://stackoverflow.com/questions/4668410/how-do-i-get-the-old-value-of-a-changed-cell-in-excel-vba Static blnAlreadyBeenHere As Boolean Dim intAnswer As Integer 'This piece avoid to execute Worksheet_Change again If blnAlreadyBeenHere Then blnAlreadyBeenHere = False Exit Sub End If 'Now, we will create variant variables store the old and new value Dim varOldValue As Variant Dim varNewValue As Variant 'Use this to store new value varNewValue = Target.Value 'Use the 'undo' functionality to retrieve the old value 'Here we will tell the Worksheet_Change event to avoid calling a new Worksheet_Change execution blnAlreadyBeenHere = True Application.Undo 'now we can store the old value varOldValue = Target.Value 'Now rewrite the cell with the new value stored earlier 'Here again we will tell the Worksheet_Change event to avoid calling a new Worksheet_Change execution blnAlreadyBeenHere = True Target.Value = varNewValue '*************************************************************** 'Now we have the 2 values stored in varOldValue and varNewValue '*************************************************************** 'Check if the cell value was deleted: If varNewValue = "" Then intAnswer = MsgBox("Delete the current cell's value?", vbYesNo, "Confirmation") If intAnswer = vbNo Then 'Here again we will tell the Worksheet_Change event to avoid calling a new Worksheet_Change execution blnAlreadyBeenHere = True 'set the deleted cell value to what it was before the deletion. (couldn't use undo) Target.FormulaR1C1 = varOldValue 'Or, fire the event you want, like logging the deletion in another file. End If Else 'Just for reference: Debug.Print "oldval: " & varOldValue & ", newval: " & varNewValue End If End Sub
Do you have questions?
Let me know. Also, share this with someone else.