26

Is there a simple way to get Excel to automatically execute a macro whenever a cell is changed?

The cell in question would be in Worksheet("BigBoard").Range("D2")

What I thought would be a simple Google inquiry is proving to be more complicated - every sample involved intersects (whatever those are) or color formatting or any other number of things that appear to be irrelevant.

3
  • Use the answer by Peter Albert. Don't be scared of the line with intersect, that's just so VBA knows which cells you are monitoring for changes. And where he has MsgBox, that's where you call your macro. This is the simplest way to do it. Commented Mar 11, 2013 at 11:12
  • 1
    possible duplicate of automatically execute an Excel macro on a cell change Commented Aug 12, 2015 at 18:31
  • 1
    Could you please mark the answer that worked for you, so this question is no longer shown as unanswered? Thank you in advance! Commented Nov 9, 2015 at 10:11

5 Answers 5

45

Yes, this is possible by using worksheet events:

In the Visual Basic Editor open the worksheet you're interested in (i.e. "BigBoard") by double clicking on the name of the worksheet in the tree at the top left. Place the following code in the module:

Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Me.Range("D2")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop On Error Goto Finalize 'to re-enable the events MsgBox "You changed THE CELL!" Finalize: Application.EnableEvents = True End Sub 
Sign up to request clarification or add additional context in comments.

8 Comments

It tests that D2 was in the range of cells / or the cell changed (ie - part of Target). If not the code exits. +1 btw
Insersect(rng1,rng2) returns the range where both input range "intersect". therefore, if the intersection of the changed cells and D2 is nothing, something else was changed and you don't want the macro to procede. BTW: If it solved your problem, please mark it as the solution by clicking on the checkmark!
There is a similar solution in the official Microsoft documentation at support.microsoft.com/kb/213612
+1 for telling me to use this code in the worksheet, I had it in a module and it wasnt working, as soon as I put it in the worksheet, it worked :)
@MarkRomano you're right - in case of an error the enable events was not reset. I extended the code.
|
21

Another option is

Private Sub Worksheet_Change(ByVal Target As Range) IF Target.Address = "$D$2" Then MsgBox("Cell D2 Has Changed.") End If End Sub 

I believe this uses fewer resources than Intersect, which will be helpful if your worksheet changes a lot.

1 Comment

Simpler and without the bug I mentioned in the selected answer.
2

In an attempt to find a way to make the target cell for the intersect method a name table array, I stumbled across a simple way to run something when ANY cell or set of cells on a particular sheet changes. This code is placed in the worksheet module as well:

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 0 Then 'mycode here end if end sub 

Comments

2

In an attempt to spot a change somewhere in a particular column (here in "W", i.e. "23"), I modified Peter Alberts' answer to:

Private Sub Worksheet_Change(ByVal Target As Range) If Not Target.Column = 23 Then Exit Sub Application.EnableEvents = False 'to prevent endless loop On Error GoTo Finalize 'to re-enable the events MsgBox "You changed a cell in column W, row " & Target.Row MsgBox "You changed it to: " & Target.Value Finalize: Application.EnableEvents = True End Sub 

Comments

1

I was creating a form in which the user enters an email address used by another macro to email a specific cell group to the address entered. I patched together this simple code from several sites and my limited knowledge of VBA. This simply watches for one cell (In my case K22) to be updated and then kills any hyperlink in that cell.

Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range ' The variable KeyCells contains the cells that will ' cause an alert when they are changed. Set KeyCells = Range("K22") If Not Application.Intersect(KeyCells, Range(Target.Address)) _ Is Nothing Then Range("K22").Select Selection.Hyperlinks.Delete End If End Sub 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.