Cześć,
mam problem ze znalezieniem odpowiedniej funkcji. Mianowicie chodzi o coś takiego. Mam 2 kolumny w jednej mam imiona osób a w prawej kolumnie owoc, który zjadły. Jeśli ktoś zjadł więcej niż jeden owoc, jego imię pojawia się ponownie w pierwszej kolumnie. Dochodzę do sytuacji kiedy mam np coś takiego:
Adam jabłko
Adam gruszka
Adam arbuz
Powiedzmy, że w drugim arkuszu, chcę użyć funkcji, która w jednej komórce zgromadzi mi przypisane do Adama owoce, chciałbym żeby to wyglądało tak:
Adam jabłko,gruszka,arbuz
Próbowałem użyć funkcji WYSZUKAJ.PIONOWO, ale otrzymywałem tylko jedną pozycję.
Z góry dziękuję.
Łączenie pasujących tekstów - jaka funkcja?
-
Czlowiek_w_potrzebie
- Posty: 3
- Rejestracja: śr mar 04, 2015 3:15 pm
Re: Szukam rozwiązania - jaka funkcja?
Jeżeli jest to poważne zadanie, a nie szkolne ćwiczenie, to podam kilka wskazówek.
Pełne eleganckie (tj. bez użycia dodatkowych obszarów roboczych) rozwiązanie niestety nie jest możliwe, ponieważ funkcja concatenate (złącz.teksty) nie działa w trybie składni wektorowej.
Etap 1: dla danego obiektu przefiltrować wyniki. Tu użyłbym składni wektorowej.
Niech A będzie nazwą obszaru kolumnowego zawierającego pierwsze elementy par.
Podobnie niech B będzie nazwą obszaru zawierającego drugie elementy. W typowym przypadku kolumny te przylegają do siebie. Niech P będzie komórką z wartością z pierwszej kolumny, dla której chcemy stworzyć listę. Formuła wektorowa (ctrl+shift+enter)dokona filtrowania.
Etap 2: połączyć przefiltrowane dane. Na to nie ma gotowca. Przy okazji posobnej dyskusji w https://forum.openoffice.org/en/forum/v ... f=9&t=5438 (rok 2008) jeden z wolontariuszy utworzył funkcję vvjoin. Można by jej użyć dla jednego elementu P(również w składni wektorowej) i powtórzyć to obliczenie dla każdej wartości P, dla której chcemy mieć wynik.
Przed złączeniem należałoby pominąć puste komórki. Oryginalny vvjoin tego nie robi, dlatego załączam niżej wersję zmodyfikowaną.
PS 0. W opisie nie wziąłem pod uwagę usunięcia powtórzeń w drugiej kolumnie.
PS 1. Jeżeli jest możliwość przełożenia obliczeń do systemu bazodanowego, będzie to wyglądać jakoś takFunkcja group_concat nie należy do standardu, istnieje np. w MySQL. Ta druga wersja usuwa duplikaty.
PS 2. Jeżeli jest to szkolne ćwiczenie, poradź sobie na raty wykorzystując dodatkowe kolumny. Unikaj składni tablicowej, dopóki jej nie rozumiesz.
Pełne eleganckie (tj. bez użycia dodatkowych obszarów roboczych) rozwiązanie niestety nie jest możliwe, ponieważ funkcja concatenate (złącz.teksty) nie działa w trybie składni wektorowej.
Etap 1: dla danego obiektu przefiltrować wyniki. Tu użyłbym składni wektorowej.
Niech A będzie nazwą obszaru kolumnowego zawierającego pierwsze elementy par.
Podobnie niech B będzie nazwą obszaru zawierającego drugie elementy. W typowym przypadku kolumny te przylegają do siebie. Niech P będzie komórką z wartością z pierwszej kolumny, dla której chcemy stworzyć listę. Formuła wektorowa (ctrl+shift+enter)
Kod: Zaznacz cały
=IF((A=P); B; "")Etap 2: połączyć przefiltrowane dane. Na to nie ma gotowca. Przy okazji posobnej dyskusji w https://forum.openoffice.org/en/forum/v ... f=9&t=5438 (rok 2008) jeden z wolontariuszy utworzył funkcję vvjoin. Można by jej użyć dla jednego elementu P
Kod: Zaznacz cały
=VVJOIN(IF((A=P); B; ""); ",")Przed złączeniem należałoby pominąć puste komórki. Oryginalny vvjoin tego nie robi, dlatego załączam niżej wersję zmodyfikowaną.
Kod: Zaznacz cały
rem originally from https://forum.openoffice.org/en/forum/viewtopic.php?f=9&t=5438#p25436
rem modified in order to remove void entries
Function VVJOIN(v(), optional sep)
REM join a *v*ertical *v*vector with optional separator (default "")
REM use with TRANSPOSE for horizontal vectors
On Error Goto NullErr
If isMissing(sep) then sep = ""
iLB = lBound(v(), 1)
iUB = uBound(v(), 1)
REM convert from 2D array to flat array:
Dim a(iLB to iUB)
j = iLB
For i = iLB to iUB
If v(i,1) <> "" Then
a(j) = v(i, 1)
j = j+1
endif
next
redim preserve a(iLB to j-1)
VVJOIN = join(a(), sep)
exit function
NullErr:
REM return #VALUE
VVJOIN = Null
End FunctionPS 1. Jeżeli jest możliwość przełożenia obliczeń do systemu bazodanowego, będzie to wyglądać jakoś tak
Kod: Zaznacz cały
select group_concat(jedzenie) from dane where imie = %s
select group_concat(distinct jedzenie) from dane where imie = %s
PS 2. Jeżeli jest to szkolne ćwiczenie, poradź sobie na raty wykorzystując dodatkowe kolumny. Unikaj składni tablicowej, dopóki jej nie rozumiesz.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
-
Czlowiek_w_potrzebie
- Posty: 3
- Rejestracja: śr mar 04, 2015 3:15 pm
Re: Szukam rozwiązania - jaka funkcja?
Oczywiście jest to poważne zadanie, użyte dane miały tylko uprościć pokazanie tego co chcę uzyskać 
Dzięki wielkie za próbę pomocy. Rzeczywiście filtrowanie wyfiltrowuje dokładnie te dane, o które mi chodzi, tylko że z tego co widzę arkusz musi mieć miejsce do stworzenia macierzy("listy") a ja potrzebuję funkcji, która w obrębie jednej komórki wykona wszystkie operacje i tam wyświetli interesujące mnie dane.
Rozumiem w związku z tym, że nie da się tego zrobić w excelu.
Pozdrawiam!
Dzięki wielkie za próbę pomocy. Rzeczywiście filtrowanie wyfiltrowuje dokładnie te dane, o które mi chodzi, tylko że z tego co widzę arkusz musi mieć miejsce do stworzenia macierzy("listy") a ja potrzebuję funkcji, która w obrębie jednej komórki wykona wszystkie operacje i tam wyświetli interesujące mnie dane.
Rozumiem w związku z tym, że nie da się tego zrobić w excelu.
Pozdrawiam!
OpenOffice 4.1 pod WindowsXP
Re: Szukam rozwiązania - jaka funkcja?
Da się. Użyj tablicowej składni formuł, wtedy pośrednie dane zostaną stworzone "w locie", bez konieczności alokacji obszaru w skoroszycie. Tyle tylko, że nie każdą funkcję da się wykorzystać w ten sposób. Np. INDEX ani CONCATENATE nie da się. Stąd potrzeba napisania VVJOIN. Ostatnia z moich formuł, zatwierdzona <Ctrl+Shift+Enter>, rozwiązuje sprawę. Załączam działający przykładzik. Co nie zmienia faktu, że powyższa implementacja nie grzeszy wydajnością. Przegląda n razy cały spis, przy czym każde przeglądanie wymaga późniejszego usunięcia pustych wpisów. Złożoność n x N zamiast N x log n, gdzie n: liczba kategorii grupowania; N: liczba rekordów.Czlowiek_w_potrzebie pisze:[...] arkusz musi mieć miejsce do stworzenia macierzy("listy") a ja potrzebuję funkcji, która w obrębie jednej komórki wykona wszystkie operacje i tam wyświetli interesujące mnie dane.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
-
Czlowiek_w_potrzebie
- Posty: 3
- Rejestracja: śr mar 04, 2015 3:15 pm
Re: Szukam rozwiązania - jaka funkcja?
Dzięki, to jest dokładnie to czego potrzebowałem, tylko mam problemy z zaimplementowaniem tego do swojego arkusza. Wgrałem makro itd. ale wydaje mi się, że problem może leżeć w tym, iż ja to zestawienie robię w arkuszu nr 2, a dane mam w arkuszu nr 1. Postaram się pokombinować, może coś da się zrobić. Jeszcze raz dzięki wielkie!!! Wrocław, pozdrawia Wrocław.
OpenOffice 4.1 pod WindowsXP