Strona 1 z 1

Łączenie pasujących tekstów - jaka funkcja?

: śr mar 04, 2015 3:23 pm
autor: Czlowiek_w_potrzebie
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ę.

Re: Szukam rozwiązania - jaka funkcja?

: śr mar 04, 2015 10:18 pm
autor: Jan_J
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)

Kod: Zaznacz cały

=IF((A=P); B; "")
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

Kod: Zaznacz cały

=VVJOIN(IF((A=P); B; ""); ",")
(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ą.

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 Function
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ś tak

Kod: Zaznacz cały

select group_concat(jedzenie) from dane where imie = %s
select group_concat(distinct jedzenie) from dane where imie = %s
Funkcja 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.

Re: Szukam rozwiązania - jaka funkcja?

: czw mar 05, 2015 9:40 am
autor: Czlowiek_w_potrzebie
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!

Re: Szukam rozwiązania - jaka funkcja?

: czw mar 05, 2015 5:59 pm
autor: Jan_J
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.
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.
konsolidacja.ods
(9.79 KiB) Pobrany 472 razy
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.

Re: Szukam rozwiązania - jaka funkcja?

: pt mar 06, 2015 10:10 am
autor: Czlowiek_w_potrzebie
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.