Private Function Capitalise(ByVal vStrText As String) As String Dim intPos As Integer Dim strCapitalised As String strCapitalised = vStrText ' Check for a passed null or empty string. If (IsNull(strCapitalised)) Or (LenB(strCapitalised) = 0) Then strCapitalised = vbNullString ' A valid string was passed. Else ' Simple case e.g. Smith. strCapitalised = UCase$(Left$(strCapitalised, 1)) & LCase$(Right$(strCapitalised, _ Len(strCapitalised) - 1)) ' Apostrophe case e.g. D'Arc. intPos = InStr(1, strCapitalised, "'") If intPos > 0 Then strCapitalised = UCase$(Left$(strCapitalised, 1)) & _ LCase$(Mid$(strCapitalised, 2, (intPos - 2))) & "" & _ UCase$(Mid$(strCapitalised, intPos + 1, 1)) & _ LCase$(Right$(strCapitalised, Len(strCapitalised) - (intPos + 1))) End If ' McDonald case. intPos = InStr(1, LCase$(strCapitalised), "mc") If intPos > 0 Then strCapitalised = UCase$(Left$(strCapitalised, 1)) & LCase$(Mid$(strCapitalised, 2, 1)) & _ UCase$(Mid$(strCapitalised, 3, 1)) & LCase$(Right$(strCapitalised, Len(strCapitalised) - 3)) End If ' MacDonald case. intPos = InStr(1, LCase$(strCapitalised), "mac") If intPos > 0 Then strCapitalised = UCase$(Left$(strCapitalised, 1)) & LCase$(Mid$(strCapitalised, 2, 2)) & _ UCase$(Mid$(strCapitalised, 4, 1)) & _ LCase$(Right$(strCapitalised, Len(strCapitalised) - 4)) End If ' Space case e.g. John Smith. intPos = InStr(1, strCapitalised, " ") If intPos > 0 Then strCapitalised = SplitText(strCapitalised, " ") End If ' Hyphen case e.g. John Double-Barrelled. intPos = InStr(1, strCapitalised, "-") If intPos > 0 Then strCapitalised = SplitText(strCapitalised, "-") End If End If ' Assign the function result. Capitalise = strCapitalised End Function Private Function SplitText(ByVal vStrText As String, ByVal vStrDelimiter As String) As String Dim intIndex As Integer Dim intLowerBound As Integer Dim intUpperBound As Integer Dim strTextArray() As String SplitText = vbNullString ' Split the passed text into an array, ' delimited by the passed delimiter. strTextArray = Split(vStrText, vStrDelimiter) If Not IsEmpty(strTextArray) Then intLowerBound = LBound(strTextArray) intUpperBound = UBound(strTextArray) ' Iterate through the array, capitalising ' the substrings in each element. For intIndex = intLowerBound To intUpperBound strTextArray(intIndex) = Capitalise(strTextArray(intIndex)) Next ' Join the substrings together again, ' delimit using the passed delimiter ' and assign to the function result. SplitText = Join(strTextArray, vStrDelimiter) End If End Function