Odwracanie kolejności liter w wyrazach oraz wyrazów w zdaniach

by Marcin

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))

Odwracanie kolejności liter w wyrazach oraz wyrazów w zdaniach

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.

Odwracanie kolejności liter w wyrazach oraz wyrazów w zdaniach

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))

Odwracanie kolejności liter w wyrazach oraz wyrazów w zdaniach

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 wyrazach oraz wyrazów w zdaniach

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)

Odwracanie kolejności liter w wyrazach oraz wyrazów w zdaniach

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

Download

{ 2 comments… read them below or add one }

Rafał K

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

Maciej

Witam,

mam prośbę, chciałbym uzyskać formułę i nie za bardzo wiem jak sobie z tym poradzić, która by przenosiła czwarty wyraz z zdania na pierwszą pozycję. Chodzi o następujący efekt:
Jan Kowalski kupił niebieski samochód –> niebieski Jan Kowalski kupił samochód.

Z góry dziękuję za pomoc

Leave a Comment

Previous post:

Next post: