Sorry, dumb mistake. When I was separating two person names I was using "AND" instead of " AND " which would improperly split up names with AND in them such as C"and"ace on Row 205. I have corrected for that. I also made a few other changes:
1) Added code to deal with an empty line in Column C.
2) If the macro is run with no new names it will cause an error - added a message box for this issue.
3) Corrected for when First Name is a common name i.e. VAN SMITH would have returned "VAN SMITH" in the last name - now fixed to return "VAN" and "SMITH"
Here is the corrected code.
Sub FillNames()
Dim vNamesArr() As Variant
Dim sNamesArr() As String
Dim s2NamesArr(1 To 2) As String
Dim sTempArr() As String
Dim lStartIndex As Long
Dim i As Long
vNamesArr = Application.WorksheetFunction.Transpose(Range(Range("C2"), Range("C65536").End(xlUp)).Value)
lStartIndex = Range("D2").End(xlDown).End(xlDown).End(xlUp).Row
If lStartIndex > UBound(vNamesArr) Then
MsgBox "There were no new names entered! Only run this macro when there is at least " & _
"one new name" & vbCrLf & vbCrLf & "Select OK to exit macro.", _
vbCritical, "FillList Macro Error"
Exit Sub
End If
ReDim sNamesArr(lStartIndex To UBound(vNamesArr), 1 To 4)
For i = lStartIndex To UBound(vNamesArr)
vNamesArr(i) = UCase(Trim(vNamesArr(i)))
Do While InStr(vNamesArr(i), " ")
vNamesArr(i) = Replace(vNamesArr(i), " ", " ")
Loop
If InStr(vNamesArr(i), " AND ") Then
s2NamesArr(1) = Left(vNamesArr(i), InStr(vNamesArr(i), " AND ") - 1)
s2NamesArr(2) = Mid(vNamesArr(i), InStrRev(vNamesArr(i), " AND ") + 5)
sTempArr = ParseName(s2NamesArr(1))
sNamesArr(i, 1) = sTempArr(1)
sNamesArr(i, 2) = sTempArr(2)
sTempArr = ParseName(s2NamesArr(2))
sNamesArr(i, 3) = sTempArr(1)
sNamesArr(i, 4) = sTempArr(2)
Else
sTempArr = ParseName(CStr(vNamesArr(i)))
sNamesArr(i, 1) = sTempArr(1)
sNamesArr(i, 2) = sTempArr(2)
End If
Next i
Range(Range("D" & lStartIndex + 1), Range("G" & i)).Value = sNamesArr()
End Sub
Private Function ParseName(Name As String) As String()
Dim vNameArr As Variant
Dim sNameArr(1 To 2) As String
Dim sNameTypeArr() As String
Dim lItem As Long
Dim i As Long
If IsEmpty(Name) Or Name = "" Then
sNameArr(1) = "empty"
sNameArr(2) = ""
ParseName = sNameArr
Exit Function
End If
vNameArr = Split(Name, " ")
lItem = UBound(vNameArr) + 1
ReDim Preserve vNameArr(1 To lItem)
If lItem = 1 Then
sNameArr(1) = vNameArr(1)
sNameArr(2) = ""
ParseName = sNameArr
Exit Function
End If
ReDim sNameTypeArr(1 To lItem)
vNameArr(lItem) = Replace(vNameArr(lItem), ".", "")
Select Case vNameArr(lItem)
Case "MD", "PHD", "JR", "SR", "ESQ", "I", "II", "III", "IV", "V"
sNameTypeArr(lItem) = "L"
lItem = lItem - 1
End Select
sNameTypeArr(lItem) = "L"
lItem = lItem - 1
If lItem > 1 Then
Select Case vNameArr(lItem)
Case "DE", "DEL", "DI", "VAN", "VON", "DER", "MC", "MAC", "SAN"
sNameTypeArr(lItem) = "L"
lItem = lItem - 1
End Select
End If
For i = 1 To lItem
sNameTypeArr(i) = "F"
Next i
For i = 1 To UBound(sNameTypeArr)
If sNameTypeArr(i) = "F" Then
sNameArr(1) = sNameArr(1) & vNameArr(i) & " "
Else
sNameArr(2) = sNameArr(2) & vNameArr(i) & " "
End If
Next i
sNameArr(1) = Trim(sNameArr(1))
sNameArr(2) = Trim(sNameArr(2))
ParseName = sNameArr
End Function
Please note, I suspect there are other conditions that would cause an error. I just don't have the time to code all the possible error checking and per previous post this should be a 90% solution.
Regards,
Bookmarks