Kilka dni temu rozpocząłem pisanie o odwracaniu kolejności wyrazów i znaków w ciągach tekstowych oraz cyfr w liczbach. Zdążyłem wtedy napisać tylko o liczbach, dzisiaj więc kilka słów o ciągach tekstowych.
Odwracanie kolejności wyrazów przy pomocy funkcji Excela
Mam w komórce „Jan Kowalski”, a bardzo chciałbym mieć „Kowalski Jan”. Problem można rozwiązać przy pomocy poniższej formuły:
=PRAWY(C14;DŁ(C14)-SZUKAJ.TEKST(” „;C14))& ” ” & LEWY(C14;SZUKAJ.TEKST(” „;C14))

Można także nieco utrudnić sprawę i spróbować tego samego dla trzech wyrazów (na przykład dodając drugie imię). Mam teraz „Jan Seweryn Kowalski”, a chciałbym mieć „Kowalski Seweryn Jan”. Formuła, którą pokazałem wyżej przesunie tylko pierwszy wyraz na koniec, resztę zdania pozostawiając nienaruszoną („Seweryn Kowalski Jan”) co nie do końca jest tym, o co nam chodziło.

Chcąc osiągnąć oczekiwany rezultat musisz rozbudować nieco formułę, na przykład do takiej postaci:
=PRAWY(C16;DŁ(C16)-SZUKAJ.TEKST(” „;C16;SZUKAJ.TEKST(” „;C16)+1))& ” ” & FRAGMENT.TEKSTU(C16;SZUKAJ.TEKST(” „;C16)+1;SZUKAJ.TEKST(” „;C16;SZUKAJ.TEKST(” „;C16)+1)-SZUKAJ.TEKST(” „;C16)-1) &” ” & LEWY(C16;SZUKAJ.TEKST(” „;C16))

W przypadku większej ilości wyrazów, stosując przedstawione podejście, formuły stają się coraz bardziej „potworkowe” (gdzie przez „potworkowe” rozumiem „długie i pokręcone”). Zasadniczo, w takich przypadkach, starałbym się poszukać innego rozwiązania. Muszę przyznać, że moje poszukiwania prostszej formuły chwilowo przebiegają bezskutecznie, więc jeżeli ktoś miałby lepsze rozwiązanie jak zwykle zachęcam do kontaktu.
Odwracanie kolejności wyrazów przy pomocy VBA
Można oczywiście wspomóc się kodem VBA i funkcją użytkownika, której kod mógłby wyglądać następująco:
Public Function OdwrocKolejnoscWyrazow(Tekst As String) As String
Dim Odwrocony As String
Dim KolejnaSpacja As Integer
Dim Licznik As Integer
Odwrocony = vbNullString
Tekst = Trim(Tekst) ' usuwam spacje przed i na koncu zdania
If Len(Replace(Tekst, " ", "")) <> Len(Tekst) Then ' jezeli wiecej niz jeden wyraz
KolejnaSpacja = Len(Tekst) + 1
For Licznik = Len(Tekst) To 1 Step -1 ' przesuwamy sie po jednej literze, od konca zdania
If Mid(Tekst, Licznik, 1) = " " Then ' jezeli trafimy na spacje,
'do wynikowego ciagu tekstowego dodaje wyraz na prawo od tej spacji
Odwrocony = Odwrocony & Mid(Tekst, Licznik + 1, KolejnaSpacja - Licznik - 1) & " "
KolejnaSpacja = Licznik ' zapamietuje pozycje ostatniej spacji
End If
Next Licznik
Odwrocony = Odwrocony & Mid(Tekst, 1, KolejnaSpacja) ' pierwszy wyraz
Else
Odwrocony = Tekst ' jezeli jeden wyraz to funkcja zwraca ten wyraz
End If
OdwrocKolejnoscWyrazow = Odwrocony
End Function
Jak widzisz na rysunku poniżej przedstawiona funkcja użytkownika umożliwia otrzymanie dokładnie takiego rezultatu o jaki nam chodziło, czyli odwrócenie kolejności występowania wszystkich wyrazów w zdaniu.

Odwracanie kolejności liter w wyrazie
Nie wydaje mi się, aby było możliwe odwrócenie kolejności znaków w wyrazie bez użycia VBA. Wszystko, czego Excelowi brakuje to funkcji, która umożliwiałaby łączenie znaków przechowywanych w tablicy, czyli czegoś na kształt funkcji ZŁĄCZ.TEKSTY, której jako argument przekazać moglibyśmy tablicę. Wtedy zadanie byłoby całkiem proste do realizacji.
Póki co, najprostszym rozwiązaniem jest chyba napisanie funkcji użytkownika wykorzystując dostępną z poziomu VBA funkcję StrReverse (na pewno dostępna od Excela 2003 w górę).
Przykładowa funkcja mogłaby wyglądać tak:
Public Function ReverseString(Tekst As string) As StringReverse String = StrReverse(Tekst) End Function
Chcąc teraz odwrócić kolejność znaków w ciągu wystarczy z poziomu skoroszytu użyć naszej funkcji użytkownika.
=ReverseString(A1)

Na koniec jeszcze, dla wszystkich, którzy nie mogą skorzystać z funkcji StrReverse oraz tych, którzy chcieliby sobie zobaczyć jak inaczej można to zrobić, przykład na inne rozwiązanie problemu z poziomu VBA.
Public Function OdwrocKolejnoscLiter(Tekst As String) As String Dim Odwrocony As String Dim Licznik As Integer Odwrocony = vbNullString For Licznik = 0 To Len(Tekst) - 1 Odwrocony = Odwrocony & Mid(Tekst, Len(Tekst) - Licznik, 1) Next Licznik OdwrocKolejnoscLiter = Odwrocony End Function


{ 1 comment… read it below or add one }
Public Function ZamienTekst(Tekst As String) As String
Dim Odwrocony As String
Dim tbl As Variant
Odwrocony = vbNullString
Tekst = Trim(Tekst) ‘ usuwam spacje przed i na koncu zdania
tbl = Split(Tekst, ” „)
For i = UBound(tbl) To 0 Step -1
Odwrocony = Odwrocony & ” ” & tbl(i)
Next i
ZamienTekst = Trim(Odwrocony)
End Function