You may need to adjust your range, but something like this should work. Put this in the Worksheet Change event:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not IsDate(Target.Value) Then Exit Sub
If Target.Address <> "$A$1" Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
Dim DateSuffix As String
Target.NumberFormat = ""
Select Case Day(Target.Value)
Case 1, 21, 31
DateSuffix = "\s\t"
Case 2, 22
DateSuffix = "\n\d"
Case 3, 23
DateSuffix = "\r\d"
Case 4 To 30
DateSuffix = "\t\h"
End Select
Application.EnableEvents = False
Target.NumberFormat = "mmmm d" & DateSuffix & ", yyyy"
Application.EnableEvents = True
End Sub