Here's a function that I designed to work with addresses. It watches for things like RR or directional indicators like NE, NW, etc. It's not the most elegant code in the world, but it has worked quite well in a database where they enter dozens of addresses every day. Put the function in a module, then in the AfterUpdate property of the address field put Me!Address = SetProper(Address).
==================================
Function SetProper(ByVal strFixCase As String) As String
On Error GoTo Err_SetProper
Dim I As Integer, intSkip As Integer, intASC As Integer, intLen As Integer
Dim intPos1 As Integer, intPos2 As Integer, intPos3 As Integer
Dim intPos4 As Integer, intPos5 As Integer, intPos6 As Integer
Dim intPos7 As Integer, intPos8 As Integer, intPos9 As Integer
Dim strUpper As String, strLast As String, strDir As String
strUpper = strFixCase
strLast = " "
strUpper = LCase$(strUpper)
intLen = Len(strUpper)
For I = 1 To intLen
If intSkip > 0 Then
intSkip = intSkip - 1
GoTo NextOne
End If
If strLast = " " Then
If Len(strUpper) - I > 2 Then
If Mid$(strUpper, I, 2) = "o'" Or Mid$(strUpper, I, 2) = "mc" Then
Mid$(strUpper, I, 1) = UCase$(Mid$(strUpper, I, 1))
intSkip = 1
GoTo NextOne
End If
If Mid$(strUpper, I, 3) = "mac" Then
Mid$(strUpper, I, 1) = UCase$(Mid$(strUpper, I, 1))
intSkip = 2
GoTo NextOne
End If
End If
If Mid$(strUpper, I, 3) = "po " Or Mid$(strUpper, I, 3) = "ne " Or Mid$(strUpper, I, 3) = "se " Or Mid$(strUpper, I, 3) = "sw " Then
Mid$(strUpper, I, 3) = UCase$(Mid$(strUpper, I, 3))
intSkip = 1
GoTo NextOne
End If
If Mid$(strUpper, I, 2) = "nw" Or Mid$(strUpper, I, 2) = "rr" Then
Mid$(strUpper, I, 2) = UCase$(Mid$(strUpper, I, 2))
intSkip = 1
GoTo NextOne
End If
End If
intASC = Asc(strLast)
If intASC = 39 Or (intASC >= 97 And intASC <= 122) Or (intASC >= 65 And intASC <= 90) Or (intASC >= 224 And intASC <= 246) Or (intASC >= 248) Then
Else
Mid$(strUpper, I, 1) = UCase$(Mid$(strUpper, I, 1))
End If
strLast = Mid$(strUpper, I, 1)
NextOne:
Next I
SetProper = strUpper
intPos1 = InStr(SetProper, "1st")
intPos2 = InStr(SetProper, "2nd")
intPos3 = InStr(SetProper, "3rd")
intPos4 = InStr(SetProper, "4th")
intPos5 = InStr(SetProper, "5th")
intPos6 = InStr(SetProper, "6th")
intPos7 = InStr(SetProper, "7th")
intPos8 = InStr(SetProper, "8th")
intPos9 = InStr(SetProper, "9th")
If intPos1 > 0 Then
SetProper = Left$(SetProper, intPos1 - 1) & "1st" & Mid$(SetProper, intPos1 + 3)
End If
If intPos2 > 0 Then
SetProper = Left$(SetProper, intPos2 - 1) & "2nd" & Mid$(SetProper, intPos2 + 3)
End If
If intPos3 > 0 Then
SetProper = Left$(SetProper, intPos3 - 1) & "3rd" & Mid$(SetProper, intPos3 + 3)
End If
If intPos4 > 0 Then
SetProper = Left$(SetProper, intPos4 - 1) & "4th" & Mid$(SetProper, intPos4 + 3)
End If
If intPos5 > 0 Then
SetProper = Left$(SetProper, intPos5 - 1) & "5th" & Mid$(SetProper, intPos5 + 3)
End If
If intPos6 > 0 Then
SetProper = Left$(SetProper, intPos6 - 1) & "6th" & Mid$(SetProper, intPos6 + 3)
End If
If intPos7 > 0 Then
SetProper = Left$(SetProper, intPos7 - 1) & "7th" & Mid$(SetProper, intPos7 + 3)
End If
If intPos8 > 0 Then
SetProper = Left$(SetProper, intPos8 - 1) & "8th" & Mid$(SetProper, intPos8 + 3)
End If
If intPos9 > 0 Then
SetProper = Left$(SetProper, intPos9 - 1) & "9th" & Mid$(SetProper, intPos9 + 3)
End If
strDir = Right(SetProper, 3)
If strDir = " NE" Then
SetProper = Left$(SetProper, intLen - 3) & " NE"
End If
If strDir = " SE" Then
SetProper = Left$(SetProper, intLen - 3) & " SE"
End If
Exit_SetProper:
Exit Function
Err_SetProper:
MsgBox "Error: " + Error$
Resume Exit_SetProper
End Function