Вот более универсальное решение для проблемы, указанной в заголовке (не будет обрабатывать особенности инвертирования имени / фамилии, что является другой проблемой):
Public Function ReverseWords(ByVal value As String) As String
Dim words As Variant
words = VBA.Strings.Split(value, " ")
Dim result As String, i As Long
For i = LBound(words) To UBound(words)
result = words(i) & " " & result
Next
ReverseWords = result
End Function
Использование:
Debug.Print ReverseWords("the quick brown fox jumps over the lazy dog")
Выходы:
dog lazy the over jumps fox brown quick the
Тем не менее, для ОП речь вовсе не идет об инверсии слов в строке. Решение состоит в том, чтобы разобрать заданную строку.
Первая заглавная буква действительно там, где я хочу поменяться
Итак, вам нужно найти индекс первой заглавной буквы во входной строке, затем извлечь имя и фамилию, обрезать их, затем объединить.
Это работает:
Public Function ReverseFullName(ByVal value As String) As String
Dim firstCapitalIndex As Long, i As Long
For i = 1 To Len(value)
If IsCapitalLetter(Mid$(value, i, 1)) Then
firstCapitalIndex = i
Exit For
End If
Next
If i = 1 Then
'already shaped as needed
ReverseFullName = value
Exit Function
End If
Dim firstName As String
firstName = Trim$(Left$(value, firstCapitalIndex - 1))
Dim lastName As String
lastName = Trim$(Mid$(value, firstCapitalIndex))
ReverseFullName = lastName & ", " & firstName
End Function
Private Function IsCapitalLetter(ByVal value As String) As Boolean
Dim asciiCode As Integer
asciiCode = Asc(value)
IsCapitalLetter = asciiCode >= Asc("A") And asciiCode <= Asc("Z")
End Function
Использование:
Debug.Print ReverseFullName("van de Voort van Zijp")
Debug.Print ReverseFullName("de Vries")
Debug.Print ReverseFullName("Voort van Zijp, van de")
Выходы:
Voort van Zijp, van de
Vries, de
Voort van Zijp, van de