O evento Worksheet_Change
essencialmente pode realizar o que você está pedindo, mas é necessário ter certeza de que o usuário pretende que as coisas mudem. Adicionei uma caixa de opções 'Yes/No'
à minha solução para evitar alterações acidentais. Fazer isso sem uma caixa de opções é arriscado, porque se você tentasse editar um valor existente, ele mudaria de volta para a formatação original.
Esse código deve "viver" dentro do código do VBA para a planilha na qual você deseja que ele atue:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iDay, iMonth, iYear As Integer
Dim solutionRange As Range
'the cells you want the date to change for
Set solutionRange = Range("D4:D12")
'only triggers if the user's changing one cell
If Target.Count = 1 Then
If (Not (Intersect(solutionRange, Target) Is Nothing) And (Target.Value > 0)) Then
'disable application events so this change doesn't trigger itself
Application.EnableEvents = False
iDay = Left(Target.Value, 2)
iMonth = Mid(Target.Value, 4, 2)
iYear = Right(Target.Value, 4)
' Give the user a choice to say whether they need the date changed. You *can* remove both the 'If' and 'End If' if you really need to, but I'd strongly suggest keeping them.
If (MsgBox("Have you entered your date in the format 'MM/DD/YYYY'?", vbYesNo) = vbYes) Then
Target.Value = DateValue(iMonth & "/" & iDay & "/" & iYear)
End If
Application.EnableEvents = True
End If
End If
End Sub