Have you considered this instead?
Change the NumberFormat on entering a cell to "General" NumberFormat everytime.
(You would have to enter the cell in edit mode to change from a date to text anyway, so it is not significantly different)
Instead of checking the format when you are leaving the cell.
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ActiveCell.NumberFormat = "General"
End Sub
Of course this can create other problems with other cells you don't want as "General", but you could exclude ranges, pretty easily by testing...
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If ActiveCell.Column <> 4 Then
ActiveCell.NumberFormat = "General"
End If
End Sub
When you enter a date in an ActiveCell, Excel will still convert it to date format on your exiting, but because it is a "General" format to begin with a serial number won't convert to a date, which seems to be the issue you have now.
The biggest disadvantage is that selecting an existing date will convert it to "General", but while still in the cell you can always right-click and format it as date, if you forgot to notice what the date was before exiting.
If you still want to explore formatting the cell as you leave it you could try this as well
Store the current ActiveCell as a Public variable in a module so that when you leave it, you can use it to check whether it is a date format
The Cell function might be the easiest way to test for a date format
aCell = Application.Evaluate("=CELL(""format""," & previousCell & ")")
If Left(aCell, 1) <> "D" Then previouseCell.NumberFormat = "General"