Usuwanie duplikatów w jednej komórce Libre
Usuwanie duplikatów w jednej komórce Libre
Dzień dobry wszystkim,
Ma problem z dobraniem formuły pod usuwanie duplikatów po przecinku w jednej komórce.
Chodzi dokładnie o taki przykład:
1.0 TFSI, 1.2 TFSI, 1.4 TFSI, 1.4 TFSI, 1.2 TFSI, 1.0 TFSI, 2.0 TFSI, 1.6 TDI
żeby było:
1.0 TFSI, 1.4 TFSI, 1.2 TFSI, 2.0 TFSI, 1.6 TDI
Czy, ktoś poratuje jakaś formułą ? Ręczne usuwanie to masakra.
Ma problem z dobraniem formuły pod usuwanie duplikatów po przecinku w jednej komórce.
Chodzi dokładnie o taki przykład:
1.0 TFSI, 1.2 TFSI, 1.4 TFSI, 1.4 TFSI, 1.2 TFSI, 1.0 TFSI, 2.0 TFSI, 1.6 TDI
żeby było:
1.0 TFSI, 1.4 TFSI, 1.2 TFSI, 2.0 TFSI, 1.6 TDI
Czy, ktoś poratuje jakaś formułą ? Ręczne usuwanie to masakra.
OpenOffice 3.1
Re: Usuwanie duplikatów w jednej komórce Libre
Podstawowe pytanie do twojego problemu. Czy chcesz ten proces wykonać tylko raz, żeby zreorganizować zapisy w swojej bazie? Czy też ma to być procedura wykonywana zawsze na danych, które będą wprowadzane?
AOO 4.1.15, LO 25.8 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Re: Usuwanie duplikatów w jednej komórce Libre
Proces będzie wykonywany zawsze na różnych danych, te są tylko przykładowe.
OpenOffice 3.1
Re: Usuwanie duplikatów w jednej komórce Libre
EDIT: Zapraszam do zapoznania się z nowszą wersją tej funkcji, którą można znaleźć tutaj: Unikalne wystąpienia (po raz trzeci) i potrafi troszkę więcej.
Myślę, że w takim przypadku najlepsze będzie własna funkcja (makro).
Napisałem funkcję użytkownika, która zwróci unikalne wystąpienia fragmentów tekstu .
Wywołanie funkcji:
UNIKALNE( tekst; separator)
tekst - jest to ciąg znaków który ma zostać podzielony na fragmenty
separator- parametr opcjonalny, w jakim znaku ma być dokonany podział. Jeśli się go nie poda domyślnym znakiem będzie spacja.
Jak działa ta funkcja:
Załóżmy że w komórce A1 znajduje się tekst: 1.0 TFSI, 1.2 TFSI, 1.4 TFSI, 1.4 TFSI, 1.2 TFSI, 1.0 TFSI, 2.0 TFSI, 1.6 TDI
Do komórki B1 należy wpisać formułę: otrzymany wynik to: 1.0 TFSI, 1.2 TFSI, 1.4 TFSI, 2.0 TFSI, 1.6 TDI
Załóżmy że w komórce A2 znajduje się tekst: 1.0 TFSI, TFSI, 1.6 TDI, TDI
W komórce B2jest formuła: otrzymany wynik to: 1.0 TFSI, 1.6 TDI
Ze względu na prymitywność stworzonej przeze mnie funkcji słowa TFSI oraz TDI zostały wykluczone - zawierają się niestety we wcześniejszym fragmencie. W obecnej, ulepszonej funkcji zostają porównywane całe fragmenty tekstu więc wynikiem zastosowanej funkcji będzie: 1.0 TFSI, TFSI, 1.6 TDI, TDI
O używaniu własnych funkcji można przeczytać w tym opracowaniu: https://yestok.pl/ooo/y58.php
Myślę, że w takim przypadku najlepsze będzie własna funkcja (makro).
Napisałem funkcję użytkownika, która zwróci unikalne wystąpienia fragmentów tekstu .
Wywołanie funkcji:
UNIKALNE( tekst; separator)
tekst - jest to ciąg znaków który ma zostać podzielony na fragmenty
separator- parametr opcjonalny, w jakim znaku ma być dokonany podział. Jeśli się go nie poda domyślnym znakiem będzie spacja.
Kod: Zaznacz cały
Function unikalne(tekst as string, optional separator as string) as string
dim podziel(), wynik(0), i as string
dim j, n as integer
If IsMissing(separator) then separator = " "
tekst = replace(tekst, " ", " ")
podziel = split(tekst, separator)
unikalne = trim(podziel(0))
wynik(0)= unikalne
n=1
if separator <> " " then separator = separator + " "
for each i in podziel()
for j=0 to n
if j = n then
redim preserve wynik(n)
wynik(n)=trim(i)
unikalne = unikalne + separator + wynik(n)
n=n+1
endif
if wynik(j) = trim(i) then exit for
next j
next i
'print(unikalne)
End Function- Dany Tekst jest dzielony na fragmenty zgodnie ze zgłoszonym separatorem,
Pierwszy fragment zostaje wpisany do wyniku,
Następnie jest sprawdzane czy kolejny fragment tekstu zawiera się w wyniku jest identyczny z poprzednimi fragmentami
-- jeśli jest to zostaje wybrany kolejny fragment
-- jeśli nie, to ten fragment zostaje dopisany do wyniku, i znowu wybrany jest kolejny fragment do sprawdzenia
itd, aż do ostatniego fragmentu
Załóżmy że w komórce A1 znajduje się tekst: 1.0 TFSI, 1.2 TFSI, 1.4 TFSI, 1.4 TFSI, 1.2 TFSI, 1.0 TFSI, 2.0 TFSI, 1.6 TDI
Do komórki B1 należy wpisać formułę:
Kod: Zaznacz cały
=UNIKALNE(A1; ",")Załóżmy że w komórce A2 znajduje się tekst: 1.0 TFSI, TFSI, 1.6 TDI, TDI
W komórce B2jest formuła:
Kod: Zaznacz cały
=UNIKALNE(A2; ",")Ze względu na prymitywność stworzonej przeze mnie funkcji słowa TFSI oraz TDI zostały wykluczone - zawierają się niestety we wcześniejszym fragmencie. W obecnej, ulepszonej funkcji zostają porównywane całe fragmenty tekstu więc wynikiem zastosowanej funkcji będzie: 1.0 TFSI, TFSI, 1.6 TDI, TDI
O używaniu własnych funkcji można przeczytać w tym opracowaniu: https://yestok.pl/ooo/y58.php
Ostatnio zmieniony wt gru 07, 2021 11:47 am przez Rafkus, łącznie zmieniany 4 razy.
Powód: Ulepszyłem funkcję
Powód: Ulepszyłem funkcję
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Usuwanie duplikatów w jednej komórce Libre
Super dziękuje za pomoc, tylko pytanie nie mam funkcji unikalne libre to 7.2.0 czy ma być inna wersja ?
OpenOffice 3.1
Re: Usuwanie duplikatów w jednej komórce Libre
Funkcję UNIKALNE napisał @Rafkus i dostarczył jej kod w poście wyżej.
Musisz ją osadzić w swojej bibliotece makr, na wszystkich komputerach na których taka akcja ma być wykonywana.
Narzędzia → Makra → Zarządzaj → Basic → Moje makra → (wybierz bibliotekę, może być istniejąca Standard albo możesz utworzyć nową) → Edycja → (wklej kod pobrany z postu @Rafkusa).
Tak zainstalowaną funkcję można będzie wykonywać we wszystkich skoroszytach otwieranych na tym komputerze.
Można też alternatywnie osadzić funkcję w dokumencie skoroszytu zamiast w środowisku użytkownika. Wtedy będzie dostępna po otwarciu na dowolnym komputerze z Calcem, ale uwaga: każdy skoroszyt będzie miał osobną kopię funkcji.
Musisz ją osadzić w swojej bibliotece makr, na wszystkich komputerach na których taka akcja ma być wykonywana.
Narzędzia → Makra → Zarządzaj → Basic → Moje makra → (wybierz bibliotekę, może być istniejąca Standard albo możesz utworzyć nową) → Edycja → (wklej kod pobrany z postu @Rafkusa).
Tak zainstalowaną funkcję można będzie wykonywać we wszystkich skoroszytach otwieranych na tym komputerze.
Można też alternatywnie osadzić funkcję w dokumencie skoroszytu zamiast w środowisku użytkownika. Wtedy będzie dostępna po otwarciu na dowolnym komputerze z Calcem, ale uwaga: każdy skoroszyt będzie miał osobną kopię funkcji.
JJ
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Usuwanie duplikatów w jednej komórce Libre
To jest funkcja (makro) zrobione przeze mnie, nie ma jej ani w LO ani w OO.
Powtórzę: o stosowaniu makr w LO i OO przeczytaj to:
https://yestok.pl/ooo/y58.php
Lub nieco skromniejsze opracowanie:
http://przepis-na-lo.pl/2012/12/urucham ... e-makrami/
Powtórzę: o stosowaniu makr w LO i OO przeczytaj to:
https://yestok.pl/ooo/y58.php
Lub nieco skromniejsze opracowanie:
http://przepis-na-lo.pl/2012/12/urucham ... e-makrami/
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Usuwanie duplikatów w jednej komórce Libre
Także poszedłem drogą @Rafkusa. Bo nie ma tu możliwości zbudowania formuł na podstawie wbudowanych funkcji. W swojej funkcji użytkownika najpierw znormalizowałem cały tekst. Chodzi mi o to, aby wszystkie elementy miały taką samą budowę. To znaczy, każdy zaczynał się spacją, a kończył separatorem. Ponieważ nie wiadomo, w jaki sposób dane będą wpisywane, zastosowałem taki sposób normalizacji:
W funkcji można podać dwa separatory. Pierwszy, separator źródła, określa jaki znak jest znakiem separatora w tekście źródłowym. Drugi separator, separator docelowy, określa jaki separator może zostać użyty w tekście wynikowym. Funkcja przyjmuje, że w razie niepodania separatora jest nim przecinek.
Oto treść funkcji:
- Z tekstu zostaną usunięte wszystkie spacje początkowe, końcowe, a wielokrotne spacje wewnątrz tekstu zostaną zastąpione pojedynczą spacją. Takie działanie może wykonać funkcja arkusza kalkulacyjnego TRIM() (USUŃ.ZBĘDNE.SPACJE()) dlatego została wykorzystana w makrze.
- Przed pierwszym opisem została dodana spacja.
- Ponieważ wszystkie wielokrotne spacje są zastąpione spacją pojedynczą to na wszelki wypadek każdy dwuznak "spacja separator" został zastąpiony separatorem. To ma zabezpieczyć sytuację, gdy separator został postawiony po spacji następującej po właściwym opisie.
- Każdy dwuznak "separator spacja" został zastąpiony separatorem. To po to, aby "wyłapać" sytuację gdy nie postawiono spacji po separatorze przed kolejnym opisem w ciągu. Dzięki temu wszystkie opisy są bezpośrednio poprzedzone separatorem.
- Teraz można każdy separator zastąpić sekwencja "separator spacja".
W funkcji można podać dwa separatory. Pierwszy, separator źródła, określa jaki znak jest znakiem separatora w tekście źródłowym. Drugi separator, separator docelowy, określa jaki separator może zostać użyty w tekście wynikowym. Funkcja przyjmuje, że w razie niepodania separatora jest nim przecinek.
Oto treść funkcji:
Kod: Zaznacz cały
Function sort (kom As String, optional seps As String, optional sept As String)
If IsMissing(sept) then sept=","
If IsMissing(seps) or seps=0 then seps=","
if len(kom)=0 then sort="nie ma tekstu" : exit Function 'wiersz dodany podczas edycji
'Znormalizowanie tekstu
oFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
tx= " " & oFA.callFunction( "TRIM", array(kom) )
tx=Replace(tx," " & seps , seps)
Tx=Replace(tx, seps & " ",seps)
tx=Replace(tx,seps, seps & " ")
Dim t()
t=split(tx,seps)
J=1
Do until j=0
j=0
For i=0 to ubound(t)-1
if T(i)>t(i+1) then
zn=t(i) : t(i)=t(i+1) : t(i+1)=zn : j=1
End if
Next
Loop
tx=t(0)
For i=1 to ubound(t)
if t(i)>t(i-1) then tx=tx & sept & t(i)
next
sort=tx
End Function
Ostatnio zmieniony sob sie 07, 2021 10:36 pm przez Jermor, łącznie zmieniany 1 raz.
Powód: Poprawiłem funkcję. Gdy zostanie zastosowana do pustej komórki wystawi tekst "nie ma tekstu"
Powód: Poprawiłem funkcję. Gdy zostanie zastosowana do pustej komórki wystawi tekst "nie ma tekstu"
AOO 4.1.15, LO 25.8 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Re: Usuwanie duplikatów w jednej komórce Libre
Nie napisałem niczego o wywołaniu funkcji:
=SORT(A1;sep źródła;sep docelowy) ilustracja poniżej W innym opracowaniu https://yestok.pl/lbo/y61.php jest wideo, jak dodać swoją funkcję do biblioteki.
=SORT(A1;sep źródła;sep docelowy) ilustracja poniżej W innym opracowaniu https://yestok.pl/lbo/y61.php jest wideo, jak dodać swoją funkcję do biblioteki.
AOO 4.1.15, LO 25.8 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Re: Usuwanie duplikatów w jednej komórce Libre
Drobna uwaga odnośnie makra @Jermora:
Z moich doświadczeń z makrami w środowisku OO wynika, że optymalne parametry makr muszą być typu variant gdyż dla innego typu zmiennej (a konkretniej dla stringa) funkcja IsMissing() zwraca zawsze FALSE.
Z moich doświadczeń z makrami w środowisku OO wynika, że optymalne parametry makr muszą być typu variant gdyż dla innego typu zmiennej (a konkretniej dla stringa) funkcja IsMissing() zwraca zawsze FALSE.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Usuwanie duplikatów w jednej komórce Libre
Sprawdziłem to od razu. Gdy zmiennej nie ma, zwraca True.
AOO 4.1.15, LO 25.8 (x64) na Windows 11 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Re: Usuwanie duplikatów w jednej komórce Libre
Dziękuje za pomoc. Metoda od @Rafkus działa i to jest właśnie to czego szukałem. Za wszystkie inne podpowiedzi też dziękuje, bo wcześniej trzeba było to robić ręcznie.
OpenOffice 3.1