|     This set of functions allow developers to handle special rules of name spellings. It is modular so that additional rules for other nationalities can be easily added.  For example it handles names such as: Henry VIIIK. O'Hara
 Tom McHill
 Mary Smith - Jones
 Call the function with the name passed in any state of capitalization, returned value is correctly capitalized (original argument is not modified, making it suitable for use in queries). dim retval as string retval=mixed_case("joe mcdonald")
 
Public Function mixed_case(str As Variant) As String
Dim ts As String, ps As Integer, char2 As String
    If IsNull(str) Then
        mixed_case = ""
        Exit Function
    End If
    str = Trim(str) 
    If Len(str) = 0 Then
        mixed_case = ""
        Exit Function
    End If
    ts = LCase$(str)
    ps = 1
    ps = first_letter(ts, ps)
    special_name ts, 1 
    Mid$(ts, 1) = UCase$(Left$(ts, 1))
    If ps = 0 Then
        mixed_case = ts
        Exit Function
    End If
    While ps <> 0
        If is_roman(ts, ps) = 0 Then 
            special_name ts, ps
            Mid$(ts, ps) = UCase$(Mid$(ts, ps, 1)) 
        End If
        ps = first_letter(ts, ps)
    Wend
    mixed_case = ts
End Function
Private Sub special_name(str As String, ps As Integer) 
Dim char2 As String 
char2 = Mid$(str, ps, 2) 
If (char2 = "mc") And Len(str) > ps + 1 Then 
    Mid$(str, ps + 2) = UCase$(Mid$(str, ps + 2, 1)) 
End If 
char2 = Mid$(str, ps, 2) 
If (char2 = "ff") And Len(str) > ps + 1 Then 
    Mid$(str, ps, 2) = LCase$(Mid$(str, ps, 2)) 
End If 
char2 = Mid$(str, ps + 1, 1) 
If (char2 = "'") Then 
    Mid$(str, ps + 2) = UCase$(Mid$(str, ps + 2, 1)) 
End If 
Dim char3 As String 
char3 = Mid$(str, ps, 3) 
If (char3 = "mac") And Len(str) > ps + 1 Then     Mid$(str, ps + 3) = UCase$(Mid$(str, ps + 3, 1)) 
End If 
Dim char4 As String 
char4 = Mid$(str, ps, 4) 
If (char4 = "fitz") And Len(str) > ps + 1 Then 
    Mid$(str, ps + 4) = UCase$(Mid$(str, ps + 4, 1)) 
End If 
End Sub 
Private Function first_letter(str As String, ps As Integer) As Integer
Dim p2 As Integer, p3 As Integer, s2 As String
    s2 = str
    p2 = InStr(ps, str, " ") 
    p3 = InStr(ps, str, "-") 
    If p3 <> 0 Then
        If p2 = 0 Then
            p2 = p3
        ElseIf p3 < p2 Then
            p2 = p3
        End If
    End If
    If p2 = 0 Then
        first_letter = 0
        Exit Function
    End If
    
    While is_alpha(Mid$(str, p2)) = False
        p2 = p2 + 1
        If p2 > Len(str) Then 'we ran off the end
            first_letter = 0
            Exit Function
        End If
    Wend
    first_letter = p2
End Function
Public Function is_alpha(ch As String)
    Dim c As Integer
    c = Asc(ch)
    Select Case c
        Case 65 To 90
            is_alpha = True
        Case 97 To 122
            is_alpha = True
        Case Else
            is_alpha = False
    End Select
    
End Function
Private Function is_roman(str As String, ps As Integer) As Integer
Dim mx As Integer, p2 As Integer, flag As Integer, i As Integer
    mx = Len(str) 
    p2 = InStr(ps, str, " ") 
    If p2 = 0 Then
        p2 = mx + 1
    End If
    
    flag = 0
    For i = ps To p2 - 1
        If InStr("ivxIVX", Mid$(str, i, 1)) = 0 Then
            flag = 1
        End If
    Next i
    If flag Then
        is_roman = 0
        Exit Function 
    End If
    Mid$(str, ps) = UCase$(Mid$(str, ps, p2 - ps))
    is_roman = 1
End Function
 |