|It was not clear from your original post that the users would be deleting dates from more than one cell at a time.|
To start with, I am going to assume that you got an error the first time your deleted more than one date and that you clicked the End box in the error message.
This stops the code from completing and therefore the Application.EnableEvents = True line never executes. If the code doesn't re-enable Events, then no event code will run until you either re-enable events in some other manner or restart Excel.
If the code bombs again, just run this to re-enable events:
Application.EnableEvents = True
Second, regarding your statement: If the user discovers this then the whole exercise is defeated.
This isn't just true for Column U or W, but also for the code itself. If a user discovers the code, they could just delete it, disable it - or if they knew how - modify it.
Along with locking any cells that you don't want the users to access, you also need to hide and password protect the code.
Modifying the code to work for multiple cells would be difficult, mainly due to the MsgBox options. If they delete more than one cell, they would need to respond to the MsgBox for each cell or for the group or for whatever you want them to do. Each option would require different code.
An easier option would be to prevent them from selecting more than one cell if any part of that selection includes any cell(s) in Column W.
The code I offered earlier fires whenever a change is made to the worksheet and only continues if the change was in Column W.
This code will fire whenever the user selects any cell or cells in the worksheet.
If the selection includes 1 or more cells in Column W, then it will check to see if more than one cell has been selected.
If more than one cell is selected, and one or more of those cells is in Column W, it will present a MsgBox to the user and then collapse the selection to a single cell to prevent the user working with the selected range.
Paste this code in the same module as the Worksheet_Change code from above and they should work nicely together.
However - and it's a big however...
I see a potential problem:
If the user does an AutoFill in Column W, it will present the "Invalid Selection" MsgBox, but the AutoFill will already have taken place. This in turn will cause an error in the Change macro. I can capture the error and deal with it, but it would be problematic to reset the AutoFilled cells back their original dates. So we still have an issue with a specific type of "multiple selection" in Column W causing a problem - the AutoFill
VBA does have the ability to turn off AutoFill for the entire workbook, but I don't know of a way to turn it off for just one column. In fact, turning off AutoFill turns it off at the Application level, so it can't be used in any workbook during that Excel session.
Anyway, here's the additional code required to prevent the users from selecting multiple cells that include Column W.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Determine if selected cell(s) include Column 23 (W)
If Not Intersect(Target, Columns(23)) Is Nothing Then
'If Yes, Determine if more than 1 cell was selected
If Target.Cells.Count > 1 Then
'If Yes, Present MsgBox and Collapse Selection
MsgBox "Cells in Column W Must Be Selected Individually" & _
vbCrLf & vbCrLf & _
"Your Selection Will Be Reset", , _