Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Dim invalidEntry As Boolean
Dim cancelChange As Boolean
Dim sysDateColumn As Integer
' Set your SysDate column number here (e.g., 4 for Column D)
sysDateColumn = 4
' Prevent multiple alerts
Application.EnableEvents = False
Application.ScreenUpdating = False
' Check each changed cell
For Each cell In Target
' Only validate SysDate column
If cell.Column = sysDateColumn Then
If Not IsEmpty(cell) Then
' Reset validation flags
invalidEntry = False
' Check 1: Is it a date at all?
If Not IsDate(cell.Value) Then
invalidEntry = True
Else
' Check 2: Correct format (dd-mmm-yyyy)
If Not cell.Text Like "##-???-####" Then
invalidEntry = True
' Check 3: Not a past date
ElseIf CDate(cell.Value) < Date Then
invalidEntry = True
End If
End If
' If invalid, mark for undo
If invalidEntry Then
cancelChange = True
cell.Value = "" ' Clear invalid entry
End If
End If
End If
Next cell
' Restore Excel functionality
Application.ScreenUpdating = True
Application.EnableEvents = True
' Show error if needed
If cancelChange Then
MsgBox "Invalid date! Please:" & vbCrLf & _
"1. Use dd-mmm-yyyy format (e.g., 05-Jun-2024)" & vbCrLf & _
"2. Only enter today or future dates", _
vbCritical, "Invalid Date Entry"
End If
End Sub